[
  {
    "path": ".github/ISSUE_TEMPLATE/1-bug_report.yml",
    "content": "name: 1.21.3+ Bug Report\ndescription: File a bug report\nlabels: [bug]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        For bugs experienced with Minecraft 1.21.3+. Older versions are not supported.\n        If any section does not apply, replace its content with \"N/A\".\n\n        Please search for existing bug reports before making your own report.\n        Duplicate reports will be marked as such and you will be referred to the original report.\n  - type: textarea\n    attributes:\n      label: What's the issue you encountered?\n      description: |\n        Describe the issue in detail and what you were doing beforehand.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: How can the issue be reproduced?\n      description: Include a detailed step by step process for recreating your issue.\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: Logs\n      description: |\n        Logs can be found in your Minecraft directory under `/logs/latest.log`.\n        If your issue caused Minecraft to crash, include the crash report by creating a [gist](https://gist.github.com/) and pasting the link here.\n        If your don't include logs in instances of crash related issues, we will ask you to provide one.\n  - type: input\n    attributes:\n      label: Mod Version\n      description: |\n        Replace ×'s with the mod version you are using.\n        You can find your mod version by checking the ``Mods`` menu on the title screen.\n      placeholder: ×.×.×.×\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Additional information\n      description: |\n        Any other information relevant to your issue."
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2-crash_report.yml",
    "content": "name: 1.21.3+ Crash Report\ndescription: File a crash report\nlabels: [crash]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        For crashes experienced with Minecraft 1.21.3+. Older versions are not supported.\n        If any section does not apply, replace its content with \"N/A\".\n\n        Please search for existing crash reports before making your own report.\n        Duplicate reports will be marked as such and you will be referred to the original report.\n  - type: textarea\n    attributes:\n      label: What's the issue you encountered?\n      description: |\n        Describe the issue in detail and what you were doing beforehand.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: How can the issue be reproduced?\n      description: Include a detailed step by step process for recreating your issue.\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: Logs\n      description: |\n        Logs can be found in your Minecraft directory under `/logs/latest.log`.\n        If your issue caused Minecraft to crash, include the crash report by creating a [gist](https://gist.github.com/) and pasting the link here.\n        If your don't include logs in instances of crash related issues, we will ask you to provide one.\n    validations:\n      required: true\n  - type: input\n    attributes:\n      label: Mod Version\n      description: |\n        Replace ×'s with the mod version you are using.\n        You can find your mod version by checking the ``Mods`` menu on the title screen.\n      placeholder: ×.×.×.×\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Additional information\n      description: |\n        Any other information relevant to your issue."
  },
  {
    "path": ".github/ISSUE_TEMPLATE/3-feature_request.yml",
    "content": "name: 1.21.3+ Feature Request\ndescription: Request a new feature\nlabels: [feature]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Feature requests for Minecraft 1.21.3+. Older versions are not supported.\n        If any section does not apply, replace its contents with \"N/A\".\n        \n        Please search for existing feature requests before you make your own request.\n        Duplicate requests will be marked as such and you will be referred to the original request.\n  - type: markdown\n    attributes:\n      value: \"## What feature are you suggesting?\"\n  - type: textarea\n    attributes:\n      label: Overview\n      description: Provide an overview of the feature being suggested.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Why would this feature be useful?\n      description: |\n        Describe the benefits of implementing this feature.\n    validations:\n      required: true"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Glitchfiend Discord\n    url: https://discord.gg/GyyzU6T\n    about: Please ask general questions here instead of opening issues for them."
  },
  {
    "path": ".github/workflows/gradle-publish.yml",
    "content": "name: Publish\non:\n  workflow_dispatch:\n  push:\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n    steps:\n    - name: \"Checkout\"\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n        fetch-tags: true\n    - name: Set up JDK 21\n      uses: actions/setup-java@v3\n      with:\n        java-version: '21'\n        distribution: 'oracle'\n        server-id: github # Value of the distributionManagement/repository/id field of the pom.xml\n        settings-path: ${{ github.workspace }} # location for the settings.xml file\n    - name: Setup Gradle\n      uses: gradle/gradle-build-action@v2\n    - name: Publish\n      run: ./gradlew publish\n      env:\n        MAVEN_USER: ${{ secrets.MAVEN_USER }}\n        MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}\n        BUILD_NUMBER: ${{ github.run_number }}\n    - name: CurseForge Publish\n      run: ./gradlew curseforge -PcurseApiKey=${CURSE_API_KEY}\n      env:\n        CURSE_API_KEY: ${{ secrets.CURSE_API_KEY }}\n        BUILD_NUMBER: ${{ github.run_number }}\n      continue-on-error: true\n    - name: Modrinth Publish\n      run: ./gradlew modrinth -PmodrinthToken=${MODRINTH_TOKEN}\n      env:\n        MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}\n        BUILD_NUMBER: ${{ github.run_number }}\n      continue-on-error: true\n"
  },
  {
    "path": ".gitignore",
    "content": "# eclipse\nbin\n*.launch\n.settings\n.metadata\n.classpath\n.project\n\n# idea\nout\n*.ipr\n*.iws\n*.iml\n.idea/*\n!.idea/scopes\n\n# gradle\nbuild\n.gradle\n\n# other\neclipse\nrun\nruns"
  },
  {
    "path": "LICENSE",
    "content": "All rights reserved."
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><img src=\"https://i.imgur.com/r0ZlRwr.png\"></p>\n\n**Tough As Nails** is a **Minecraft mod** that adds various features to increase the game's difficulty, including body temperature and thirst.\n\n© 2024 Glitchfiend. All rights reserved.\n"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n    repositories {\n        gradlePluginPortal()\n        maven {\n            name = \"Forge\"\n            url = \"https://maven.minecraftforge.net\"\n        }\n    }\n    dependencies {\n        classpath 'com.modrinth.minotaur:Minotaur:2.+'\n        classpath 'gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:1.1.7' // Required for NeoGradle\n        classpath 'net.minecraftforge:gradleutils:2.2.0' // Required for changelog generation\n    }\n}\n\napply plugin: 'org.jetbrains.gradle.plugin.idea-ext'\napply plugin: 'net.minecraftforge.gradleutils'\n\nchangelog {\n    fromTag '9.2.0'\n}\n\next {\n    mod_version = gradleutils.getTagOffsetVersion()\n    changelog_file = rootProject.file(\"build/changelog.txt\")\n    trimChangelog = (String text) -> {\n        def m = text =~ /(?s) - (?:[0-9.]+) (.+?)(?=( - )|$)/\n        return '```\\n' + m[0][1].replaceAll(/(?m)^ */, '')\n    }\n}\n\nallprojects {\n    // Allow 400 errors.\n    gradle.projectsEvaluated {\n        tasks.withType(JavaCompile) {\n            options.compilerArgs << \"-Xmaxerrs\" << \"400\"\n        }\n    }\n}\n\nsubprojects {\n    apply plugin: 'java'\n    apply plugin: 'idea'\n    apply plugin: 'maven-publish'\n\n    if (!project.name.equals(\"Common\")) {\n        apply plugin: 'com.modrinth.minotaur'\n    }\n\n    version = \"${minecraft_version}-${mod_version}\"\n\n    java.toolchain.languageVersion = JavaLanguageVersion.of(21)\n    java.withSourcesJar()\n\n    jar {\n        manifest {\n            attributes([\n                'Specification-Title'     : mod_name,\n                'Specification-Vendor'    : mod_authors,\n                'Specification-Version'   : mod_version,\n                'Implementation-Title'    : project.name,\n                'Implementation-Version'  : mod_version,\n                'Implementation-Vendor'   : mod_authors,\n                'Implementation-Timestamp': new Date().format(\"yyyy-MM-dd'T'HH:mm:ssZ\"),\n                'Timestamp'               : System.currentTimeMillis(),\n                'Built-On-Java'           : \"${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})\",\n                'Build-On-Minecraft'      : minecraft_version\n            ])\n        }\n    }\n\n    repositories {\n        mavenCentral()\n        maven {\n            name = 'Sponge / Mixin'\n            url = 'https://repo.spongepowered.org/repository/maven-public/'\n        }\n        maven {\n            name = 'Forge'\n            url = \"https://maven.minecraftforge.net\"\n        }\n    }\n\n    tasks.withType(JavaCompile).configureEach {\n        it.options.encoding = 'UTF-8'\n        it.options.release.set(21)\n    }\n\n    processResources {\n        var expandProps = [\n            minecraft_version   : minecraft_version,\n            forge_version       : forge_version, forge_version_range: forge_version_range, forge_loader_version_range: forge_loader_version_range,\n            neoforge_version    : neoforge_version, neoforge_version_range: neoforge_version_range, neoforge_loader_version_range: neoforge_loader_version_range,\n            glitchcore_version  : glitchcore_version, serene_seasons_version: serene_seasons_version,\n            mod_id              : mod_id, mod_name: mod_name, mod_display_name: mod_display_name, mod_version: mod_version,\n            mod_authors         : mod_authors, mod_description: mod_description,\n            mod_issues_url      : mod_issues_url, mod_page_url: mod_page_url, mod_git_url: mod_git_url,\n            mod_discord_url     : mod_discord_url,\n            mod_license         : mod_license\n        ]\n\n        filesMatching(['pack.mcmeta', 'fabric.mod.json', 'META-INF/mods.toml', 'META-INF/neoforge.mods.toml', \"*.mixins.json\"]) {\n            expand expandProps\n        }\n        inputs.properties(expandProps)\n    }\n\n    // Disables Gradle's custom module metadata from being published to maven. The\n    // metadata includes mapped dependencies which are not reasonably consumable by\n    // other mod developers.\n    tasks.withType(GenerateModuleMetadata) {\n        enabled = false\n    }\n\n    afterEvaluate {\n        // Share Modrinth configuration between loaders\n        // Unfortunately the CurseForge plugin breaks when doing this\n        // remapJar does not exist until after initial evaluation\n        if (!name.equals(\"Common\")) {\n            modrinth {\n                token = findProperty('modrinthToken')\n                projectId = mod_modrinth_id\n                versionNumber = mod_version\n                versionName = \"${mod_version} for ${name} ${minecraft_version}\"\n                versionType = release_channel\n                uploadFile = name.equals(\"Fabric\") ? remapJar : jar\n                gameVersions = [minecraft_version]\n                loaders = [name.toLowerCase()]\n                dependencies {\n                    if (name.equals(\"Fabric\")) {\n                        required.project \"fabric-api\"\n                    }\n                    required.project \"glitchcore\"\n                }\n\n                if (changelog_file.exists()) {\n                    changelog = trimChangelog(changelog_file.text)\n                }\n            }\n        }\n\n        // archivesBaseName is not set until after initial evaluation\n        publishing {\n            publications {\n                mavenJava(MavenPublication) {\n                    artifactId project.archivesBaseName\n                    groupId project.group\n                    version project.version\n                    from components.java\n\n                    pom {\n                        name = project.archivesBaseName\n                        description = project.mod_description\n                        url = project.mod_git_url\n                        scm {\n                            url = project.mod_git_url\n                            connection = project.mod_scm_url\n                            developerConnection = project.mod_scm_url\n                        }\n                        issueManagement {\n                            system = 'github'\n                            url = project.mod_issues_url\n                        }\n                        licenses {\n                            license {\n                                name = project.mod_license\n                            }\n                        }\n                        developers {\n                            developer {\n                                id = 'adubbz'\n                                name = 'Adubbz'\n                            }\n                            developer {\n                                id = 'forstride'\n                                name = 'Forstride'\n                            }\n                        }\n                        withXml {\n                            NodeList dependencies = asNode().dependencies\n                            NodeList allDeps = dependencies.'*'\n\n                            // Remove forge deps\n                            allDeps.<Node> findAll() { Node el ->\n                                el.artifactId.text() == 'forge' && el.groupId.text() == 'net.minecraftforge'\n                            }.forEach() { Node el ->\n                                el.parent().remove(el)\n                            }\n                            // Remove ForgeGradle's mapped suffix from versions & set as optional so anyone else doesn't inherit them\n                            allDeps.<Node> findAll() { Node el ->\n                                el.version.text().contains('_mapped_')\n                            }.each { Node el ->\n                                el.version.each { Node version ->\n                                    def versionText = version.text()\n                                    version.setValue(versionText.substring(0, versionText.indexOf('_mapped_')))\n                                }\n                                el.appendNode('optional', true)\n                            }\n                        }\n                    }\n                }\n            }\n            repositories {\n                maven {\n                    url = \"https://maven.minecraftforge.net/releases/\"\n                    credentials {\n                        username = System.getenv(\"MAVEN_USER\")\n                        password = System.getenv(\"MAVEN_PASSWORD\")\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "common/build.gradle",
    "content": "plugins {\n    id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT'\n}\n\nbase.archivesName.set(\"${mod_name}-common\")\n\nminecraft {\n    version(minecraft_version)\n    if (file(\"src/main/resources/${mod_id}.accesswidener\").exists()) {\n        accessWideners(project.file(\"src/main/resources/${mod_id}.accesswidener\"))\n    }\n}\n\nsourceSets.main.resources.srcDir 'src/generated/resources'\n\ndependencies {\n    compileOnly group:'org.spongepowered', name: 'mixin', version: '0.8.5'\n    compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'\n    compileOnly(\"com.electronwill.night-config:toml:${nightconfig_version}\")\n    compileOnly(\"com.electronwill.night-config:core:${nightconfig_version}\")\n    compileOnly(\"net.jodah:typetools:0.6.3\")\n    compileOnly 'com.github.glitchfiend:GlitchCore-common:' + minecraft_version + '-' + glitchcore_version\n    compileOnly 'com.github.glitchfiend:SereneSeasons-common:' + minecraft_version + '-' + serene_seasons_version\n}\n"
  },
  {
    "path": "common/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3484912\tRegistries\n55b6780cec82f4d4f609e750902d114649d4a8ad data/toughasnails/damage_type/hyperthermia.json\neae6d7bc6de6b808206268351a4eb97746f013bf data/toughasnails/damage_type/thirst.json\n0b83414be2d208b5f29e5575e1b11fe45ee59319 data/toughasnails/enchantment/thermal_tuning.json\n776078f24c4c010fd0186baa0a3b13d7cef2ac12 data/toughasnails/enchantment/water_cleansing.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/1edd1aa8a5f5209e40be6ce639ab3fdd92079a0c",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3534926\tTags for minecraft:enchantment mod id vanilla\n0ef1512d105fb2b8c0f389b6cc5fffd07ba5c820 data/minecraft/tags/enchantment/on_random_loot.json\n0ef1512d105fb2b8c0f389b6cc5fffd07ba5c820 data/minecraft/tags/enchantment/tradeable.json\n0ef1512d105fb2b8c0f389b6cc5fffd07ba5c820 data/minecraft/tags/enchantment/treasure.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/20dae170dba4c8eb919766d5be31700d182da0d9",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3449906\tTags for minecraft:worldgen/biome mod id toughasnails\n2b52a1f084a28479a2e448b5ca6be229c52b6aa9 data/toughasnails/tags/worldgen/biome/cold_biomes.json\n92158999e9537d3b7c9cd1a65cc1aa65bf673c2d data/toughasnails/tags/worldgen/biome/dirty_water_biomes.json\n8548cd9e18e161a303323283cb2c7ab2f2ff2cb0 data/toughasnails/tags/worldgen/biome/hot_biomes.json\n775e0f72e6757e7740bc9110927f01e0fc675071 data/toughasnails/tags/worldgen/biome/icy_biomes.json\n9128966f06f646c3a8f85e09692e7ce97009d009 data/toughasnails/tags/worldgen/biome/neutral_biomes.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/worldgen/biome/purified_water_biomes.json\n92b547e23992c4f327b30052a1b36aab5b36d767 data/toughasnails/tags/worldgen/biome/warm_biomes.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/237ed1d533e00e9b8d8148d6061ae61b82e960bb",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3419832\tTags for minecraft:trim_material mod id toughasnails\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/trim_material/cooling_trims.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/trim_material/heating_trims.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/4ff5308374b2e7729a466dfe56bd6182ead9b2c3",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3524921\tTags for minecraft:point_of_interest_type mod id toughasnails\n7ccb22b62459a1c793d38a6fafc772b5d19837e0 data/minecraft/tags/point_of_interest_type/acquirable_job_site.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3479918\tLoot Tables\n8fca2e50f9df3893ec7ecb84fb15e5f83b33508a data/toughasnails/loot_table/blocks/rain_collector.json\n5b982875ef4148c8acb507e82e690b7ffd814749 data/toughasnails/loot_table/blocks/temperature_gauge.json\n3014cc41e7b43922f50ec3eb6c2eb83fbf3201d2 data/toughasnails/loot_table/blocks/thermoregulator.json\n1410cb58946442b13107a7153298bdcdc8ccaacc data/toughasnails/loot_table/blocks/water_purifier.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/77038cb024c5999ce280bcb6800e72cf1c655fe7",
    "content": "// 1.21.11\t2025-12-28T21:06:11.1499569\tModel Definitions\na46a7ed55fa00f2a5e8e739fed5ceb555c7c8502 assets/toughasnails/items/apple_juice.json\nc591889fd14596775b2f5d363c1417e6dbbddf2a assets/toughasnails/items/cactus_juice.json\n8d13e160ccdd855380e2758d9a511f4727663ed1 assets/toughasnails/items/charc_os.json\n84955afd1ea6b6f48c025abba670b53e52223060 assets/toughasnails/items/chorus_fruit_juice.json\n2713827de5b432976b69b3cd358233687f3e14aa assets/toughasnails/items/copper_dirty_water_canteen.json\n874d400e8449c5fba00d6e16796a830c867bda9b assets/toughasnails/items/copper_purified_water_canteen.json\n4a2aef09261145a699342a6094bbd7dbaf08fb93 assets/toughasnails/items/copper_water_canteen.json\n54a470976016ff0539c943d2096f2382be41936c assets/toughasnails/items/diamond_dirty_water_canteen.json\n8b83f236433628746586751edd0ae607eb32d791 assets/toughasnails/items/diamond_purified_water_canteen.json\nc333133047921cac899a9fcd0834945659749614 assets/toughasnails/items/diamond_water_canteen.json\n73d47530a0d37f0789b4a865364e21245f1c94cb assets/toughasnails/items/dirty_water_bottle.json\na9f1890a5115d346e99f62e861c7ede940e54fb0 assets/toughasnails/items/empty_copper_canteen.json\ne169a03f53a1496b79b06da7df487720ed8759ea assets/toughasnails/items/empty_diamond_canteen.json\n3ad34e22529cf475a2f87e5753d136bc92b8ca70 assets/toughasnails/items/empty_gold_canteen.json\nc394973b72ff60388de38c34182362c534d36bd6 assets/toughasnails/items/empty_iron_canteen.json\n85edb0a4bb82b3bd6ad730ba1fbcbbbcf6db56a9 assets/toughasnails/items/empty_leather_canteen.json\n416d63c13bf7bcd673120ca1a1ac71314b268d1d assets/toughasnails/items/empty_netherite_canteen.json\n789027711fe954b1d6ebaa6477ba484c73d1dc97 assets/toughasnails/items/glow_berry_juice.json\n4e53af0490601d02e19b636a3c694c2b98dbe317 assets/toughasnails/items/gold_dirty_water_canteen.json\nbfabd47c2329716e02db1936ab81a61f809218e2 assets/toughasnails/items/gold_purified_water_canteen.json\n365fce211285945360ee966d257ce210af3b2bf6 assets/toughasnails/items/gold_water_canteen.json\ndf126ef457d525c87a5a6d8c365deff420a07463 assets/toughasnails/items/ice_cream.json\nca2449c2b116ebecf70f32faeb2f9f866831a97e assets/toughasnails/items/iron_dirty_water_canteen.json\n80c210194ebf33db20c3df4858ed883d59cd028b assets/toughasnails/items/iron_purified_water_canteen.json\n09407f691faa92ff02285e563ca1b643c1382b4e assets/toughasnails/items/iron_water_canteen.json\n304856f0fef764aa6e00ef0be3cee7b60467bf55 assets/toughasnails/items/leaf_boots.json\na20a8c97813fd4c11ba7ce0163f12c65115aba88 assets/toughasnails/items/leaf_chestplate.json\nc6c397ce69818106e2ffd53cfab511d732f3f3f8 assets/toughasnails/items/leaf_helmet.json\ne3c02088c70737e0581a68cb08700c2ca9f1ccfa assets/toughasnails/items/leaf_leggings.json\n4777163e047e6d9bedd3d432302e0ddac13ef1a7 assets/toughasnails/items/leather_dirty_water_canteen.json\n97fdbc2ade0feac8b34de3f1a4c11298e3b482c5 assets/toughasnails/items/leather_purified_water_canteen.json\nc3a1ceb48d2519bbe384999c4d8ae110a2745c6d assets/toughasnails/items/leather_water_canteen.json\naf39586b7b8cde34445b4228e60ac1f93cd614f5 assets/toughasnails/items/melon_juice.json\nfb1454eaf50592a87f7d80aa308252d13045149e assets/toughasnails/items/netherite_dirty_water_canteen.json\n1e571d8d117827974a82cf33433e85e92f9e2dbf assets/toughasnails/items/netherite_purified_water_canteen.json\n0098213afce11f42384f7f6be6166ec8785aec70 assets/toughasnails/items/netherite_water_canteen.json\n743d52b9771291c5cab2360c793c504ad0d685f2 assets/toughasnails/items/pumpkin_juice.json\nca4bbef609fcac533228c6fb7cbec3ebb16f2832 assets/toughasnails/items/purified_water_bottle.json\n57d254270b20dbbcba6fed8e6dd042182cc4121f assets/toughasnails/items/rain_collector.json\n24a62f4383a28cd81b355ede24124f96f0a495fb assets/toughasnails/items/sweet_berry_juice.json\n83604432a420cf2b813bfb1e41dd90257d1c2cf1 assets/toughasnails/items/tan_icon.json\n748ab730c9622fef6624caa632939b6787e87321 assets/toughasnails/items/temperature_gauge.json\n0bec0e66c111212fb2674c9ec7be38d0099f615b assets/toughasnails/items/thermometer.json\n173f3c94c0ce5e45d6390bfe3b5e272d5161df81 assets/toughasnails/items/thermoregulator.json\ndc76830866633f9afa704ec99fb65ba3c804d3e4 assets/toughasnails/items/water_purifier.json\n99a5b5f52946e054be85477e9aa6a28c1d598991 assets/toughasnails/items/wool_boots.json\n9bac72f2d86a0766bd571c20a27dba85f86f9870 assets/toughasnails/items/wool_chestplate.json\n52f118bacf86016d30fab23fd88c48c3de1c3032 assets/toughasnails/items/wool_helmet.json\nd3edd21cbe8d3bc6186269ffaa4132ad1b8d5cc9 assets/toughasnails/items/wool_leggings.json\nfbb3928956c38cd4f6dfaaf5092047123f8c76ff assets/toughasnails/models/item/apple_juice.json\naac7597ce5ef5a4367bbcf0830bdf1d7d7573299 assets/toughasnails/models/item/cactus_juice.json\na6231c29ef436d8c7bd574d5a51b3d306d1f0d68 assets/toughasnails/models/item/charc_os.json\n772a9bd1b7c39e6957fea6c02c8cf8aff24ed87e assets/toughasnails/models/item/chorus_fruit_juice.json\nda651f690598888fa5c4dec9861844ba87731a0c assets/toughasnails/models/item/copper_dirty_water_canteen.json\nba24df3f5de607e9417343e9bbe4ce5b3a9d5bd8 assets/toughasnails/models/item/copper_purified_water_canteen.json\nd1d7215bd676f8267e10559ef1a62153fdfc77c8 assets/toughasnails/models/item/copper_water_canteen.json\n4c397fc95b7424b35c08c8a88d495b92fbe40bbb assets/toughasnails/models/item/diamond_dirty_water_canteen.json\n0f803ad10c5c413c5f68e0be556011064b36cd22 assets/toughasnails/models/item/diamond_purified_water_canteen.json\nde912d9d0ac5127a236a2905b5670397a50beb1b assets/toughasnails/models/item/diamond_water_canteen.json\ncfd0134395f237e4ddcfeb4011778f2cc3974b5d assets/toughasnails/models/item/dirty_water_bottle.json\nd02f8c4cf872aa0a3f6324569d24029eb121f5e9 assets/toughasnails/models/item/empty_copper_canteen.json\n2b9d74b0141910fd8a5fe559589f5dfbbff1b50e assets/toughasnails/models/item/empty_diamond_canteen.json\na368bb2246c60e7ee24050262f1037ff48c15955 assets/toughasnails/models/item/empty_gold_canteen.json\n622d385b35248843b51514cf802b47b11612cd56 assets/toughasnails/models/item/empty_iron_canteen.json\ned2d3569d7c3f6e75e6d65512a1758407b87e0e1 assets/toughasnails/models/item/empty_leather_canteen.json\n19321f614a82577909e3493d661643c605ea7a64 assets/toughasnails/models/item/empty_netherite_canteen.json\nfff3625b65a04e925e5a9865a75ead3a4e2e2fa0 assets/toughasnails/models/item/glow_berry_juice.json\n1d916fa543d103bf60d801abdccfd7160e1de580 assets/toughasnails/models/item/gold_dirty_water_canteen.json\nc377c2c570d0495860676846356313e936b07756 assets/toughasnails/models/item/gold_purified_water_canteen.json\nb0d8c49c046ebeca6d152ff24447492768350dba assets/toughasnails/models/item/gold_water_canteen.json\n25bf02c23652396ecf977e2591c0f1a2c2817ff9 assets/toughasnails/models/item/ice_cream.json\n017e043f1ebf570f435f69a422bc4290e0e5c775 assets/toughasnails/models/item/iron_dirty_water_canteen.json\n721f73aebf8120e01e48460bb2ccf1be5075ac74 assets/toughasnails/models/item/iron_purified_water_canteen.json\nb00f98e717644b19aaf4539bca340a4d8022dedb assets/toughasnails/models/item/iron_water_canteen.json\na6ec6a0e5205ffd5e5de4010b353822eaac2370e assets/toughasnails/models/item/leaf_boots.json\nad8f22de0b62eeda1deabc1069cd80944ef8455b assets/toughasnails/models/item/leaf_boots_amethyst_trim.json\n348a4ee8a5bde6da1cd071773cfa4c6ffa45dceb assets/toughasnails/models/item/leaf_boots_copper_trim.json\n39fca9edaf3c47fad93dd2772eb2c195324d399c assets/toughasnails/models/item/leaf_boots_diamond_trim.json\n334bb38c15a6c14ca7183e1c995e24a2cbc4fba9 assets/toughasnails/models/item/leaf_boots_emerald_trim.json\n9f4b16775ef245a2d834a4208f2bb38e034cc5fa assets/toughasnails/models/item/leaf_boots_gold_trim.json\nf37d0673e820c65b4c277d04cf033767f2cb33a6 assets/toughasnails/models/item/leaf_boots_iron_trim.json\nc1268e927f0089bcecf65ec3d9f94ab4449fe158 assets/toughasnails/models/item/leaf_boots_lapis_trim.json\n3f01a4d0bfd054727e628cf6fc974444fd9c4b14 assets/toughasnails/models/item/leaf_boots_netherite_trim.json\n4318dd4eff0ae258d5f3797ee3b10f853755eba5 assets/toughasnails/models/item/leaf_boots_quartz_trim.json\n316417000cd96df6db6cd780e0a98de660ed8068 assets/toughasnails/models/item/leaf_boots_redstone_trim.json\n1151488035fdfbca30334c84af476f791a66cc16 assets/toughasnails/models/item/leaf_boots_resin_trim.json\nf31d13df0441fa68f035b5e44f5acb52ec12cc43 assets/toughasnails/models/item/leaf_chestplate.json\n8d850c71367a8fa6c46276d445c526ae2675545e assets/toughasnails/models/item/leaf_chestplate_amethyst_trim.json\n5172ce521cc7c732c66e1c21fbf2a3cd9c1039cc assets/toughasnails/models/item/leaf_chestplate_copper_trim.json\ne23474ac60b809a0f6b78f4d93e337dea51b4d8c assets/toughasnails/models/item/leaf_chestplate_diamond_trim.json\nd1ce5e4d0bbd6599012235bd2b385cea29503c39 assets/toughasnails/models/item/leaf_chestplate_emerald_trim.json\nddf3b752b86b7a4b560394bdbdbc874d7e57dfb5 assets/toughasnails/models/item/leaf_chestplate_gold_trim.json\n8b3bc12bc45f7d2d0ad167290052b16688ab003d assets/toughasnails/models/item/leaf_chestplate_iron_trim.json\nb4b2db65b491dfaa7740a5c702db58141d1f2cbc assets/toughasnails/models/item/leaf_chestplate_lapis_trim.json\nfe99a23c3754618afd2e7671940887b68f0d7ba3 assets/toughasnails/models/item/leaf_chestplate_netherite_trim.json\n8a217d89061fc2a46ec1e34584f6fc530f018495 assets/toughasnails/models/item/leaf_chestplate_quartz_trim.json\nb68cc189af5de8df65632a3b8498afdb9033a317 assets/toughasnails/models/item/leaf_chestplate_redstone_trim.json\n3abfecdda82b6d6e02c5aa71f1fac93f6e88f1d5 assets/toughasnails/models/item/leaf_chestplate_resin_trim.json\n260a753ef2397cbfcfe2be687e9d3d9531b67b83 assets/toughasnails/models/item/leaf_helmet.json\n29a2194b01e73fe20c7d3f40a74ceb10cb02b896 assets/toughasnails/models/item/leaf_helmet_amethyst_trim.json\n2d821aed3149962ce3212a29f47e6989f9db49d7 assets/toughasnails/models/item/leaf_helmet_copper_trim.json\n682817ea56cb9be67b28b8a9fccd701fe8a6e19d assets/toughasnails/models/item/leaf_helmet_diamond_trim.json\n2989f8b286781717b929d47b11f1441545cfe3b4 assets/toughasnails/models/item/leaf_helmet_emerald_trim.json\nfac76a804a963c476c20889f3ec6e408257c51b2 assets/toughasnails/models/item/leaf_helmet_gold_trim.json\n147c8aa6b36c8e11d47fb755bc87683467439179 assets/toughasnails/models/item/leaf_helmet_iron_trim.json\nad0d1f8eb1da3718a34b66765e876285e4643b70 assets/toughasnails/models/item/leaf_helmet_lapis_trim.json\n917e9f9267a7843678f62244d7bebc391464932f assets/toughasnails/models/item/leaf_helmet_netherite_trim.json\n793b1fba3c6a0f386660ad7647d348cb32f6eb84 assets/toughasnails/models/item/leaf_helmet_quartz_trim.json\n5fb18c32856c2344802e2d35f56ec059fb466ba1 assets/toughasnails/models/item/leaf_helmet_redstone_trim.json\n5cbc37182f2ad76d7bc5ddbb614273b96d97dd84 assets/toughasnails/models/item/leaf_helmet_resin_trim.json\ndb5518ccec85c37db8b2c97d1713d1b9a28e0b4c assets/toughasnails/models/item/leaf_leggings.json\n0f56b3f25ce691129af0cc428ae302568edd97ad assets/toughasnails/models/item/leaf_leggings_amethyst_trim.json\n186d7599f1fc27e89fe14241cf29bc9ea33fccaa assets/toughasnails/models/item/leaf_leggings_copper_trim.json\n29129d5b2781d88855f89389e73f1ce97d3aa0be assets/toughasnails/models/item/leaf_leggings_diamond_trim.json\n0fe1f198a135e3dcb9e624677cf8bb0f71f543eb assets/toughasnails/models/item/leaf_leggings_emerald_trim.json\n5875fc49ae3a988f99c258fcf4e01ddb2e3a13a8 assets/toughasnails/models/item/leaf_leggings_gold_trim.json\n76c4ae533c9a420cf61ef9e7d2d385cf00b8d6a5 assets/toughasnails/models/item/leaf_leggings_iron_trim.json\n8074ffe9509c4592cb3080cd40ed3f8ab5a6fde8 assets/toughasnails/models/item/leaf_leggings_lapis_trim.json\n7624eca624835ea89ce37a30277cb0457a0e6944 assets/toughasnails/models/item/leaf_leggings_netherite_trim.json\nff42c39f4d2602a397610f2ec87d64d3b7739741 assets/toughasnails/models/item/leaf_leggings_quartz_trim.json\na86d317549a09cd4a906a896da1d1f8da0ba6db3 assets/toughasnails/models/item/leaf_leggings_redstone_trim.json\nbcce3e10337d82938288a099788a0b6770540674 assets/toughasnails/models/item/leaf_leggings_resin_trim.json\n0dfe5962b380ecf81c76a32c003fc40d2d558394 assets/toughasnails/models/item/leather_dirty_water_canteen.json\n3cc2430a4925db4b0b8be8aafb39a9d28112f253 assets/toughasnails/models/item/leather_purified_water_canteen.json\n41659224602b677c75f404edab10bfb67115b9f9 assets/toughasnails/models/item/leather_water_canteen.json\n4a326df9cef778cbbe5da99431ae3c3e0973cb88 assets/toughasnails/models/item/melon_juice.json\nf687e95afe50c05d5e469a19c8134ade3b3e5574 assets/toughasnails/models/item/netherite_dirty_water_canteen.json\ne0379f9024f6a77d4183b249082f8eaef4ff5e60 assets/toughasnails/models/item/netherite_purified_water_canteen.json\n6e0abd17fee6bfdd17ff588621e5acd5dfc95bf7 assets/toughasnails/models/item/netherite_water_canteen.json\nf38f99fd48ebf8c98d12c47d4974678a20b3739c assets/toughasnails/models/item/pumpkin_juice.json\nb2af0a87766e5af5e6eefbf43e7f4248a79ef579 assets/toughasnails/models/item/purified_water_bottle.json\nfec75c479c98f911a97f4bddc74ffaddd4f7e7ed assets/toughasnails/models/item/sweet_berry_juice.json\n29222617ef6336b350d04425ec94c4ab59ee761e assets/toughasnails/models/item/tan_icon.json\n0fbb3edc334b05d5f3657d01ad0444da28d830ec assets/toughasnails/models/item/thermometer_00.json\nf90715b0138223634226f703377c9210440ebba4 assets/toughasnails/models/item/thermometer_01.json\n440c2d22c0b439446b29607c91a0f59c109a2ac9 assets/toughasnails/models/item/thermometer_02.json\n2907ac0ae691401c03c0ca68d12a9957a001acdb assets/toughasnails/models/item/thermometer_03.json\nc52014a435b97758257ab34348feb7ff1e84ae40 assets/toughasnails/models/item/thermometer_04.json\n95e6ab7ba41753eb89e2b6734b3f65f67a516fea assets/toughasnails/models/item/thermometer_05.json\n6f9f7308638335f6d22deed54f58af41d80d57ac assets/toughasnails/models/item/thermometer_06.json\n650c231de872dafeefafe2178f68bbf11db28577 assets/toughasnails/models/item/thermometer_07.json\n17be302c23083a79a0737442f263d8a90ba9a082 assets/toughasnails/models/item/thermometer_08.json\n2f20e8f45b4bbffe275eb3cf833adc221afc27b7 assets/toughasnails/models/item/thermometer_09.json\n78599b8e101dce74c1a8b35fa0f329493e0b2500 assets/toughasnails/models/item/thermometer_10.json\ndd8bfe31c24513ada71c632b77b9ece6d1c59c1a assets/toughasnails/models/item/thermometer_11.json\naa47031765274df8d84141ce6ee6723a4d0d0152 assets/toughasnails/models/item/thermometer_12.json\n717bda823c19584c4d1f0d4e6ad8776d3ca0dada assets/toughasnails/models/item/thermometer_13.json\n3e152a20f652e3ae96905168bc5fdb9cc38e4c58 assets/toughasnails/models/item/thermometer_14.json\n678f08f1c7738e468f663117f0c3e7ee736c7fe3 assets/toughasnails/models/item/thermometer_15.json\nf330be7df4b6985d0c83fd154ad528cc1eeee767 assets/toughasnails/models/item/thermometer_16.json\n62e6066b57cdaafc3c70c415cf98e3f9387d2a43 assets/toughasnails/models/item/thermometer_17.json\na90d31153bbc8e7d36dcb024c10e4c0a2b27e7bf assets/toughasnails/models/item/thermometer_18.json\n0f27a70b4dddfcf0598b74f6f02b86be202ca464 assets/toughasnails/models/item/thermometer_19.json\ne0508d7e82ef472eff6f73f7a8a92a54094cbd41 assets/toughasnails/models/item/thermometer_20.json\n40cdbc19e3166a9ce090dd41416f087b71148597 assets/toughasnails/models/item/wool_boots.json\n0ae799bf1bec71d090b0a9bbd320e713ade840ff assets/toughasnails/models/item/wool_boots_amethyst_trim.json\nf0741eeba8213a03810bf5a87bd6b68c1d3a7dc2 assets/toughasnails/models/item/wool_boots_copper_trim.json\n7011ac4d0480e11bfb543ce9db67252093e2d82b assets/toughasnails/models/item/wool_boots_diamond_trim.json\ne0783866a99e6765eb9b18c07a56cf20f442ded1 assets/toughasnails/models/item/wool_boots_emerald_trim.json\n7c86c39e3d91212722cf94a66fec2b835d422280 assets/toughasnails/models/item/wool_boots_gold_trim.json\nface03b7f6b9a53fbcdc802ec75d6f115278ca90 assets/toughasnails/models/item/wool_boots_iron_trim.json\n0a0d2c7cc9115e4cb1589ddd25f8b31eafacb452 assets/toughasnails/models/item/wool_boots_lapis_trim.json\n23f8908cd78cfba1a0aa5874a8751815f9f7dd64 assets/toughasnails/models/item/wool_boots_netherite_trim.json\n288229c5f22ad8a10f6b50812aeb43696b08dad3 assets/toughasnails/models/item/wool_boots_quartz_trim.json\n4993a8628fdc2c68ae8ed7e7b76365b44dd7f0a2 assets/toughasnails/models/item/wool_boots_redstone_trim.json\ndc900450cae37f2765b57389a14202a8b67d2b2e assets/toughasnails/models/item/wool_boots_resin_trim.json\na724b0810b1132118c88468abff22eb0f817285a assets/toughasnails/models/item/wool_chestplate.json\n554e54b0437e75ef5d8a44d3c668ccb959806739 assets/toughasnails/models/item/wool_chestplate_amethyst_trim.json\n1b28bdcabf970b3bcc78d128cc32657ad90e567d assets/toughasnails/models/item/wool_chestplate_copper_trim.json\n0bfd385ff2cd5b8d9420573fad03715e1846434a assets/toughasnails/models/item/wool_chestplate_diamond_trim.json\n172e7f3646db33d87aed40cb05d1c8a9f63b74af assets/toughasnails/models/item/wool_chestplate_emerald_trim.json\n6c700e699ac4a913c676360fe03de665f100e062 assets/toughasnails/models/item/wool_chestplate_gold_trim.json\n0623f9a2d6168d9a21544298657945823ccf836a assets/toughasnails/models/item/wool_chestplate_iron_trim.json\ndb827b6f0297b731ba22a088b26ae7ed2eb4e5e4 assets/toughasnails/models/item/wool_chestplate_lapis_trim.json\n85345ecf3302637502b1b2d7b60469adb64b05e7 assets/toughasnails/models/item/wool_chestplate_netherite_trim.json\n3615b6087f37f9c515ebe65fc0f51ba616be5705 assets/toughasnails/models/item/wool_chestplate_quartz_trim.json\n802466fba61809ab725e7885a3594a37c5166e17 assets/toughasnails/models/item/wool_chestplate_redstone_trim.json\neb807ec653cedad522b37a720d8716d85d9bd097 assets/toughasnails/models/item/wool_chestplate_resin_trim.json\n07e5d211adecce95e10350d44bcc097485bb5faa assets/toughasnails/models/item/wool_helmet.json\n13e3dd842af67fff170942a7d0817d371d6e7327 assets/toughasnails/models/item/wool_helmet_amethyst_trim.json\n63d169526543fffd1ef77e1d2fe45358e38e266d assets/toughasnails/models/item/wool_helmet_copper_trim.json\n5d4ab99f37bf8c41c5ed120243902f7e3d894d14 assets/toughasnails/models/item/wool_helmet_diamond_trim.json\n829e496d0d78cacf2fc4e02a106d90e7b1a91a65 assets/toughasnails/models/item/wool_helmet_emerald_trim.json\n8f80d6cd6160d203bbbaf150c75b6ad227e92d24 assets/toughasnails/models/item/wool_helmet_gold_trim.json\n8e3ecfa0a793f3d76a5d7c26d5ac6459af8c0400 assets/toughasnails/models/item/wool_helmet_iron_trim.json\nf93903d5536ba686c276035a281dcfd3709569a4 assets/toughasnails/models/item/wool_helmet_lapis_trim.json\n806d81ba18de15120438b4bbeccf8e102b0b0708 assets/toughasnails/models/item/wool_helmet_netherite_trim.json\nb710a8c6d3738520e40e119abaea30f0712b8559 assets/toughasnails/models/item/wool_helmet_quartz_trim.json\nfc12ec2f31552b7d6fbad169bb0092b8f6e075c6 assets/toughasnails/models/item/wool_helmet_redstone_trim.json\n2bf4d3744d9c37fab301c531b2069e9b0610d567 assets/toughasnails/models/item/wool_helmet_resin_trim.json\n32090a0205fe2301c369b7ce97bac6e4e50eae81 assets/toughasnails/models/item/wool_leggings.json\n8382d868b6c6ec556c3e5f31d48a0c1a5be2fbe5 assets/toughasnails/models/item/wool_leggings_amethyst_trim.json\n8d999351fc0b9558795f26c5203037f274e53a56 assets/toughasnails/models/item/wool_leggings_copper_trim.json\ncbfc0b586c9fea54d4b6dc65aa90ecf914ee3236 assets/toughasnails/models/item/wool_leggings_diamond_trim.json\nba67a7202fb4b4552d46295faba4f861eb4ee41a assets/toughasnails/models/item/wool_leggings_emerald_trim.json\nd6f44cabad027e1cee881d44f6aa1c3db88ae74f assets/toughasnails/models/item/wool_leggings_gold_trim.json\n04920743e4c5b2ecdbb4e64ba10622c28f2b53ea assets/toughasnails/models/item/wool_leggings_iron_trim.json\n76af0d4749e8f592a1fc3b6c0f11dd6f704d468d assets/toughasnails/models/item/wool_leggings_lapis_trim.json\n060a61be7409a2170bcfd8f17c7827da0f9d3efa assets/toughasnails/models/item/wool_leggings_netherite_trim.json\n2f93d4eeac9582b4ad80d58efd82651537c79b66 assets/toughasnails/models/item/wool_leggings_quartz_trim.json\n277de1982c3349ef9a7324baac887a971615b413 assets/toughasnails/models/item/wool_leggings_redstone_trim.json\n63d815886a81ffbbdfb731c6fafaf04d1eddb140 assets/toughasnails/models/item/wool_leggings_resin_trim.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/9dc2e1bbb6dbc88d629e62ed955e4c156b6652a3",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3519919\tTags for minecraft:item mod id toughasnails\n54fbb602df8fe763300ee759cb3a9fbb72ded2eb data/minecraft/tags/item/dyeable.json\nf05342856fe99891fa5e94bbe8db82a4f75ac41e data/toughasnails/tags/item/cooling_armor.json\n572f6d0748095755aeef0ca7d602f4ebba9bfd76 data/toughasnails/tags/item/cooling_consumed_items.json\n7c304628a9c17ca3ba6cd13e199fcf73ad9c974f data/toughasnails/tags/item/cooling_held_items.json\nd7e37bc0c1468593bf2403c8bab7e97c17edde8e data/toughasnails/tags/item/drinks.json\n2128c434dd823a25c4cb1370f7d09fdbff2e89d8 data/toughasnails/tags/item/enchantable/canteen.json\neb101cb126ebd917a2c240ff53e1e6e16ba3bf83 data/toughasnails/tags/item/heating_armor.json\ncf863878a8af4a7e610b91efb2c1d7846d13868b data/toughasnails/tags/item/heating_consumed_items.json\nefe9e0caf089100a228c46379f3aa70d7f602ddc data/toughasnails/tags/item/heating_held_items.json\nd7b753d45aecdc84f69d294a00dc5271088c2abc data/toughasnails/tags/item/hydration/100_hydration_drinks.json\n01720430f7a548fffd9ef59e9e7037fff02e6da3 data/toughasnails/tags/item/hydration/10_hydration_drinks.json\n6ca6b5a2b8cffea21f6112afc30cc32fa4a4e2d7 data/toughasnails/tags/item/hydration/20_hydration_drinks.json\nedb5947f84984a39ab47c98c6fb0b3c3a9a8cc39 data/toughasnails/tags/item/hydration/30_hydration_drinks.json\nf87a1c4dc42b16f1628cfca591895d987e5dc6ca data/toughasnails/tags/item/hydration/40_hydration_drinks.json\n4f7422a225cdc6c2f193883f99997942060a44fb data/toughasnails/tags/item/hydration/50_hydration_drinks.json\nce37a9edf9fd513131ff36c4478e629a45057d38 data/toughasnails/tags/item/hydration/60_hydration_drinks.json\na8d4693f32c2dabe2f0ff10cb6ccae93882c8530 data/toughasnails/tags/item/hydration/70_hydration_drinks.json\n7fd9471261d08e940601fdecd379217eb90622d1 data/toughasnails/tags/item/hydration/80_hydration_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/hydration/90_hydration_drinks.json\ne29ce056acb765bed57cb10188a195741ad86407 data/toughasnails/tags/item/poison_chance/100_poison_chance_drinks.json\nf87a1c4dc42b16f1628cfca591895d987e5dc6ca data/toughasnails/tags/item/poison_chance/25_poison_chance_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/poison_chance/50_poison_chance_drinks.json\ncc0aa3bf437ed849deda4e4b64aff3665160dae6 data/toughasnails/tags/item/poison_chance/75_poison_chance_drinks.json\n60d949cfbd83ede5b827cfb937e7a541da50825a data/toughasnails/tags/item/thermoregulator_cooling_fuel.json\n4eba53176c4c88b96590e24041f1fe66e24a4d6e data/toughasnails/tags/item/thermoregulator_heating_fuel.json\n0395ed7d6e3d7510a25d2f4ef8b498b0d8c6c9eb data/toughasnails/tags/item/thirst/10_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/11_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/12_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/13_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/14_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/15_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/16_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/17_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/18_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/19_thirst_drinks.json\n01720430f7a548fffd9ef59e9e7037fff02e6da3 data/toughasnails/tags/item/thirst/1_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/20_thirst_drinks.json\nedb5947f84984a39ab47c98c6fb0b3c3a9a8cc39 data/toughasnails/tags/item/thirst/2_thirst_drinks.json\nf87a1c4dc42b16f1628cfca591895d987e5dc6ca data/toughasnails/tags/item/thirst/3_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/4_thirst_drinks.json\n7fd9471261d08e940601fdecd379217eb90622d1 data/toughasnails/tags/item/thirst/5_thirst_drinks.json\n24b02d22d0e3e4abbeed0c96fc20b8dc05dc5f6e data/toughasnails/tags/item/thirst/6_thirst_drinks.json\na90844d1583073e1a3538fe5afe6e279aa3073b8 data/toughasnails/tags/item/thirst/7_thirst_drinks.json\na8d4693f32c2dabe2f0ff10cb6ccae93882c8530 data/toughasnails/tags/item/thirst/8_thirst_drinks.json\n35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/9_thirst_drinks.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/d288570b70137f55051bdf585fe1fd764998d579",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3499917\tTAN Recipes\n538aa9aa354f6743d9832c0ec7a8642b70f515f2 data/toughasnails/advancement/recipes/combat/leaf_boots.json\n2cb6e078f817b17b47c66d6ca824b44751c06ecd data/toughasnails/advancement/recipes/combat/leaf_chestplate.json\n4a11700a18931f1f67270bef246e6b57d1cf5a5b data/toughasnails/advancement/recipes/combat/leaf_helmet.json\n92732ab3d75844d388eea763c654120903b2df4e data/toughasnails/advancement/recipes/combat/leaf_leggings.json\nc6798fc2c097b87d061820015eef0c14aaaaf1c3 data/toughasnails/advancement/recipes/combat/wool_boots.json\nb735e388f317f827951e1fcd71f7d7076d846019 data/toughasnails/advancement/recipes/combat/wool_chestplate.json\n5678da96edd184f098392efb1d8aa82740551b18 data/toughasnails/advancement/recipes/combat/wool_helmet.json\n584e5f5d4d842b1b059a566fb58dd5643ec6a6b8 data/toughasnails/advancement/recipes/combat/wool_leggings.json\n898c7abddb9f6e89481a42f140367c9cf5e6ea4a data/toughasnails/advancement/recipes/decorations/rain_collector.json\n20a1c603ca73d6fb93e294c4620bb1f002208d2a data/toughasnails/advancement/recipes/decorations/thermoregulator.json\n441400bda4d19c989e62a7fbf1b3bb5bd43064a9 data/toughasnails/advancement/recipes/decorations/water_purifier.json\nec99cbc4bc7d858443bbfa259626570a34d515e5 data/toughasnails/advancement/recipes/food/apple_juice.json\n2b251232b3322008c7bc03741646d58e54c3ce67 data/toughasnails/advancement/recipes/food/cactus_juice.json\n2ceff39e198a3570692b3f953b4d994042643d78 data/toughasnails/advancement/recipes/food/charc_os.json\n20d67b977fc7ce355c862cc5c1f6434cb2249226 data/toughasnails/advancement/recipes/food/chorus_fruit_juice.json\na386c8045141bcae0b7ccdeaff8c687cf1e12f52 data/toughasnails/advancement/recipes/food/glow_berry_juice.json\nfd44b7c77b809c029e4195348910c74f641b20f6 data/toughasnails/advancement/recipes/food/ice_cream.json\n43ed15141145d7471daea21cb4227b401502d948 data/toughasnails/advancement/recipes/food/melon_juice.json\ndc4821d6d28c6f0625dce5384be24487789a37f3 data/toughasnails/advancement/recipes/food/pumpkin_juice.json\n2801d661cf1f6531a5e3a3268ac4b31699b43b2d data/toughasnails/advancement/recipes/food/sweet_berry_juice.json\n0c7c1277d2b67363ae24c7899b12d98f6acf6490 data/toughasnails/advancement/recipes/redstone/temperature_gauge.json\n4d97de66b3303ab60f18c2d8c5662021130d8099 data/toughasnails/advancement/recipes/tools/empty_copper_canteen.json\n4bd9339ef899c3d4c422f7ca077ff0e527a524b7 data/toughasnails/advancement/recipes/tools/empty_diamond_canteen.json\n8a21f07c3a0d6daa40362b6873c2b95c34dd10cd data/toughasnails/advancement/recipes/tools/empty_gold_canteen.json\nb7cae73d49989fb2ca8a9b5d5967d2a673230968 data/toughasnails/advancement/recipes/tools/empty_iron_canteen.json\n02f22c09e9d0862258897ad74a03f89cb0a7ea48 data/toughasnails/advancement/recipes/tools/empty_leather_canteen.json\nf1cc178cdd820a87e997cc32feab7c35dcef76b8 data/toughasnails/advancement/recipes/tools/empty_netherite_canteen_smithing.json\n0e1fe6941ec0892c378d8c49a9760c4fa1a12863 data/toughasnails/advancement/recipes/tools/netherite_dirty_water_canteen_smithing.json\n2e24e29003f3c7c1640a560a6e592cfba4d4e0f6 data/toughasnails/advancement/recipes/tools/netherite_purified_water_canteen_smithing.json\nf52d954a9a4287b320ce5a2bb6434e4513b22691 data/toughasnails/advancement/recipes/tools/netherite_water_canteen_smithing.json\n72085fcf1772fab81d8dc3723424bdc1c5c6dd00 data/toughasnails/advancement/recipes/tools/thermometer.json\n7ae9cd24767c9e22920fc6742750639e7c25d563 data/toughasnails/recipe/apple_juice.json\n0fa25520aa35419fcb34fe1086bda3f445302c77 data/toughasnails/recipe/cactus_juice.json\n47fd12f6eb3a0024c6de07d278e3b681718cd023 data/toughasnails/recipe/charc_os.json\n0504fefb53205c273ca75f2682178277eef01d4d data/toughasnails/recipe/chorus_fruit_juice.json\nccd406e9a079e1e84d06314aac77085f1f5fa342 data/toughasnails/recipe/copper_purified_water_canteen.json\n65c58665c421c80ac28018938d0567c7b1ee9ba6 data/toughasnails/recipe/copper_water_canteen.json\nc25c5e89aa3a8074615615176ba3f1b217ca2faa data/toughasnails/recipe/diamond_purified_water_canteen.json\nec714b56d629a6546550cedb66650e949e51fcc4 data/toughasnails/recipe/diamond_water_canteen.json\nd0691c802fd374aeb7ad983887c325fdac834b2e data/toughasnails/recipe/empty_copper_canteen.json\nb6ff10adedcd98934cca27cc29ebb6c67e432081 data/toughasnails/recipe/empty_diamond_canteen.json\nf112bb27cf9a5626319c8145da5813e0d7ff0b70 data/toughasnails/recipe/empty_gold_canteen.json\n64e691d70fc9c358f36f1e6a5b0fd638e40e1f13 data/toughasnails/recipe/empty_iron_canteen.json\n38e534d8e98abc149852dba77b5cae519c568f09 data/toughasnails/recipe/empty_leather_canteen.json\n4f27f9e4cf54d20b07a441e8996856bedfaee01a data/toughasnails/recipe/empty_netherite_canteen_smithing.json\n8c11dc93bc9a23c5a9e18ee64e3f620d8136ac48 data/toughasnails/recipe/glow_berry_juice.json\n69be74e00404672ee28fd5c87655a27244c5062f data/toughasnails/recipe/gold_purified_water_canteen.json\ndc05d85c895b0e41c1fbd20e85a0107b216b97a6 data/toughasnails/recipe/gold_water_canteen.json\n87310eadcb834b2a6c6ff27b758d28ca58eea4c1 data/toughasnails/recipe/ice_cream.json\n7afd5591286be697309a4bb85a7beead2ae8362a data/toughasnails/recipe/iron_purified_water_canteen.json\nd71f13ff24d6b8c5967ccfb00e77e177ce3fc3d2 data/toughasnails/recipe/iron_water_canteen.json\n51b498d973655d79b9a4197a82833742453bfcf7 data/toughasnails/recipe/leaf_boots.json\ne872838768cacd34384bec36ddf0c761c2e8a9a4 data/toughasnails/recipe/leaf_chestplate.json\nb134446bb20b1dddbf701e2b9cca48416ce4e45d data/toughasnails/recipe/leaf_helmet.json\neb0481ca4e00397c5e72125a7b59555042934ce4 data/toughasnails/recipe/leaf_leggings.json\n5e0ccfb780bbe271863f1feff90d20553dcefba4 data/toughasnails/recipe/leather_purified_water_canteen.json\n3c87d0c96c709a0dcf7954c2f7b831678afeb8b0 data/toughasnails/recipe/leather_water_canteen.json\nfe315b7c2ac5b588859583fcffd92fe5a16e907e data/toughasnails/recipe/melon_juice.json\n53371ba20c7a0040a9d50cc72df261c940878d82 data/toughasnails/recipe/netherite_dirty_water_canteen_smithing.json\n908a02215fb93a13be152f3f09ce105ff7b12fde data/toughasnails/recipe/netherite_purified_water_canteen.json\n678b238401a961d8ac969cae9785c2a07b513953 data/toughasnails/recipe/netherite_purified_water_canteen_smithing.json\n8b8ee7a534d61dbc1060dafdc4a244987d6de619 data/toughasnails/recipe/netherite_water_canteen.json\nb6a097d7daee3fdc5ed543a12d7ced1691d22a0f data/toughasnails/recipe/netherite_water_canteen_smithing.json\nceedf2e2958333f02b577fb673e60e3a605113a5 data/toughasnails/recipe/potion.json\nc25f8ea63deddea28304843d9fa4bf9d2a656234 data/toughasnails/recipe/pumpkin_juice.json\nc85c37688386d19ebb8a03dab0281fe4bead3bca data/toughasnails/recipe/purified_water_bottle.json\ndc11330068388d2a26806f4c46e7704a1e1e44b5 data/toughasnails/recipe/rain_collector.json\nc578b91c32ec0e4763cfeed650f99caf7eac88df data/toughasnails/recipe/sweet_berry_juice.json\nc329bb907035607d58dc77f74aa6d057b66bf502 data/toughasnails/recipe/temperature_gauge.json\nc398e5e91633b705be2b5354c3e605ccabab1db9 data/toughasnails/recipe/thermometer.json\n596bfedee294eb93394a02bb0c2977d49ff7d165 data/toughasnails/recipe/thermoregulator.json\nbbcd1dfd1c65f9f8fba02280f16d924ea6176da3 data/toughasnails/recipe/water_purifier.json\n684a130792523667b2a939c49ec57ed43c7ce0e2 data/toughasnails/recipe/wool_boots.json\n882f4f333255d6000be1d018d01356349754e2fa data/toughasnails/recipe/wool_chestplate.json\n82840cdcfe0739f279dd98df7a5954c05f6c9ca6 data/toughasnails/recipe/wool_helmet.json\nc1b29b1bdcd08fb700f78bfe64c88aa20072bec3 data/toughasnails/recipe/wool_leggings.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/d5932a16d3f0544ba1e8cda3b77d0d46f353493b",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3494913\tTags for minecraft:damage_type mod id toughasnails\n114a24c8e8dfc4dca5477ef3ceb9cdce6f35c49d data/minecraft/tags/damage_type/bypasses_armor.json\n7bc5233723c7bfc14215cd1f26c7fd14f2da6c81 data/minecraft/tags/damage_type/bypasses_effects.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/d6a68f98580d9908a43dbfe9cc754bc0c1ac14b0",
    "content": "// 1.21.11\t2025-12-14T21:33:41.3439903\tTags for minecraft:block mod id toughasnails\nbffb0fdf09ac6cfbed64666a723e8a78cb784bbd data/minecraft/tags/block/mineable/axe.json\n0342cd45a4d6f790afda91090de45871d9b0ef63 data/minecraft/tags/block/mineable/pickaxe.json\need9ca8217c04724f67008aba1a0a5edde5697c2 data/toughasnails/tags/block/cooling_blocks.json\n658fab0118eb1ac9896e1b9ab89f2d5ed055a967 data/toughasnails/tags/block/heating_blocks.json\ne31d0ccf1dd374df5d89a102ae1829d4411012f6 data/toughasnails/tags/block/passable_blocks.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/e17ca3f95219f355def414f7430c77a0b006e725",
    "content": "// 1.21.11\t2026-02-24T22:31:51.7123482\tTags for minecraft:entity_type mod id toughasnails\n98ee250779a1d5c1a5915d68a6c27e6f7e3c849a data/toughasnails/tags/entity_type/neutralising_mounts.json\n"
  },
  {
    "path": "common/src/generated/resources/.cache/ece1a0d38a152b7be1e86680691afdfd6d9fba1f",
    "content": "// 1.21.11\t2025-12-14T21:33:41.347491\tEquipment Asset Definitions\n4b2945d310c6084cdfa1731f33901d34d6ce4731 assets/toughasnails/equipment/leaf.json\n192c8a743376167dc4e419443577552eb962ef7f assets/toughasnails/equipment/wool.json\n"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/equipment/leaf.json",
    "content": "{\n  \"layers\": {\n    \"humanoid\": [\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": -6265536\n        },\n        \"texture\": \"toughasnails:leaf\"\n      },\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": -6265536\n        },\n        \"texture\": \"toughasnails:leaf_overlay\"\n      }\n    ],\n    \"humanoid_leggings\": [\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": -6265536\n        },\n        \"texture\": \"toughasnails:leaf\"\n      },\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": -6265536\n        },\n        \"texture\": \"toughasnails:leaf_overlay\"\n      }\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/equipment/wool.json",
    "content": "{\n  \"layers\": {\n    \"humanoid\": [\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": -6265536\n        },\n        \"texture\": \"toughasnails:wool\"\n      },\n      {\n        \"texture\": \"toughasnails:wool_overlay\"\n      }\n    ],\n    \"humanoid_leggings\": [\n      {\n        \"dyeable\": {\n          \"color_when_undyed\": -6265536\n        },\n        \"texture\": \"toughasnails:wool\"\n      },\n      {\n        \"texture\": \"toughasnails:wool_overlay\"\n      }\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/apple_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/apple_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/cactus_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/cactus_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/charc_os.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/charc_os\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/chorus_fruit_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/chorus_fruit_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/copper_dirty_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/copper_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/copper_purified_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/copper_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/copper_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/copper_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/diamond_dirty_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/diamond_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/diamond_purified_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/diamond_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/diamond_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/diamond_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/dirty_water_bottle.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/dirty_water_bottle\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/empty_copper_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/empty_copper_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/empty_diamond_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/empty_diamond_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/empty_gold_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/empty_gold_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/empty_iron_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/empty_iron_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/empty_leather_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/empty_leather_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/empty_netherite_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/empty_netherite_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/glow_berry_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/glow_berry_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/gold_dirty_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/gold_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/gold_purified_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/gold_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/gold_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/gold_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/ice_cream.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/ice_cream\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/iron_dirty_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/iron_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/iron_purified_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/iron_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/iron_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/iron_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leaf_boots.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_boots_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/leaf_boots\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -12012264\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leaf_chestplate.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_chestplate_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/leaf_chestplate\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -12012264\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leaf_helmet.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_helmet_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/leaf_helmet\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -12012264\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leaf_leggings.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/leaf_leggings_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -12012264\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/leaf_leggings\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -12012264\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leather_dirty_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/leather_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leather_purified_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/leather_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/leather_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/leather_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/melon_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/melon_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/netherite_dirty_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/netherite_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/netherite_purified_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/netherite_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/netherite_water_canteen.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/netherite_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/pumpkin_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/pumpkin_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/purified_water_bottle.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/purified_water_bottle\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/rain_collector.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:block/rain_collector\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/sweet_berry_juice.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/sweet_berry_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/tan_icon.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:item/tan_icon\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/temperature_gauge.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:block/temperature_gauge\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/thermometer.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:range_dispatch\",\n    \"deltas\": {},\n    \"entries\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_00\"\n        },\n        \"threshold\": 0.0\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_01\"\n        },\n        \"threshold\": 0.05\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_02\"\n        },\n        \"threshold\": 0.1\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_03\"\n        },\n        \"threshold\": 0.15\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_04\"\n        },\n        \"threshold\": 0.2\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_05\"\n        },\n        \"threshold\": 0.25\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_06\"\n        },\n        \"threshold\": 0.3\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_07\"\n        },\n        \"threshold\": 0.35\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_08\"\n        },\n        \"threshold\": 0.4\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_09\"\n        },\n        \"threshold\": 0.45\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_10\"\n        },\n        \"threshold\": 0.5\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_11\"\n        },\n        \"threshold\": 0.55\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_12\"\n        },\n        \"threshold\": 0.6\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_13\"\n        },\n        \"threshold\": 0.65\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_14\"\n        },\n        \"threshold\": 0.7\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_15\"\n        },\n        \"threshold\": 0.75\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_16\"\n        },\n        \"threshold\": 0.8\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_17\"\n        },\n        \"threshold\": 0.85\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_18\"\n        },\n        \"threshold\": 0.9\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_19\"\n        },\n        \"threshold\": 0.95\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/thermometer_20\"\n        },\n        \"threshold\": 1.0\n      }\n    ],\n    \"property\": \"minecraft:temperature\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/thermoregulator.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:block/thermoregulator\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/water_purifier.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:model\",\n    \"model\": \"toughasnails:block/water_purifier\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/wool_boots.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_boots_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/wool_boots\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -6265536\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/wool_chestplate.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_chestplate_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/wool_chestplate\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -6265536\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/wool_helmet.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_helmet_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/wool_helmet\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -6265536\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/items/wool_leggings.json",
    "content": "{\n  \"model\": {\n    \"type\": \"minecraft:select\",\n    \"cases\": [\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_quartz_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:quartz\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_iron_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:iron\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_netherite_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:netherite\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_redstone_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:redstone\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_copper_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:copper\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_gold_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:gold\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_emerald_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:emerald\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_diamond_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:diamond\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_lapis_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:lapis\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_amethyst_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:amethyst\"\n      },\n      {\n        \"model\": {\n          \"type\": \"minecraft:model\",\n          \"model\": \"toughasnails:item/wool_leggings_resin_trim\",\n          \"tints\": [\n            {\n              \"type\": \"minecraft:dye\",\n              \"default\": -6265536\n            }\n          ]\n        },\n        \"when\": \"minecraft:resin\"\n      }\n    ],\n    \"fallback\": {\n      \"type\": \"minecraft:model\",\n      \"model\": \"toughasnails:item/wool_leggings\",\n      \"tints\": [\n        {\n          \"type\": \"minecraft:dye\",\n          \"default\": -6265536\n        }\n      ]\n    },\n    \"property\": \"minecraft:trim_material\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/apple_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/apple_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/cactus_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/cactus_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/charc_os.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/charc_os\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/chorus_fruit_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/chorus_fruit_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/copper_dirty_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/copper_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/copper_purified_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/copper_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/copper_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/copper_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/diamond_dirty_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/diamond_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/diamond_purified_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/diamond_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/diamond_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/diamond_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/dirty_water_bottle.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/dirty_water_bottle\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/empty_copper_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/empty_copper_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/empty_diamond_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/empty_diamond_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/empty_gold_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/empty_gold_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/empty_iron_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/empty_iron_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/empty_leather_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/empty_leather_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/empty_netherite_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/empty_netherite_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/glow_berry_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/glow_berry_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/gold_dirty_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/gold_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/gold_purified_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/gold_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/gold_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/gold_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/ice_cream.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/ice_cream\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/iron_dirty_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/iron_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/iron_purified_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/iron_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/iron_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/iron_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_boots\",\n    \"layer1\": \"toughasnails:item/leaf_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_chestplate\",\n    \"layer1\": \"toughasnails:item/leaf_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_helmet\",\n    \"layer1\": \"toughasnails:item/leaf_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leaf_leggings\",\n    \"layer1\": \"toughasnails:item/leaf_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leather_dirty_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leather_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leather_purified_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leather_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/leather_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/leather_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/melon_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/melon_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/netherite_dirty_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/netherite_dirty_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/netherite_purified_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/netherite_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/netherite_water_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/netherite_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/pumpkin_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/pumpkin_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/purified_water_bottle.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/purified_water_bottle\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/sweet_berry_juice.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/sweet_berry_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/tan_icon.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/tan_icon\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_00.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_00\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_01.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_01\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_02.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_02\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_03.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_03\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_04.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_04\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_05.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_05\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_06.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_06\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_07.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_07\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_08.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_08\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_09.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_09\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_10.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_10\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_11.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_11\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_12.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_12\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_13.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_13\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_14.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_14\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_15.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_15\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_16.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_16\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_17.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_17\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_18.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_18\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_19.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_19\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/thermometer_20.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/thermometer_20\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_boots_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_boots\",\n    \"layer1\": \"toughasnails:item/wool_boots_overlay\",\n    \"layer2\": \"minecraft:trims/items/boots_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_chestplate\",\n    \"layer1\": \"toughasnails:item/wool_chestplate_overlay\",\n    \"layer2\": \"minecraft:trims/items/chestplate_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_helmet\",\n    \"layer1\": \"toughasnails:item/wool_helmet_overlay\",\n    \"layer2\": \"minecraft:trims/items/helmet_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_amethyst_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_amethyst\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_copper_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_copper\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_diamond_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_diamond\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_emerald_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_emerald\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_gold_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_gold\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_iron_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_iron\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_lapis_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_lapis\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_netherite_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_netherite\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_quartz_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_quartz\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_redstone_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_redstone\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_resin_trim.json",
    "content": "{\n  \"parent\": \"minecraft:item/generated\",\n  \"textures\": {\n    \"layer0\": \"toughasnails:item/wool_leggings\",\n    \"layer1\": \"toughasnails:item/wool_leggings_overlay\",\n    \"layer2\": \"minecraft:trims/items/leggings_trim_resin\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/block/mineable/axe.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:rain_collector\",\n    \"toughasnails:water_purifier\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:thermoregulator\",\n    \"toughasnails:temperature_gauge\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:hyperthermia\",\n    \"toughasnails:thirst\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:thirst\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/enchantment/on_random_loot.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:thermal_tuning\",\n    \"toughasnails:water_cleansing\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/enchantment/tradeable.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:thermal_tuning\",\n    \"toughasnails:water_cleansing\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/enchantment/treasure.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:thermal_tuning\",\n    \"toughasnails:water_cleansing\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/item/dyeable.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:leaf_helmet\",\n    \"toughasnails:leaf_chestplate\",\n    \"toughasnails:leaf_leggings\",\n    \"toughasnails:leaf_boots\",\n    \"toughasnails:wool_helmet\",\n    \"toughasnails:wool_chestplate\",\n    \"toughasnails:wool_leggings\",\n    \"toughasnails:wool_boots\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:climatologist\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_boots.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_leaves\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:leaves\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:leaf_boots\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_leaves\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:leaf_boots\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_chestplate.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_leaves\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:leaves\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:leaf_chestplate\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_leaves\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:leaf_chestplate\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_helmet.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_leaves\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:leaves\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:leaf_helmet\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_leaves\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:leaf_helmet\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_leggings.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_leaves\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:leaves\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:leaf_leggings\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_leaves\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:leaf_leggings\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_boots.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:wool_boots\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"has_wool\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:wool\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_wool\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:wool_boots\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_chestplate.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:wool_chestplate\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"has_wool\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:wool\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_wool\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:wool_chestplate\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_helmet.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:wool_helmet\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"has_wool\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:wool\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_wool\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:wool_helmet\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_leggings.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:wool_leggings\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"has_wool\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"#minecraft:wool\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_wool\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:wool_leggings\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/decorations/rain_collector.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_string\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:string\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:rain_collector\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_string\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:rain_collector\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/decorations/thermoregulator.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:thermoregulator\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"has_thermometer\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"toughasnails:thermometer\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_thermometer\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:thermoregulator\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/decorations/water_purifier.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_copper_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:copper_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:water_purifier\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_copper_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:water_purifier\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/apple_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_apple\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:apple\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:apple_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_apple\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:apple_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/cactus_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_cactus\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:cactus\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:cactus_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_cactus\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:cactus_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/charc_os.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_charcoal\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:charcoal\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:charc_os\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_charcoal\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:charc_os\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/chorus_fruit_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_chorus_fruit\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:chorus_fruit\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:chorus_fruit_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_chorus_fruit\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:chorus_fruit_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/glow_berry_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_glow_berries\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:glow_berries\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:glow_berry_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_glow_berries\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:glow_berry_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/ice_cream.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_snowball\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:snowball\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:ice_cream\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_snowball\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:ice_cream\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/melon_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_melon_slice\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:melon_slice\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:melon_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_melon_slice\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:melon_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/pumpkin_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_pumpkin\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:pumpkin\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:pumpkin_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_pumpkin\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:pumpkin_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/food/sweet_berry_juice.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_sweet_berries\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:sweet_berries\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:sweet_berry_juice\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_sweet_berries\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:sweet_berry_juice\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/redstone/temperature_gauge.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:temperature_gauge\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    },\n    \"has_thermometer\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"toughasnails:thermometer\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_thermometer\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:temperature_gauge\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_copper_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_copper_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:copper_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:empty_copper_canteen\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_copper_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:empty_copper_canteen\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_diamond_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_diamond\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:diamond\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:empty_diamond_canteen\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_diamond\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:empty_diamond_canteen\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_gold_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_gold_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:gold_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:empty_gold_canteen\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_gold_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:empty_gold_canteen\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_iron_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_iron_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:iron_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:empty_iron_canteen\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_iron_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:empty_iron_canteen\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_leather_canteen.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_leather\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:leather\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:empty_leather_canteen\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_leather\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:empty_leather_canteen\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_netherite_canteen_smithing.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_netherite_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:netherite_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:empty_netherite_canteen_smithing\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_netherite_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:empty_netherite_canteen_smithing\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/netherite_dirty_water_canteen_smithing.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_netherite_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:netherite_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:netherite_dirty_water_canteen_smithing\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_netherite_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:netherite_dirty_water_canteen_smithing\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/netherite_purified_water_canteen_smithing.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_netherite_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:netherite_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:netherite_purified_water_canteen_smithing\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_netherite_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:netherite_purified_water_canteen_smithing\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/netherite_water_canteen_smithing.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_netherite_ingot\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:netherite_ingot\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:netherite_water_canteen_smithing\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_netherite_ingot\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:netherite_water_canteen_smithing\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/advancement/recipes/tools/thermometer.json",
    "content": "{\n  \"parent\": \"minecraft:recipes/root\",\n  \"criteria\": {\n    \"has_redstone\": {\n      \"conditions\": {\n        \"items\": [\n          {\n            \"items\": \"minecraft:redstone\"\n          }\n        ]\n      },\n      \"trigger\": \"minecraft:inventory_changed\"\n    },\n    \"has_the_recipe\": {\n      \"conditions\": {\n        \"recipe\": \"toughasnails:thermometer\"\n      },\n      \"trigger\": \"minecraft:recipe_unlocked\"\n    }\n  },\n  \"requirements\": [\n    [\n      \"has_the_recipe\",\n      \"has_redstone\"\n    ]\n  ],\n  \"rewards\": {\n    \"recipes\": [\n      \"toughasnails:thermometer\"\n    ]\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/damage_type/hyperthermia.json",
    "content": "{\n  \"exhaustion\": 0.1,\n  \"message_id\": \"toughasnails.hyperthermia\",\n  \"scaling\": \"when_caused_by_living_non_player\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/damage_type/thirst.json",
    "content": "{\n  \"exhaustion\": 0.0,\n  \"message_id\": \"toughasnails.thirst\",\n  \"scaling\": \"when_caused_by_living_non_player\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/enchantment/thermal_tuning.json",
    "content": "{\n  \"anvil_cost\": 4,\n  \"description\": {\n    \"translate\": \"enchantment.toughasnails.thermal_tuning\"\n  },\n  \"max_cost\": {\n    \"base\": 75,\n    \"per_level_above_first\": 25\n  },\n  \"max_level\": 1,\n  \"min_cost\": {\n    \"base\": 25,\n    \"per_level_above_first\": 25\n  },\n  \"slots\": [\n    \"chest\"\n  ],\n  \"supported_items\": \"#minecraft:enchantable/chest_armor\",\n  \"weight\": 2\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/enchantment/water_cleansing.json",
    "content": "{\n  \"anvil_cost\": 4,\n  \"description\": {\n    \"translate\": \"enchantment.toughasnails.water_cleansing\"\n  },\n  \"max_cost\": {\n    \"base\": 75,\n    \"per_level_above_first\": 25\n  },\n  \"max_level\": 1,\n  \"min_cost\": {\n    \"base\": 25,\n    \"per_level_above_first\": 25\n  },\n  \"slots\": [\n    \"mainhand\"\n  ],\n  \"supported_items\": \"#toughasnails:enchantable/canteen\",\n  \"weight\": 2\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/loot_table/blocks/rain_collector.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"bonus_rolls\": 0.0,\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        }\n      ],\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"toughasnails:rain_collector\"\n        }\n      ],\n      \"rolls\": 1.0\n    }\n  ],\n  \"random_sequence\": \"toughasnails:blocks/rain_collector\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/loot_table/blocks/temperature_gauge.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"bonus_rolls\": 0.0,\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        }\n      ],\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"toughasnails:temperature_gauge\"\n        }\n      ],\n      \"rolls\": 1.0\n    }\n  ],\n  \"random_sequence\": \"toughasnails:blocks/temperature_gauge\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/loot_table/blocks/thermoregulator.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"bonus_rolls\": 0.0,\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        }\n      ],\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"toughasnails:thermoregulator\"\n        }\n      ],\n      \"rolls\": 1.0\n    }\n  ],\n  \"random_sequence\": \"toughasnails:blocks/thermoregulator\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/loot_table/blocks/water_purifier.json",
    "content": "{\n  \"type\": \"minecraft:block\",\n  \"pools\": [\n    {\n      \"bonus_rolls\": 0.0,\n      \"conditions\": [\n        {\n          \"condition\": \"minecraft:survives_explosion\"\n        }\n      ],\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"toughasnails:water_purifier\"\n        }\n      ],\n      \"rolls\": 1.0\n    }\n  ],\n  \"random_sequence\": \"toughasnails:blocks/water_purifier\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/apple_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:apple\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:apple_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/cactus_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:cactus\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:cactus_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/charc_os.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"key\": {\n    \"#\": \"minecraft:charcoal\",\n    \"B\": \"minecraft:bowl\",\n    \"S\": \"minecraft:sugar\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"#S#\",\n    \" B \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:charc_os\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/chorus_fruit_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:chorus_fruit\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:chorus_fruit_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/copper_purified_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:copper_water_canteen\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:copper_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/copper_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:copper_dirty_water_canteen\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:copper_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/diamond_purified_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:diamond_water_canteen\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:diamond_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/diamond_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:diamond_dirty_water_canteen\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:diamond_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/empty_copper_canteen.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"#\": \"minecraft:copper_ingot\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"# #\",\n    \" # \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:empty_copper_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/empty_diamond_canteen.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"#\": \"minecraft:diamond\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"# #\",\n    \" # \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:empty_diamond_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/empty_gold_canteen.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"#\": \"minecraft:gold_ingot\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"# #\",\n    \" # \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:empty_gold_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/empty_iron_canteen.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"#\": \"minecraft:iron_ingot\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"# #\",\n    \" # \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:empty_iron_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/empty_leather_canteen.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"#\": \"minecraft:leather\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"# #\",\n    \" # \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:empty_leather_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/empty_netherite_canteen_smithing.json",
    "content": "{\n  \"type\": \"minecraft:smithing_transform\",\n  \"addition\": \"minecraft:netherite_ingot\",\n  \"base\": \"toughasnails:empty_diamond_canteen\",\n  \"result\": {\n    \"id\": \"toughasnails:empty_netherite_canteen\"\n  },\n  \"template\": \"minecraft:netherite_upgrade_smithing_template\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/glow_berry_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:glow_berries\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:glow_berry_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/gold_purified_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:gold_water_canteen\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:gold_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/gold_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:gold_dirty_water_canteen\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:gold_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/ice_cream.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"key\": {\n    \"#\": \"minecraft:snowball\",\n    \"B\": \"minecraft:bowl\",\n    \"S\": \"minecraft:sugar\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"#S#\",\n    \" B \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:ice_cream\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/iron_purified_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:iron_water_canteen\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:iron_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/iron_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:iron_dirty_water_canteen\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:iron_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/leaf_boots.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:leaves\"\n  },\n  \"pattern\": [\n    \"X X\",\n    \"X X\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leaf_boots\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/leaf_chestplate.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:leaves\"\n  },\n  \"pattern\": [\n    \"X X\",\n    \"XXX\",\n    \"XXX\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leaf_chestplate\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/leaf_helmet.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:leaves\"\n  },\n  \"pattern\": [\n    \"XXX\",\n    \"X X\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leaf_helmet\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/leaf_leggings.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:leaves\"\n  },\n  \"pattern\": [\n    \"XXX\",\n    \"X X\",\n    \"X X\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leaf_leggings\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/leather_purified_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leather_water_canteen\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leather_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/leather_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leather_dirty_water_canteen\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:leather_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/melon_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:melon_slice\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:melon_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/netherite_dirty_water_canteen_smithing.json",
    "content": "{\n  \"type\": \"minecraft:smithing_transform\",\n  \"addition\": \"minecraft:netherite_ingot\",\n  \"base\": \"toughasnails:diamond_dirty_water_canteen\",\n  \"result\": {\n    \"id\": \"toughasnails:netherite_dirty_water_canteen\"\n  },\n  \"template\": \"minecraft:netherite_upgrade_smithing_template\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/netherite_purified_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:netherite_water_canteen\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:netherite_purified_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/netherite_purified_water_canteen_smithing.json",
    "content": "{\n  \"type\": \"minecraft:smithing_transform\",\n  \"addition\": \"minecraft:netherite_ingot\",\n  \"base\": \"toughasnails:diamond_purified_water_canteen\",\n  \"result\": {\n    \"id\": \"toughasnails:netherite_purified_water_canteen\"\n  },\n  \"template\": \"minecraft:netherite_upgrade_smithing_template\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/netherite_water_canteen.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:netherite_dirty_water_canteen\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:netherite_water_canteen\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/netherite_water_canteen_smithing.json",
    "content": "{\n  \"type\": \"minecraft:smithing_transform\",\n  \"addition\": \"minecraft:netherite_ingot\",\n  \"base\": \"toughasnails:diamond_water_canteen\",\n  \"result\": {\n    \"id\": \"toughasnails:netherite_water_canteen\"\n  },\n  \"template\": \"minecraft:netherite_upgrade_smithing_template\"\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/potion.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:dirty_water_bottle\"\n  },\n  \"purifytime\": 400,\n  \"result\": {\n    \"components\": {\n      \"minecraft:potion_contents\": {\n        \"potion\": \"minecraft:water\"\n      }\n    },\n    \"count\": 1,\n    \"id\": \"minecraft:potion\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/pumpkin_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:pumpkin\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:pumpkin_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/purified_water_bottle.json",
    "content": "{\n  \"type\": \"toughasnails:water_purifying\",\n  \"input\": {\n    \"components\": {\n      \"minecraft:potion_contents\": {\n        \"potion\": \"minecraft:water\"\n      }\n    },\n    \"count\": 1,\n    \"id\": \"minecraft:potion\"\n  },\n  \"purifytime\": 200,\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:purified_water_bottle\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/rain_collector.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"key\": {\n    \"S\": \"minecraft:string\",\n    \"W\": \"#minecraft:planks\"\n  },\n  \"pattern\": [\n    \"WSW\",\n    \"W W\",\n    \"WWW\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:rain_collector\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/sweet_berry_juice.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shapeless\",\n  \"category\": \"misc\",\n  \"group\": \"juice\",\n  \"ingredients\": [\n    \"toughasnails:purified_water_bottle\",\n    \"minecraft:sugar\",\n    \"minecraft:sweet_berries\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:sweet_berry_juice\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/temperature_gauge.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"redstone\",\n  \"key\": {\n    \"B\": \"minecraft:brick_slab\",\n    \"G\": \"minecraft:glass\",\n    \"Q\": \"minecraft:quartz\",\n    \"T\": \"toughasnails:thermometer\"\n  },\n  \"pattern\": [\n    \"GGG\",\n    \"QTQ\",\n    \"BBB\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:temperature_gauge\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/thermometer.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"#\": \"minecraft:copper_ingot\",\n    \"X\": \"minecraft:redstone\"\n  },\n  \"pattern\": [\n    \" # \",\n    \"#X#\",\n    \" # \"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:thermometer\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/thermoregulator.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"key\": {\n    \"I\": \"minecraft:iron_ingot\",\n    \"S\": \"minecraft:smooth_stone\",\n    \"T\": \"toughasnails:thermometer\"\n  },\n  \"pattern\": [\n    \"SIS\",\n    \"ITI\",\n    \"SIS\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:thermoregulator\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/water_purifier.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"misc\",\n  \"key\": {\n    \"C\": \"minecraft:copper_ingot\",\n    \"G\": \"minecraft:glass\",\n    \"W\": \"#minecraft:planks\"\n  },\n  \"pattern\": [\n    \"GCG\",\n    \"C C\",\n    \"WWW\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:water_purifier\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/wool_boots.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:wool\"\n  },\n  \"pattern\": [\n    \"X X\",\n    \"X X\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:wool_boots\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/wool_chestplate.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:wool\"\n  },\n  \"pattern\": [\n    \"X X\",\n    \"XXX\",\n    \"XXX\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:wool_chestplate\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/wool_helmet.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:wool\"\n  },\n  \"pattern\": [\n    \"XXX\",\n    \"X X\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:wool_helmet\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/recipe/wool_leggings.json",
    "content": "{\n  \"type\": \"minecraft:crafting_shaped\",\n  \"category\": \"equipment\",\n  \"key\": {\n    \"X\": \"#minecraft:wool\"\n  },\n  \"pattern\": [\n    \"XXX\",\n    \"X X\",\n    \"X X\"\n  ],\n  \"result\": {\n    \"count\": 1,\n    \"id\": \"toughasnails:wool_leggings\"\n  }\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/block/cooling_blocks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:soul_fire\",\n    \"minecraft:soul_campfire\",\n    \"minecraft:soul_lantern\",\n    \"minecraft:packed_ice\",\n    \"minecraft:blue_ice\",\n    \"minecraft:powder_snow_cauldron\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/block/heating_blocks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:fire\",\n    \"minecraft:campfire\",\n    \"minecraft:lantern\",\n    \"minecraft:lava\",\n    \"minecraft:magma_block\",\n    \"minecraft:lava_cauldron\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/block/passable_blocks.json",
    "content": "{\n  \"values\": [\n    \"#minecraft:doors\",\n    \"#minecraft:trapdoors\",\n    \"minecraft:scaffolding\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/entity_type/neutralising_mounts.json",
    "content": "{\n  \"values\": [\n    \"#c:minecarts\",\n    \"#c:boats\",\n    {\n      \"id\": \"#mts:builder_seat\",\n      \"required\": false\n    }\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/cooling_armor.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:leaf_helmet\",\n    \"toughasnails:leaf_chestplate\",\n    \"toughasnails:leaf_leggings\",\n    \"toughasnails:leaf_boots\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/cooling_consumed_items.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:ice_cream\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/cooling_held_items.json",
    "content": "{\n  \"values\": [\n    \"minecraft:powder_snow_bucket\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/drinks.json",
    "content": "{\n  \"values\": [\n    \"#toughasnails:thirst/1_thirst_drinks\",\n    \"#toughasnails:thirst/2_thirst_drinks\",\n    \"#toughasnails:thirst/3_thirst_drinks\",\n    \"#toughasnails:thirst/4_thirst_drinks\",\n    \"#toughasnails:thirst/5_thirst_drinks\",\n    \"#toughasnails:thirst/6_thirst_drinks\",\n    \"#toughasnails:thirst/7_thirst_drinks\",\n    \"#toughasnails:thirst/8_thirst_drinks\",\n    \"#toughasnails:thirst/9_thirst_drinks\",\n    \"#toughasnails:thirst/10_thirst_drinks\",\n    \"#toughasnails:thirst/11_thirst_drinks\",\n    \"#toughasnails:thirst/12_thirst_drinks\",\n    \"#toughasnails:thirst/13_thirst_drinks\",\n    \"#toughasnails:thirst/14_thirst_drinks\",\n    \"#toughasnails:thirst/15_thirst_drinks\",\n    \"#toughasnails:thirst/16_thirst_drinks\",\n    \"#toughasnails:thirst/17_thirst_drinks\",\n    \"#toughasnails:thirst/18_thirst_drinks\",\n    \"#toughasnails:thirst/19_thirst_drinks\",\n    \"#toughasnails:thirst/20_thirst_drinks\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/enchantable/canteen.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:empty_leather_canteen\",\n    \"toughasnails:leather_dirty_water_canteen\",\n    \"toughasnails:leather_water_canteen\",\n    \"toughasnails:leather_purified_water_canteen\",\n    \"toughasnails:empty_copper_canteen\",\n    \"toughasnails:copper_dirty_water_canteen\",\n    \"toughasnails:copper_water_canteen\",\n    \"toughasnails:copper_purified_water_canteen\",\n    \"toughasnails:empty_iron_canteen\",\n    \"toughasnails:iron_dirty_water_canteen\",\n    \"toughasnails:iron_water_canteen\",\n    \"toughasnails:iron_purified_water_canteen\",\n    \"toughasnails:empty_gold_canteen\",\n    \"toughasnails:gold_dirty_water_canteen\",\n    \"toughasnails:gold_water_canteen\",\n    \"toughasnails:gold_purified_water_canteen\",\n    \"toughasnails:empty_diamond_canteen\",\n    \"toughasnails:diamond_dirty_water_canteen\",\n    \"toughasnails:diamond_water_canteen\",\n    \"toughasnails:diamond_purified_water_canteen\",\n    \"toughasnails:empty_netherite_canteen\",\n    \"toughasnails:netherite_dirty_water_canteen\",\n    \"toughasnails:netherite_water_canteen\",\n    \"toughasnails:netherite_purified_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/heating_armor.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:wool_helmet\",\n    \"toughasnails:wool_chestplate\",\n    \"toughasnails:wool_leggings\",\n    \"toughasnails:wool_boots\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/heating_consumed_items.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:charc_os\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/heating_held_items.json",
    "content": "{\n  \"values\": [\n    \"minecraft:lava_bucket\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/100_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:cactus_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/10_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:dirty_water_bottle\",\n    \"toughasnails:leather_dirty_water_canteen\",\n    \"toughasnails:copper_dirty_water_canteen\",\n    \"toughasnails:iron_dirty_water_canteen\",\n    \"toughasnails:gold_dirty_water_canteen\",\n    \"toughasnails:diamond_dirty_water_canteen\",\n    \"toughasnails:netherite_dirty_water_canteen\",\n    \"minecraft:ominous_bottle\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/20_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:chorus_fruit_juice\",\n    \"toughasnails:glow_berry_juice\",\n    \"toughasnails:sweet_berry_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/30_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:milk_bucket\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/40_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:potion\",\n    \"toughasnails:leather_water_canteen\",\n    \"toughasnails:copper_water_canteen\",\n    \"toughasnails:iron_water_canteen\",\n    \"toughasnails:gold_water_canteen\",\n    \"toughasnails:diamond_water_canteen\",\n    \"toughasnails:netherite_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/50_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:melon_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/60_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:pumpkin_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/70_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:apple_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/80_hydration_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:purified_water_bottle\",\n    \"toughasnails:leather_purified_water_canteen\",\n    \"toughasnails:copper_purified_water_canteen\",\n    \"toughasnails:iron_purified_water_canteen\",\n    \"toughasnails:gold_purified_water_canteen\",\n    \"toughasnails:diamond_purified_water_canteen\",\n    \"toughasnails:netherite_purified_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/hydration/90_hydration_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/poison_chance/100_poison_chance_drinks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:ominous_bottle\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/poison_chance/25_poison_chance_drinks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:potion\",\n    \"toughasnails:leather_water_canteen\",\n    \"toughasnails:copper_water_canteen\",\n    \"toughasnails:iron_water_canteen\",\n    \"toughasnails:gold_water_canteen\",\n    \"toughasnails:diamond_water_canteen\",\n    \"toughasnails:netherite_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/poison_chance/50_poison_chance_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/poison_chance/75_poison_chance_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:dirty_water_bottle\",\n    \"toughasnails:leather_dirty_water_canteen\",\n    \"toughasnails:copper_dirty_water_canteen\",\n    \"toughasnails:iron_dirty_water_canteen\",\n    \"toughasnails:gold_dirty_water_canteen\",\n    \"toughasnails:diamond_dirty_water_canteen\",\n    \"toughasnails:netherite_dirty_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thermoregulator_cooling_fuel.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:ice_cream\",\n    \"minecraft:ice\",\n    \"minecraft:packed_ice\",\n    \"minecraft:blue_ice\",\n    \"minecraft:breeze_rod\",\n    \"minecraft:wind_charge\",\n    \"minecraft:snowball\",\n    \"minecraft:snow\",\n    \"minecraft:snow_block\",\n    \"minecraft:powder_snow_bucket\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thermoregulator_heating_fuel.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:charc_os\",\n    \"minecraft:magma_block\",\n    \"minecraft:magma_cream\",\n    \"minecraft:blaze_powder\",\n    \"minecraft:blaze_rod\",\n    \"minecraft:fire_charge\",\n    \"minecraft:coal\",\n    \"minecraft:charcoal\",\n    \"minecraft:coal_block\",\n    \"minecraft:lava_bucket\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/10_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:chorus_fruit_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/11_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/12_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/13_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/14_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/15_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/16_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/17_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/18_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/19_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/1_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:dirty_water_bottle\",\n    \"toughasnails:leather_dirty_water_canteen\",\n    \"toughasnails:copper_dirty_water_canteen\",\n    \"toughasnails:iron_dirty_water_canteen\",\n    \"toughasnails:gold_dirty_water_canteen\",\n    \"toughasnails:diamond_dirty_water_canteen\",\n    \"toughasnails:netherite_dirty_water_canteen\",\n    \"minecraft:ominous_bottle\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/20_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/2_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:milk_bucket\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/3_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"minecraft:potion\",\n    \"toughasnails:leather_water_canteen\",\n    \"toughasnails:copper_water_canteen\",\n    \"toughasnails:iron_water_canteen\",\n    \"toughasnails:gold_water_canteen\",\n    \"toughasnails:diamond_water_canteen\",\n    \"toughasnails:netherite_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/4_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/5_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:purified_water_bottle\",\n    \"toughasnails:leather_purified_water_canteen\",\n    \"toughasnails:copper_purified_water_canteen\",\n    \"toughasnails:iron_purified_water_canteen\",\n    \"toughasnails:gold_purified_water_canteen\",\n    \"toughasnails:diamond_purified_water_canteen\",\n    \"toughasnails:netherite_purified_water_canteen\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/6_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:glow_berry_juice\",\n    \"toughasnails:pumpkin_juice\",\n    \"toughasnails:sweet_berry_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/7_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:cactus_juice\",\n    \"toughasnails:melon_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/8_thirst_drinks.json",
    "content": "{\n  \"values\": [\n    \"toughasnails:apple_juice\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/item/thirst/9_thirst_drinks.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/trim_material/cooling_trims.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/trim_material/heating_trims.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/cold_biomes.json",
    "content": "{\n  \"values\": [\n    \"minecraft:the_end\",\n    \"minecraft:small_end_islands\",\n    \"minecraft:end_midlands\",\n    \"minecraft:end_highlands\",\n    \"minecraft:end_barrens\",\n    \"minecraft:deep_dark\",\n    \"minecraft:taiga\",\n    \"minecraft:old_growth_spruce_taiga\",\n    \"minecraft:old_growth_pine_taiga\",\n    \"minecraft:windswept_hills\",\n    \"minecraft:windswept_forest\",\n    \"minecraft:windswept_gravelly_hills\",\n    \"minecraft:cold_ocean\",\n    \"minecraft:deep_cold_ocean\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/dirty_water_biomes.json",
    "content": "{\n  \"values\": [\n    \"minecraft:mangrove_swamp\",\n    \"minecraft:mushroom_fields\",\n    \"minecraft:swamp\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/hot_biomes.json",
    "content": "{\n  \"values\": [\n    \"minecraft:nether_wastes\",\n    \"minecraft:crimson_forest\",\n    \"minecraft:warped_forest\",\n    \"minecraft:basalt_deltas\",\n    \"minecraft:desert\",\n    \"minecraft:badlands\",\n    \"minecraft:wooded_badlands\",\n    \"minecraft:eroded_badlands\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/icy_biomes.json",
    "content": "{\n  \"values\": [\n    \"minecraft:ice_spikes\",\n    \"minecraft:snowy_taiga\",\n    \"minecraft:snowy_plains\",\n    \"minecraft:snowy_slopes\",\n    \"minecraft:grove\",\n    \"minecraft:jagged_peaks\",\n    \"minecraft:frozen_peaks\",\n    \"minecraft:snowy_beach\",\n    \"minecraft:frozen_river\",\n    \"minecraft:frozen_ocean\",\n    \"minecraft:deep_frozen_ocean\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/neutral_biomes.json",
    "content": "{\n  \"values\": [\n    \"minecraft:the_void\",\n    \"minecraft:dripstone_caves\",\n    \"minecraft:swamp\",\n    \"minecraft:plains\",\n    \"minecraft:sunflower_plains\",\n    \"minecraft:dark_forest\",\n    \"minecraft:birch_forest\",\n    \"minecraft:old_growth_birch_forest\",\n    \"minecraft:forest\",\n    \"minecraft:flower_forest\",\n    \"minecraft:meadow\",\n    \"minecraft:cherry_grove\",\n    \"minecraft:stony_peaks\",\n    \"minecraft:stony_shore\",\n    \"minecraft:beach\",\n    \"minecraft:river\",\n    \"minecraft:ocean\",\n    \"minecraft:deep_ocean\",\n    \"minecraft:lukewarm_ocean\",\n    \"minecraft:deep_lukewarm_ocean\"\n  ]\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/purified_water_biomes.json",
    "content": "{\n  \"values\": []\n}"
  },
  {
    "path": "common/src/generated/resources/data/toughasnails/tags/worldgen/biome/warm_biomes.json",
    "content": "{\n  \"values\": [\n    \"minecraft:soul_sand_valley\",\n    \"minecraft:lush_caves\",\n    \"minecraft:mangrove_swamp\",\n    \"minecraft:jungle\",\n    \"minecraft:sparse_jungle\",\n    \"minecraft:bamboo_jungle\",\n    \"minecraft:savanna\",\n    \"minecraft:savanna_plateau\",\n    \"minecraft:windswept_savanna\",\n    \"minecraft:warm_ocean\",\n    \"minecraft:mushroom_fields\"\n  ]\n}"
  },
  {
    "path": "common/src/main/java/toughasnails/api/TANAPI.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api;\n\npublic class TANAPI\n{\n    public static final String MOD_ID = \"toughasnails\";\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/block/TANBlocks.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.block;\n\nimport net.minecraft.world.level.block.Block;\n\npublic class TANBlocks\n{\n    public static Block THERMOREGULATOR;\n    public static Block TEMPERATURE_GAUGE;\n    public static Block RAIN_COLLECTOR;\n    public static Block WATER_PURIFIER;\n}"
  },
  {
    "path": "common/src/main/java/toughasnails/api/blockentity/TANBlockEntityTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.blockentity;\n\nimport net.minecraft.world.level.block.entity.BlockEntityType;\n\npublic class TANBlockEntityTypes\n{\n    public static BlockEntityType<?> WATER_PURIFIER;\n    public static BlockEntityType<?> TEMPERATURE_GAUGE;\n    public static BlockEntityType<?> THERMOREGULATOR;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/container/TANContainerTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.container;\n\nimport net.minecraft.world.inventory.MenuType;\n\npublic class TANContainerTypes\n{\n    public static MenuType<?> WATER_PURIFIER;\n    public static MenuType<?> THERMOREGULATOR;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/crafting/TANRecipeBookCategories.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.crafting;\n\nimport net.minecraft.world.item.crafting.RecipeBookCategory;\n\npublic class TANRecipeBookCategories\n{\n    public static RecipeBookCategory WATER_PURIFYING;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/crafting/TANRecipeSerializers.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.crafting;\n\nimport net.minecraft.world.item.crafting.Recipe;\nimport net.minecraft.world.item.crafting.RecipeSerializer;\nimport net.minecraft.world.item.crafting.SingleRecipeInput;\n\npublic class TANRecipeSerializers\n{\n    public static RecipeSerializer<? extends Recipe<SingleRecipeInput>> WATER_PURIFYING;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/crafting/TANRecipeTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.crafting;\n\nimport net.minecraft.world.item.crafting.Recipe;\nimport net.minecraft.world.item.crafting.RecipeType;\nimport net.minecraft.world.item.crafting.SingleRecipeInput;\n\npublic class TANRecipeTypes\n{\n    public static RecipeType<? extends Recipe<SingleRecipeInput>> WATER_PURIFYING;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/damagesource/TANDamageTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.damagesource;\n\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.damagesource.DamageType;\nimport toughasnails.api.TANAPI;\n\npublic class TANDamageTypes\n{\n    public static final ResourceKey<DamageType> HYPERTHERMIA = register(\"hyperthermia\");\n    public static final ResourceKey<DamageType> THIRST = register(\"thirst\");\n\n    private static ResourceKey<DamageType> register(String name)\n    {\n        return ResourceKey.create(Registries.DAMAGE_TYPE, Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/enchantment/TANEnchantments.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.enchantment;\n\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.enchantment.Enchantment;\nimport toughasnails.core.ToughAsNails;\n\npublic class TANEnchantments\n{\n    public static ResourceKey<Enchantment> THERMAL_TUNING = key(\"thermal_tuning\");\n    public static ResourceKey<Enchantment> WATER_CLEANSING = key(\"water_cleansing\");\n\n    private static ResourceKey<Enchantment> key(String name)\n    {\n        return ResourceKey.create(Registries.ENCHANTMENT, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/item/TANItems.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.item;\n\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.level.block.Block;\n\npublic class TANItems\n{\n    // Block Items\n    public static Item THERMOREGULATOR;\n    public static Item TEMPERATURE_GAUGE;\n    public static Item RAIN_COLLECTOR;\n    public static Item WATER_PURIFIER;\n\n    // Items\n    public static Item THERMOMETER;\n\n    public static Item LEAF_HELMET;\n    public static Item LEAF_CHESTPLATE;\n    public static Item LEAF_LEGGINGS;\n    public static Item LEAF_BOOTS;\n\n    public static Item WOOL_HELMET;\n    public static Item WOOL_CHESTPLATE;\n    public static Item WOOL_LEGGINGS;\n    public static Item WOOL_BOOTS;\n\n    public static Item ICE_CREAM;\n    public static Item CHARC_0S;\n\n    public static Item EMPTY_LEATHER_CANTEEN;\n    public static Item LEATHER_DIRTY_WATER_CANTEEN;\n    public static Item LEATHER_WATER_CANTEEN;\n    public static Item LEATHER_PURIFIED_WATER_CANTEEN;\n\n    public static Item EMPTY_COPPER_CANTEEN;\n    public static Item COPPER_DIRTY_WATER_CANTEEN;\n    public static Item COPPER_WATER_CANTEEN;\n    public static Item COPPER_PURIFIED_WATER_CANTEEN;\n\n    public static Item EMPTY_IRON_CANTEEN;\n    public static Item IRON_DIRTY_WATER_CANTEEN;\n    public static Item IRON_WATER_CANTEEN;\n    public static Item IRON_PURIFIED_WATER_CANTEEN;\n\n    public static Item EMPTY_GOLD_CANTEEN;\n    public static Item GOLD_DIRTY_WATER_CANTEEN;\n    public static Item GOLD_WATER_CANTEEN;\n    public static Item GOLD_PURIFIED_WATER_CANTEEN;\n\n    public static Item EMPTY_DIAMOND_CANTEEN;\n    public static Item DIAMOND_DIRTY_WATER_CANTEEN;\n    public static Item DIAMOND_WATER_CANTEEN;\n    public static Item DIAMOND_PURIFIED_WATER_CANTEEN;\n\n    public static Item EMPTY_NETHERITE_CANTEEN;\n    public static Item NETHERITE_DIRTY_WATER_CANTEEN;\n    public static Item NETHERITE_WATER_CANTEEN;\n    public static Item NETHERITE_PURIFIED_WATER_CANTEEN;\n\n    public static Item DIRTY_WATER_BOTTLE;\n    public static Item PURIFIED_WATER_BOTTLE;\n\n    public static Item APPLE_JUICE;\n    public static Item CACTUS_JUICE;\n    public static Item CHORUS_FRUIT_JUICE;\n    public static Item GLOW_BERRY_JUICE;\n    public static Item MELON_JUICE;\n    public static Item PUMPKIN_JUICE;\n    public static Item SWEET_BERRY_JUICE;\n\n    public static Item TAN_ICON;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/particle/TANParticles.java",
    "content": "package toughasnails.api.particle;\n\nimport net.minecraft.core.particles.SimpleParticleType;\n\npublic class TANParticles\n{\n    public static SimpleParticleType THERMOREGULATOR_COOL;\n    public static SimpleParticleType THERMOREGULATOR_WARM;\n    public static SimpleParticleType THERMOREGULATOR_NEUTRAL;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/player/ITANPlayer.java",
    "content": "package toughasnails.api.player;\n\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.thirst.IThirst;\n\npublic interface ITANPlayer\n{\n    ITemperature getTemperatureData();\n    IThirst getThirstData();\n    boolean getClimateClemencyGranted();\n    void setClimateClemencyGranted(boolean value);\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/potion/TANEffects.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.potion;\n\nimport net.minecraft.core.Holder;\nimport net.minecraft.world.effect.MobEffect;\n\npublic class TANEffects\n{\n    public static Holder<MobEffect> THIRST;\n    public static Holder<MobEffect> ICE_RESISTANCE;\n    public static Holder<MobEffect> CLIMATE_CLEMENCY;\n    public static Holder<MobEffect> INTERNAL_WARMTH;\n    public static Holder<MobEffect> INTERNAL_CHILL;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/potion/TANPotions.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.potion;\n\nimport net.minecraft.core.Holder;\nimport net.minecraft.world.item.alchemy.Potion;\n\npublic class TANPotions\n{\n    public static Holder<Potion> ICE_RESISTANCE;\n    public static Holder<Potion> LONG_ICE_RESISTANCE;\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/temperature/IPlayerTemperatureModifier.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.temperature;\n\nimport net.minecraft.world.entity.player.Player;\n\npublic interface IPlayerTemperatureModifier\n{\n    TemperatureLevel modify(Player player, TemperatureLevel current);\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/temperature/IPositionalTemperatureModifier.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.temperature;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.world.level.Level;\n\npublic interface IPositionalTemperatureModifier\n{\n    TemperatureLevel modify(Level level, BlockPos pos, TemperatureLevel current);\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/temperature/IProximityBlockModifier.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.temperature;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.state.BlockState;\n\npublic interface IProximityBlockModifier {\n\n    Type getProximityType(Level level, BlockPos pos, BlockState state);\n\n    enum Type\n    {\n        HEATING, COOLING, NONE\n    }\n\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/temperature/ITemperature.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.temperature;\n\nimport net.minecraft.core.BlockPos;\n\nimport java.util.Set;\n\npublic interface ITemperature\n{\n    /**\n     * Get the temperature level.\n     * @return temperature level.\n     */\n    TemperatureLevel getLevel();\n\n    /**\n     * Get the number of ticks of hyperthermia.\n     * @return number of ticks.\n     */\n    int getHyperthermiaTicks();\n\n    /**\n     * Get the number of extremity delay ticks.\n     * @return number of ticks.\n     */\n    int getExtremityDelayTicks();\n\n    /**\n     * Get the number of ticks since water was touched.\n     * @return number of ticks.\n     */\n    int getDryTicks();\n\n    /**\n     * Get the last temperature level.\n     * @return temperature level.\n     */\n    TemperatureLevel getLastLevel();\n\n    /**\n     * Get the target temperature level.\n     * @return temperature level.\n     */\n    TemperatureLevel getTargetLevel();\n\n    /**\n     * Get the number of ticks to delay changing the temperature.\n     * @return number of ticks.\n     */\n    int getChangeDelayTicks();\n\n    /**\n     * Get the last number of ticks of hyperthermia.\n     * @return number of ticks.\n     */\n    int getLastHyperthermiaTicks();\n\n    /**\n     * Get the last positions of nearby thermoregulators.\n     * @return nearby thermoregulators.\n     */\n    Set<BlockPos> getLastNearbyThermoregulators();\n\n    /**\n     * Get the positions of nearby thermoregulators.\n     * @return nearby thermoregulators.\n     */\n    Set<BlockPos> getNearbyThermoregulators();\n\n    /**\n     * Set the temperature level.\n     * @param level temperature level\n     */\n    void setLevel(TemperatureLevel level);\n\n    /**\n     * Set the number of ticks of hyperthermia.\n     * @param ticks number of ticks.\n     */\n    void setHyperthermiaTicks(int ticks);\n\n    /**\n     * Set the number of extremity delay ticks.\n     * @param ticks number of ticks.\n     */\n    void setExtremityDelayTicks(int ticks);\n\n    /**\n     * Set the number of ticks since water was touched.\n     * @return number of ticks.\n     */\n    void setDryTicks(int ticks);\n\n\n    /**\n     * Set the last temperature level.\n     * @param level temperature level.\n     */\n    void setLastLevel(TemperatureLevel level);\n\n    /**\n     * Set the target temperature level.\n     * @param level temperature level.\n     */\n    void setTargetLevel(TemperatureLevel level);\n\n    /**\n     * Set the number of ticks to delay changing the temperature.\n     */\n    void setChangeDelayTicks(int ticks);\n\n    /**\n     * Set the last number of hyperthermia ticks.\n     * @param ticks number of ticks.\n     */\n    void setLastHyperthermiaTicks(int ticks);\n\n    /**\n     * Set the last nearby thermoregulators.\n     * @param values nearby thermoregulators.\n     */\n    void setLastNearbyThermoregulators(Set<BlockPos> values);\n\n    /**\n     * Set the nearby thermoregulators.\n     * @param values nearby thermoregulators.\n     */\n    void setNearbyThermoregulators(Set<BlockPos> values);\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/temperature/TemperatureHelper.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.temperature;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.state.BlockState;\n\npublic class TemperatureHelper\n{\n    /**\n     * Check the temperature at a given position.\n     * @param level the current level.\n     * @param pos the position to check.\n     * @return temperature level.\n     */\n    public static TemperatureLevel getTemperatureAtPos(Level level, BlockPos pos)\n    {\n        return Impl.INSTANCE.getTemperatureAtPos(level, pos);\n    }\n\n    /**\n     * Get the temperature for a player.\n     * @param player the player.\n     * @return temperature level.\n     */\n    public static TemperatureLevel getTemperatureForPlayer(Player player)\n    {\n        return getTemperatureData(player).getLevel();\n    }\n\n    /**\n     * Obtains the temperature data for a player.\n     * @param player the player to obtain temperature data for\n     * @return the player's temperature data\n     */\n    public static ITemperature getTemperatureData(Player player)\n    {\n        return Impl.INSTANCE.getPlayerTemperature(player);\n    }\n\n    /**\n     * Sets the number of ticks a player is experiencing hyperthermia.\n     * @param player the player.\n     * @param ticks number of ticks.\n     */\n    public static void setTicksHyperthermic(Player player, int ticks)\n    {\n        Impl.INSTANCE.setTicksHyperthermic(player, ticks);\n    }\n\n    /**\n     * Get the percentage at which the player is hyperthermic.\n     * @param player the player.\n     * @return percentage hyperthermic.\n     */\n    public static float getPercentHyperthermic(Player player)\n    {\n        return Impl.INSTANCE.getPercentHyperthermic(player);\n    }\n\n    /**\n     * Check whether the player is fully hyperthermic\n     * @param player the player.\n     * @return fully hyperthermic.\n     */\n    public static boolean isFullyHyperthermic(Player player)\n    {\n        return Impl.INSTANCE.isFullyHyperthermic(player);\n    }\n\n    /**\n     * Gets the number of ticks required to experience hyperthermia.\n     * @return The number of ticks required for hyperthermia.\n     */\n    public static int getTicksRequiredForHyperthermia()\n    {\n        return Impl.INSTANCE.getTicksRequiredForHyperthermia();\n    }\n\n    /**\n     * Gets the ticks at which the player is hyperthermic.\n     * @param player the player.\n     * @return number of ticks.\n     */\n    public static int getTicksHyperthermic(Player player)\n    {\n        return Impl.INSTANCE.getTicksHyperthermic(player);\n    }\n\n    /**\n     * Gets whether a state is heating.\n     * @param state the state to check.\n     * @return is heating.\n     */\n    public static boolean isHeatingBlock(BlockState state)\n    {\n        return Impl.INSTANCE.isHeating(state);\n    }\n\n    /**\n     * Gets whether a state is cooling.\n     * @param state the state to check.\n     * @return is cooling.\n     */\n    public static boolean isCoolingBlock(BlockState state)\n    {\n        return Impl.INSTANCE.isCooling(state);\n    }\n\n    /**\n     * Register a player temperature modifier.\n     * @param modifier the modifier.\n     */\n    public static void registerPlayerTemperatureModifier(IPlayerTemperatureModifier modifier)\n    {\n        Impl.INSTANCE.registerPlayerTemperatureModifier(modifier);\n    }\n\n    /**\n     * Register a positional temperature modifier.\n     * @param modifier the modifier.\n     */\n    public static void registerPositionalTemperatureModifier(IPositionalTemperatureModifier modifier)\n    {\n        Impl.INSTANCE.registerPositionalTemperatureModifier(modifier);\n    }\n\n    /**\n     * Register a proximity temperature modifier.\n     * @param modifier the modifier.\n     */\n    public static void registerProximityBlockModifier(IProximityBlockModifier modifier)\n    {\n        Impl.INSTANCE.registerProximityBlockModifier(modifier);\n    }\n\n    /**\n     * Checks whether temperature is enabled.\n     * @return whether temperature is enabled.\n     */\n    public static boolean isTemperatureEnabled()\n    {\n        return Impl.INSTANCE.isTemperatureEnabled();\n    }\n\n    /** Internal implementation details */\n    public static class Impl\n    {\n        public static TemperatureHelper.Impl.ITemperatureHelper INSTANCE = null;\n\n        public interface ITemperatureHelper\n        {\n            TemperatureLevel getTemperatureAtPos(Level level, BlockPos pos);\n            ITemperature getPlayerTemperature(Player player);\n            void setTicksHyperthermic(Player player, int ticks);\n            float getPercentHyperthermic(Player player);\n            boolean isFullyHyperthermic(Player player);\n            int getTicksRequiredForHyperthermia();\n            int getTicksHyperthermic(Player player);\n            boolean isHeating(BlockState state);\n            boolean isCooling(BlockState state);\n\n            void registerPlayerTemperatureModifier(IPlayerTemperatureModifier modifier);\n            void registerPositionalTemperatureModifier(IPositionalTemperatureModifier modifier);\n            void registerProximityBlockModifier(IProximityBlockModifier modifier);\n            boolean isTemperatureEnabled();\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/temperature/TemperatureLevel.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.temperature;\n\nimport net.minecraft.util.Mth;\n\npublic enum TemperatureLevel\n{\n    ICY, COLD, NEUTRAL, WARM, HOT;\n\n    public TemperatureLevel increment(int amount)\n    {\n        return TemperatureLevel.values()[Mth.clamp(this.ordinal() + amount, 0, TemperatureLevel.values().length - 1)];\n    }\n\n    public TemperatureLevel decrement(int amount)\n    {\n        return increment(-amount);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/thirst/IThirst.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.thirst;\n\npublic interface IThirst\n{\n    /**\n     * Get the level of thirst ranging from 0 to 20.\n     * @return The thirst level.\n     */\n    int getThirst();\n\n    /**\n     * Get the last level of thirst ranging from 0 to 20.\n     * @return The thirst level.\n     */\n    int getLastThirst();\n\n    /**\n     * Get the number of thirst ticks.\n     * @return The number of thirst ticks.\n     */\n    int getTickTimer();\n\n    /**\n     * Get the current hydration level.\n     * @return The hydration level.\n     */\n    float getHydration();\n\n    /**\n     * Get whether the last hydration value was zero.\n     * @return Whether the last hydration was zero.\n     */\n    boolean getLastHydrationZero();\n\n    /**\n     * Get the level of thirst exhaustion ranging from 0 to 40.\n     * @return The level of exhaustion.\n     */\n    float getExhaustion();\n\n    /**\n     * Set the thirst level.\n     * @param level thirst level\n     */\n    void setThirst(int level);\n\n    /**\n     * Add to the thirst level\n     * @param thirst amount to add to the thirst level.\n     */\n    void addThirst(int thirst);\n\n    /**\n     * Set the last thirst level.\n     * @param thirst thirst level\n     */\n    void setLastThirst(int thirst);\n\n    /**\n     * Set the tick timer.\n     * @param timer tick timer\n     */\n    void setTickTimer(int timer);\n\n    /**\n     * Add ticks to the tick timer\n     * @param ticks The number of thirst ticks.\n     */\n    void addTicks(int ticks);\n\n    /**\n     * Set the hydration level.\n     * @param hydration hydration level.\n     */\n    void setHydration(float hydration);\n\n    /**\n     * Set whether the last hydration value was zero.\n     * @param value value.\n     */\n    void setLastHydrationZero(boolean value);\n\n    /**\n     * Add to the hydration level.\n     * @param hydration amount of hydration to add.\n     */\n    void addHydration(float hydration);\n\n    /**\n     * Set the exhaustion level.\n     * @param exhaustion exhaustion level.\n     */\n    void setExhaustion(float exhaustion);\n\n    /**\n     * Add to the exhaustion level.\n     * @param exhaustion amount of exhaustion to add.\n     */\n    void addExhaustion(float exhaustion);\n\n    /**\n     * Consume a drink with the given thirst and hydration modifier.\n     * @param thirst amount to add to the thirst level.\n     * @param hydrationModifier modifier used to determine the amount of hydration to add.\n     */\n    void drink(int thirst, float hydrationModifier);\n\n    /**\n     * Checks whether the player is thirsty or not.\n     * @return whether the player is thirsty.\n     */\n    boolean isThirsty();\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/thirst/ThirstHelper.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.thirst;\n\nimport net.minecraft.world.entity.player.Player;\n\npublic class ThirstHelper\n{\n    /**\n     * Obtains the thirst data for a player.\n     * @param player the player to obtain thirst data for\n     * @return the player's thirst data\n     */\n    public static IThirst getThirst(Player player)\n    {\n        return Impl.INSTANCE.getThirst(player);\n    }\n\n    /**\n     * Checks whether a player is able to drink.\n     * @param player the player to check\n     * @param ignoreThirst allow drinking regardless of the player's thirst level\n     * @return whether the player can drink\n     */\n    public static boolean canDrink(Player player, boolean ignoreThirst)\n    {\n        return Impl.INSTANCE.canDrink(player, ignoreThirst);\n    }\n\n    /**\n     * Checks whether thirst is enabled.\n     * @return whether thirst is enabled.\n     */\n    public static boolean isThirstEnabled()\n    {\n        return Impl.INSTANCE.isThirstEnabled();\n    }\n\n    /** Internal implementation details */\n    public static class Impl\n    {\n        public static IThirstHelper INSTANCE = null;\n\n        public interface IThirstHelper\n        {\n            IThirst getThirst(Player player);\n            boolean canDrink(Player player, boolean ignoreThirst);\n            boolean isThirstEnabled();\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/thirst/WaterType.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.thirst;\n\npublic enum WaterType\n{\n    NORMAL(0.5F), DIRTY(1.0F), PURIFIED(0.0F);\n\n    private float poisonChance;\n\n    WaterType(float poisonChance)\n    {\n        this.poisonChance = poisonChance;\n    }\n\n    public float getPoisonChance()\n    {\n        return this.poisonChance;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/village/TANPoiTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.village;\n\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.entity.ai.village.poi.PoiType;\nimport toughasnails.api.TANAPI;\n\npublic class TANPoiTypes\n{\n    public static final ResourceKey<PoiType> CLIMATOLOGIST = createKey(\"climatologist\");\n\n    private static ResourceKey<PoiType> createKey(String name)\n    {\n        return ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/api/village/TANVillagerProfessions.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.api.village;\n\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.entity.npc.villager.VillagerProfession;\nimport toughasnails.core.ToughAsNails;\n\npublic class TANVillagerProfessions\n{\n    public static final ResourceKey<VillagerProfession> CLIMATOLOGIST = createKey(\"climatologist\");\n\n    private static ResourceKey<VillagerProfession> createKey(String name)\n    {\n        return ResourceKey.create(Registries.VILLAGER_PROFESSION, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/RainCollectorBlock.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.sounds.SoundEvents;\nimport net.minecraft.sounds.SoundSource;\nimport net.minecraft.stats.Stats;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.level.BlockGetter;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.block.state.StateDefinition;\nimport net.minecraft.world.level.block.state.properties.IntegerProperty;\nimport net.minecraft.world.level.pathfinder.PathComputationType;\nimport net.minecraft.world.phys.BlockHitResult;\nimport net.minecraft.world.phys.shapes.BooleanOp;\nimport net.minecraft.world.phys.shapes.CollisionContext;\nimport net.minecraft.world.phys.shapes.Shapes;\nimport net.minecraft.world.phys.shapes.VoxelShape;\nimport toughasnails.api.item.TANItems;\n\npublic class RainCollectorBlock extends Block\n{\n    private static final VoxelShape INSIDE = box(2.0D, 15.0D, 2.0D, 14.0D, 16.0D, 14.0D);\n    protected static final VoxelShape SHAPE = Shapes.join(Shapes.block(), Shapes.or(INSIDE), BooleanOp.ONLY_FIRST);\n    public static final IntegerProperty LEVEL = IntegerProperty.create(\"level\", 0, 3);\n\n    public RainCollectorBlock(Properties properties)\n    {\n        super(properties);\n        this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0)));\n    }\n\n    @Override\n    public VoxelShape getShape(BlockState p_151964_, BlockGetter p_151965_, BlockPos p_151966_, CollisionContext p_151967_) {\n        return SHAPE;\n    }\n\n    @Override\n    protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult)\n    {\n        if (stack.isEmpty() || stack.getItem() != Items.GLASS_BOTTLE)\n            return InteractionResult.PASS;\n\n        int waterLevel = state.getValue(LEVEL);\n\n        if (waterLevel > 0 && !worldIn.isClientSide())\n        {\n            if (!player.getAbilities().instabuild)\n            {\n                ItemStack newStack = new ItemStack(TANItems.PURIFIED_WATER_BOTTLE);\n                player.awardStat(Stats.USE_CAULDRON);\n                stack.shrink(1);\n\n                if (stack.isEmpty()) player.setItemInHand(hand, newStack);\n                else if (!player.getInventory().add(newStack)) player.drop(newStack, false);\n                else player.inventoryMenu.sendAllDataToRemote();\n            }\n\n            worldIn.playSound(null, pos, SoundEvents.BOTTLE_FILL, SoundSource.BLOCKS, 1.0F, 1.0F);\n            this.setWaterLevel(worldIn, pos, state, waterLevel - 1);\n        }\n\n        return InteractionResult.SUCCESS;\n    }\n\n    public void setWaterLevel(Level world, BlockPos pos, BlockState state, int level)\n    {\n        world.setBlock(pos, state.setValue(LEVEL, Integer.valueOf(Mth.clamp(level, 0, 3))), 2);\n        world.updateNeighbourForOutputSignal(pos, this);\n    }\n\n    @Override\n    public void handlePrecipitation(BlockState state, Level level, BlockPos pos, Biome.Precipitation precipitation)\n    {\n        if (shouldHandlePrecipitation(level, precipitation) && state.getValue(LEVEL) < 3)\n        {\n            level.setBlock(pos, state.cycle(LEVEL), 2);\n        }\n    }\n\n    protected static boolean shouldHandlePrecipitation(Level level, Biome.Precipitation precipitation)\n    {\n        if (precipitation == Biome.Precipitation.RAIN)\n        {\n            return level.getRandom().nextFloat() < 0.6F;\n        }\n        else if (precipitation == Biome.Precipitation.SNOW)\n        {\n            return level.getRandom().nextFloat() < 0.3F;\n        }\n        else\n        {\n            return false;\n        }\n    }\n\n    @Override\n    public boolean hasAnalogOutputSignal(BlockState state)\n    {\n        return true;\n    }\n\n    @Override\n    public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos, Direction direction)\n    {\n        return state.getValue(LEVEL);\n    }\n\n    @Override\n    protected boolean isPathfindable(BlockState state, PathComputationType pathComputationType)\n    {\n        return false;\n    }\n\n    @Override\n    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder)\n    {\n        builder.add(LEVEL);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/TemperatureGaugeBlock.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block;\n\nimport com.mojang.serialization.MapCodec;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.level.BlockGetter;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.BaseEntityBlock;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.RenderShape;\nimport net.minecraft.world.level.block.entity.BlockEntity;\nimport net.minecraft.world.level.block.entity.BlockEntityTicker;\nimport net.minecraft.world.level.block.entity.BlockEntityType;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.block.state.StateDefinition;\nimport net.minecraft.world.level.block.state.properties.BlockStateProperties;\nimport net.minecraft.world.level.block.state.properties.BooleanProperty;\nimport net.minecraft.world.level.block.state.properties.IntegerProperty;\nimport net.minecraft.world.level.gameevent.GameEvent;\nimport net.minecraft.world.phys.BlockHitResult;\nimport net.minecraft.world.phys.shapes.CollisionContext;\nimport net.minecraft.world.phys.shapes.VoxelShape;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.block.entity.TemperatureGaugeBlockEntity;\nimport toughasnails.temperature.TemperatureHelperImpl;\n\nimport javax.annotation.Nullable;\n\npublic class TemperatureGaugeBlock extends BaseEntityBlock\n{\n    public static final MapCodec<TemperatureGaugeBlock> CODEC = simpleCodec(TemperatureGaugeBlock::new);\n    protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D);\n    public static final IntegerProperty POWER = BlockStateProperties.POWER;\n    public static final BooleanProperty INVERTED = BlockStateProperties.INVERTED;\n\n    @Override\n    public MapCodec<TemperatureGaugeBlock> codec()\n    {\n        return CODEC;\n    }\n\n    public TemperatureGaugeBlock(Properties properties)\n    {\n        super(properties);\n        this.registerDefaultState(this.stateDefinition.any().setValue(POWER, Integer.valueOf(0)).setValue(INVERTED, false));\n    }\n\n    @Override\n    protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult)\n    {\n        if (player.mayBuild())\n        {\n            if (level.isClientSide())\n            {\n                return InteractionResult.SUCCESS;\n            }\n            else\n            {\n                BlockState blockstate = (BlockState)state.cycle(INVERTED);\n                level.setBlock(pos, blockstate, 2);\n                level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, blockstate));\n                 updateSignalStrength(blockstate, level, pos);\n                return InteractionResult.CONSUME;\n            }\n        }\n        else\n        {\n            return super.useWithoutItem(state, level, pos, player, hitResult);\n        }\n    }\n\n    @Override\n    public VoxelShape getShape(BlockState state, BlockGetter reader, BlockPos pos, CollisionContext selectionContext)\n    {\n        return SHAPE;\n    }\n\n    @Override\n    public RenderShape getRenderShape(BlockState state)\n    {\n        return RenderShape.MODEL;\n    }\n\n    @Override\n    public boolean useShapeForLightOcclusion(BlockState state)\n    {\n        return true;\n    }\n\n    @Override\n    public boolean isSignalSource(BlockState state)\n    {\n        return true;\n    }\n\n    @Override\n    public int getSignal(BlockState state, BlockGetter getter, BlockPos pos, Direction direction)\n    {\n        return state.getValue(POWER);\n    }\n\n    @Override\n    public BlockEntity newBlockEntity(BlockPos $$0, BlockState $$1) {\n        return new TemperatureGaugeBlockEntity($$0, $$1);\n    }\n\n    @Nullable\n    @Override\n    public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> type)\n    {\n        return !level.isClientSide()\n                ? createTickerHelper(type, (BlockEntityType<TemperatureGaugeBlockEntity>)TANBlockEntityTypes.TEMPERATURE_GAUGE, TemperatureGaugeBlock::tickEntity)\n                : null;\n    }\n\n    private static void tickEntity(Level level, BlockPos pos, BlockState state, TemperatureGaugeBlockEntity blockEntity)\n    {\n        if (level.getGameTime() % 20L == 0L) {\n            updateSignalStrength(state, level, pos);\n        }\n    }\n\n    @Override\n    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder)\n    {\n        builder.add(POWER, INVERTED);\n    }\n\n    private static void updateSignalStrength(BlockState state, Level level, BlockPos pos)\n    {\n        TemperatureLevel temperatureLevel = TemperatureHelperImpl.getTemperatureAtPosWithoutProximity(level, pos);\n        int strength;\n\n        if (state.getValue(INVERTED)) {\n            strength = (Mth.clamp(temperatureLevel.ordinal(), 2, 4) - 2) * 8 - 1;\n        }\n        else\n        {\n            strength = 15 - Mth.clamp(temperatureLevel.ordinal(), 0, 2) * 8;\n        }\n\n        strength = Mth.clamp(strength, 0, 15);\n        if (state.getValue(POWER) != strength) {\n            level.setBlock(pos, state.setValue(POWER, strength), 3);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/ThermoregulatorBlock.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block;\n\nimport com.mojang.serialization.MapCodec;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.core.particles.ParticleOptions;\nimport net.minecraft.util.RandomSource;\nimport net.minecraft.world.Containers;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.item.context.BlockPlaceContext;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.*;\nimport net.minecraft.world.level.block.entity.BlockEntity;\nimport net.minecraft.world.level.block.entity.BlockEntityTicker;\nimport net.minecraft.world.level.block.entity.BlockEntityType;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.block.state.StateDefinition;\nimport net.minecraft.world.level.block.state.properties.BlockStateProperties;\nimport net.minecraft.world.level.block.state.properties.BooleanProperty;\nimport net.minecraft.world.level.block.state.properties.EnumProperty;\nimport net.minecraft.world.level.redstone.Orientation;\nimport net.minecraft.world.phys.BlockHitResult;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\nimport toughasnails.api.particle.TANParticles;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\n\nimport javax.annotation.Nullable;\nimport java.util.function.ToIntFunction;\n\npublic class ThermoregulatorBlock extends BaseEntityBlock\n{\n    public static final MapCodec<WaterPurifierBlock> CODEC = simpleCodec(WaterPurifierBlock::new);\n    public static final EnumProperty<Direction> FACING = HorizontalDirectionalBlock.FACING;\n    public static final BooleanProperty COOLING = BooleanProperty.create(\"cooling\");\n    public static final BooleanProperty HEATING = BooleanProperty.create(\"heating\");\n    public static final BooleanProperty ENABLED = BlockStateProperties.ENABLED;\n\n    public ThermoregulatorBlock(Properties properties)\n    {\n        super(properties);\n        this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(COOLING, false).setValue(HEATING, false).setValue(ENABLED, true));\n    }\n\n    @Override\n    protected MapCodec<? extends BaseEntityBlock> codec()\n    {\n        return CODEC;\n    }\n\n    @Override\n    protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult)\n    {\n        if (level.isClientSide())\n        {\n            return InteractionResult.SUCCESS;\n        }\n        else\n        {\n            player.openMenu(state.getMenuProvider(level, pos));\n            return InteractionResult.CONSUME;\n        }\n    }\n\n    @Override\n    public BlockEntity newBlockEntity(BlockPos pos, BlockState state)\n    {\n        return new ThermoregulatorBlockEntity(pos, state);\n    }\n\n    @Override\n    @Nullable\n    public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> type)\n    {\n        return level.isClientSide() ? null : createTickerHelper(type, (BlockEntityType<ThermoregulatorBlockEntity>) TANBlockEntityTypes.THERMOREGULATOR, ThermoregulatorBlockEntity::serverTick);\n    }\n\n    public static ToIntFunction<BlockState> lightLevel(int level)\n    {\n        return (state) -> {\n            boolean cooling = state.getValue(COOLING);\n            boolean heating = state.getValue(HEATING);\n\n            return ((cooling ? 1: 0) + (heating ? 1: 0)) * level;\n        };\n    }\n\n    @Override\n    public BlockState getStateForPlacement(BlockPlaceContext $$0) {\n        return (BlockState)this.defaultBlockState().setValue(FACING, $$0.getHorizontalDirection().getOpposite()).setValue(ENABLED, true);\n    }\n\n    @Override\n    public BlockState rotate(BlockState $$0, Rotation $$1) {\n        return (BlockState)$$0.setValue(FACING, $$1.rotate((Direction)$$0.getValue(FACING)));\n    }\n\n    @Override\n    public BlockState mirror(BlockState $$0, Mirror $$1) {\n        return $$0.rotate($$1.getRotation((Direction)$$0.getValue(FACING)));\n    }\n\n    @Override\n    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder)\n    {\n        builder.add(FACING, COOLING, HEATING, ENABLED);\n    }\n\n    @Override\n    public RenderShape getRenderShape(BlockState state)\n    {\n        return RenderShape.MODEL;\n    }\n\n    @Override\n    public void onPlace(BlockState state, Level level, BlockPos $$2, BlockState $$3, boolean $$4)\n    {\n        if (!$$3.is(state.getBlock())) {\n            this.checkPoweredState(level, $$2, state);\n        }\n    }\n\n    @Override\n    public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, Orientation orientation, boolean movedByPiston)\n    {\n        this.checkPoweredState(level, pos, state);\n    }\n\n    private void checkPoweredState(Level level, BlockPos pos, BlockState state)\n    {\n        boolean flag = !level.hasNeighborSignal(pos);\n        if (flag != state.getValue(ENABLED)) {\n            level.setBlock(pos, state.setValue(ENABLED, Boolean.valueOf(flag)), 2);\n        }\n\n    }\n\n    @Override\n    public boolean hasAnalogOutputSignal(BlockState state)\n    {\n        return true;\n    }\n\n    @Override\n    public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos, Direction direction)\n    {\n        return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(level.getBlockEntity(pos));\n    }\n\n    @Override\n    public void animateTick(BlockState p_221253_, Level p_221254_, BlockPos p_221255_, RandomSource p_221256_)\n    {\n        boolean cooling = p_221253_.getValue(COOLING);\n        boolean heating = p_221253_.getValue(HEATING);\n\n        Direction direction = p_221253_.getValue(FACING);\n        Direction.Axis direction$axis = direction.getAxis();\n        BlockPos blockpos = p_221255_.relative(direction);\n        BlockState blockstate = p_221254_.getBlockState(blockpos);\n\n        if ((cooling || heating) && !isFaceFull(blockstate.getCollisionShape(p_221254_, blockpos), direction.getOpposite()))\n        {\n            double d0 = (double)p_221255_.getX() + 0.5D;\n            double d1 = (double)p_221255_.getY() + 0.5D;\n            double d2 = (double)p_221255_.getZ() + 0.5D;\n\n            double d4 = (p_221256_.nextDouble() * 0.3D) - (p_221256_.nextDouble() * 0.3D);\n            double d5 = direction$axis == Direction.Axis.X ? (double)direction.getStepX() * 0.55D : d4;\n            double d6 = direction$axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.55D : d4;\n\n            double ymove = (p_221256_.nextDouble() * 0.05D) - (p_221256_.nextDouble() * 0.05D);\n            double xmove = direction$axis == Direction.Axis.X ? (double)direction.getStepX() * 0.15D : ymove;\n            double zmove = direction$axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.15D : ymove;\n\n            ParticleOptions particle = TANParticles.THERMOREGULATOR_NEUTRAL;\n            if (cooling && !heating) { particle = TANParticles.THERMOREGULATOR_COOL; }\n            if (!cooling && heating) { particle = TANParticles.THERMOREGULATOR_WARM; }\n\n            p_221254_.addParticle(particle, d0 + d5, d1 + d4, d2 + d6, xmove, ymove, zmove);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/WaterPurifierBlock.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block;\n\nimport com.mojang.serialization.MapCodec;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.core.component.DataComponents;\nimport net.minecraft.core.particles.ParticleTypes;\nimport net.minecraft.util.RandomSource;\nimport net.minecraft.world.Containers;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.context.BlockPlaceContext;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.*;\nimport net.minecraft.world.level.block.entity.BlockEntity;\nimport net.minecraft.world.level.block.entity.BlockEntityTicker;\nimport net.minecraft.world.level.block.entity.BlockEntityType;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.block.state.StateDefinition;\nimport net.minecraft.world.level.block.state.properties.BooleanProperty;\nimport net.minecraft.world.level.block.state.properties.EnumProperty;\nimport net.minecraft.world.phys.BlockHitResult;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\nimport toughasnails.block.entity.WaterPurifierBlockEntity;\n\nimport javax.annotation.Nullable;\n\npublic class WaterPurifierBlock extends BaseEntityBlock\n{\n    public static final MapCodec<WaterPurifierBlock> CODEC = simpleCodec(WaterPurifierBlock::new);\n    public static final EnumProperty<Direction> FACING = HorizontalDirectionalBlock.FACING;\n    public static final BooleanProperty PURIFYING = BooleanProperty.create(\"filtering\");\n\n    public WaterPurifierBlock(Properties builderIn)\n    {\n        super(builderIn);\n        this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(PURIFYING, Boolean.valueOf(false)));\n    }\n\n    @Override\n    protected MapCodec<? extends BaseEntityBlock> codec()\n    {\n        return CODEC;\n    }\n\n    @Override\n    protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult blockHitResult)\n    {\n        if (level.isClientSide())\n        {\n            return InteractionResult.SUCCESS;\n        }\n        else\n        {\n            player.openMenu(state.getMenuProvider(level, pos));\n            return InteractionResult.CONSUME;\n        }\n    }\n\n    @Override\n    public BlockEntity newBlockEntity(BlockPos pos, BlockState state)\n    {\n        return new WaterPurifierBlockEntity(pos, state);\n    }\n\n    @Override\n    @Nullable\n    public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> type)\n    {\n        return level.isClientSide() ? null : createTickerHelper(type, (BlockEntityType<WaterPurifierBlockEntity>) TANBlockEntityTypes.WATER_PURIFIER, WaterPurifierBlockEntity::serverTick);\n    }\n\n    @Override\n    public BlockState getStateForPlacement(BlockPlaceContext context)\n    {\n        return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite());\n    }\n\n    @Override\n    public boolean hasAnalogOutputSignal(BlockState state)\n    {\n        return true;\n    }\n\n    @Override\n    public int getAnalogOutputSignal(BlockState blockState, Level worldIn, BlockPos pos, Direction direction)\n    {\n        return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(worldIn.getBlockEntity(pos));\n    }\n\n    @Override\n    public BlockState rotate(BlockState state, Rotation rot)\n    {\n        return state.setValue(FACING, rot.rotate(state.getValue(FACING)));\n    }\n\n    @Override\n    public BlockState mirror(BlockState state, Mirror mirror)\n    {\n        return state.rotate(mirror.getRotation(state.getValue(FACING)));\n    }\n\n    @Override\n    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder)\n    {\n        builder.add(FACING, PURIFYING);\n    }\n\n    @Override\n    public RenderShape getRenderShape(BlockState state)\n    {\n        return RenderShape.MODEL;\n    }\n\n    @Override\n    public void animateTick(BlockState p_221253_, Level p_221254_, BlockPos p_221255_, RandomSource p_221256_)\n    {\n        if (p_221253_.getValue(PURIFYING) && p_221256_.nextInt(12) == 0)\n        {\n            double d0 = (double)p_221255_.getX() + 0.5D;\n            double d1 = (double)p_221255_.getY() + 0.4D;\n            double d2 = (double)p_221255_.getZ() + 0.5D;\n\n            Direction direction = p_221253_.getValue(FACING);\n            Direction.Axis direction$axis = direction.getAxis();\n            double d4 = p_221256_.nextDouble() * 0.4D - 0.2D;\n            double d5 = direction$axis == Direction.Axis.X ? (double)direction.getStepX() * 0.55D : d4;\n            double d6 = p_221256_.nextDouble() * 1.0D / 16.0D;\n            double d7 = direction$axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.55D : d4;\n            p_221254_.addParticle(ParticleTypes.DRIPPING_WATER, d0 + d5, d1 + d6, d2 + d7, 0.0D, 0.0D, 0.0D);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/entity/TemperatureGaugeBlockEntity.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block.entity;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.world.level.block.entity.BlockEntity;\nimport net.minecraft.world.level.block.state.BlockState;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\n\npublic class TemperatureGaugeBlockEntity extends BlockEntity\n{\n    public TemperatureGaugeBlockEntity(BlockPos pos, BlockState state) {\n        super(TANBlockEntityTypes.TEMPERATURE_GAUGE, pos, state);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/entity/ThermoregulatorBlockEntity.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block.entity;\n\nimport com.google.common.collect.ImmutableSet;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.NonNullList;\nimport net.minecraft.nbt.*;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.world.Container;\nimport net.minecraft.world.ContainerHelper;\nimport net.minecraft.world.WorldlyContainer;\nimport net.minecraft.world.entity.player.Inventory;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.inventory.ContainerData;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.entity.BaseContainerBlockEntity;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.storage.ValueInput;\nimport net.minecraft.world.level.storage.ValueOutput;\nimport net.minecraft.world.phys.AABB;\nimport org.jetbrains.annotations.Nullable;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.block.ThermoregulatorBlock;\nimport toughasnails.container.ThermoregulatorContainer;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModTags;\nimport toughasnails.temperature.AreaFill;\n\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\npublic class ThermoregulatorBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer\n{\n    /** Radius at which to inform players of a nearby thermoregulator **/\n    public static final int INFORM_PLAYER_RADIUS = 20;\n    private static final int SPREAD_RADIUS = 16;\n\n    public static final int CONSUMABLE_DURATION = 1600;\n\n    public static final int SLOT_COOLING = 0;\n    public static final int SLOT_HEATING = 1;\n\n    private NonNullList<ItemStack> items = NonNullList.withSize(2, ItemStack.EMPTY);\n\n    private int coolingTimeRemaining;\n    private int heatingTimeRemaining;\n    private int fillTimer = 0;\n    private Set<BlockPos> filledBlocks = new HashSet<>();\n\n    protected final ContainerData dataAccess = new ContainerData()\n    {\n        @Override\n        public int get(int index)\n        {\n            switch(index) {\n                case 0:\n                    return ThermoregulatorBlockEntity.this.coolingTimeRemaining;\n                case 1:\n                    return ThermoregulatorBlockEntity.this.heatingTimeRemaining;\n                default:\n                    return 0;\n            }\n        }\n\n        @Override\n        public void set(int index, int value)\n        {\n            switch(index) {\n                case 0:\n                    ThermoregulatorBlockEntity.this.coolingTimeRemaining = value;\n                    break;\n                case 1:\n                    ThermoregulatorBlockEntity.this.heatingTimeRemaining = value;\n                    break;\n            }\n\n        }\n\n        @Override\n        public int getCount()\n        {\n            return 2;\n        }\n    };\n\n\n    public ThermoregulatorBlockEntity(BlockPos pos, BlockState state)\n    {\n        super(TANBlockEntityTypes.THERMOREGULATOR, pos, state);\n    }\n\n    @Override\n    public void loadAdditional(ValueInput input)\n    {\n        super.loadAdditional(input);\n        this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);\n        ContainerHelper.loadAllItems(input, this.items);\n        this.coolingTimeRemaining = input.getInt(\"CoolingTimeRemaining\").orElse(0);\n        this.heatingTimeRemaining = input.getInt(\"HeatingTimeRemaining\").orElse(0);\n        this.fillTimer = input.getInt(\"FillTimer\").orElse(0);\n\n        ValueInput.TypedInputList<BlockPos> list = input.listOrEmpty(\"FilledBlocks\", BlockPos.CODEC);\n        list.forEach(pos -> this.filledBlocks.add(pos));\n        this.filledBlocks = new HashSet<>();\n    }\n\n    @Override\n    public void saveAdditional(ValueOutput output)\n    {\n        super.saveAdditional(output);\n        output.putInt(\"CoolingTimeRemaining\", this.coolingTimeRemaining);\n        output.putInt(\"HeatingTimeRemaining\", this.heatingTimeRemaining);\n        output.putInt(\"FillTimer\", this.fillTimer);\n\n        ValueOutput.TypedOutputList<BlockPos> list = output.list(\"FilledBlocks\", BlockPos.CODEC);\n        this.filledBlocks.stream().forEach(pos -> {\n            list.add(pos);\n        });\n\n        ContainerHelper.saveAllItems(output, this.items);\n    }\n\n    @Override\n    public ClientboundBlockEntityDataPacket getUpdatePacket()\n    {\n        return ClientboundBlockEntityDataPacket.create(this);\n    }\n\n    @Override\n    public CompoundTag getUpdateTag(HolderLookup.Provider lookup)\n    {\n        return this.saveCustomOnly(lookup);\n    }\n\n    public static void serverTick(Level level, BlockPos pos, BlockState state, ThermoregulatorBlockEntity blockEntity)\n    {\n        boolean previouslyCooling = blockEntity.isCooling();\n        boolean previouslyHeating = blockEntity.isHeating();\n        boolean changed = false;\n\n        if (!state.getValue(ThermoregulatorBlock.ENABLED))\n        {\n            blockEntity.filledBlocks.clear();\n\n            if (state.getValue(ThermoregulatorBlock.COOLING) || state.getValue(ThermoregulatorBlock.HEATING))\n            {\n                state = state.setValue(ThermoregulatorBlock.COOLING, false).setValue(ThermoregulatorBlock.HEATING, false);\n                level.setBlock(pos, state, 3);\n                setChanged(level, pos, state);\n            }\n\n            return;\n        }\n\n        if (blockEntity.isCooling()) --blockEntity.coolingTimeRemaining;\n        if (blockEntity.isHeating()) --blockEntity.heatingTimeRemaining;\n\n        if (!blockEntity.isCooling())\n        {\n            ItemStack fuel = blockEntity.items.get(SLOT_COOLING);\n\n            if (!fuel.isEmpty())\n            {\n                Item fuelItem = fuel.getItem();\n                blockEntity.coolingTimeRemaining = CONSUMABLE_DURATION;\n                changed = true;\n                fuel.shrink(1);\n\n                if (fuel.isEmpty())\n                {\n                    blockEntity.items.set(SLOT_COOLING, fuelItem.getCraftingRemainder());\n                }\n            }\n        }\n\n        if (!blockEntity.isHeating())\n        {\n            ItemStack fuel = blockEntity.items.get(SLOT_HEATING);\n\n            if (!fuel.isEmpty())\n            {\n                Item fuelItem = fuel.getItem();\n                blockEntity.heatingTimeRemaining = CONSUMABLE_DURATION;\n                changed = true;\n                fuel.shrink(1);\n\n                if (fuel.isEmpty())\n                {\n                    blockEntity.items.set(SLOT_HEATING, fuelItem.getCraftingRemainder());\n                }\n            }\n        }\n\n        if (state.getValue(ThermoregulatorBlock.COOLING) != blockEntity.isCooling())\n        {\n            changed = true;\n            state = state.setValue(ThermoregulatorBlock.COOLING, blockEntity.isCooling());\n            level.setBlock(pos, state, 3);\n        }\n\n        if (state.getValue(ThermoregulatorBlock.HEATING) != blockEntity.isHeating())\n        {\n            changed = true;\n            state = state.setValue(ThermoregulatorBlock.HEATING, blockEntity.isHeating());\n            level.setBlock(pos, state, 3);\n        }\n\n        if (!blockEntity.isHeating() && !blockEntity.isCooling())\n        {\n            blockEntity.filledBlocks.clear();\n        }\n\n        // Fill every second\n        if ((blockEntity.isCooling() || blockEntity.isHeating()) && blockEntity.fillTimer % 20 == 0)\n        {\n            // Update nearby thermoregulators for players\n            for (ServerPlayer player : level.getEntitiesOfClass(ServerPlayer.class, new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX(), pos.getY() - 4, pos.getZ()).inflate(INFORM_PLAYER_RADIUS, (double) INFORM_PLAYER_RADIUS / 2.0, INFORM_PLAYER_RADIUS))) {\n                ITemperature temperature = TemperatureHelper.getTemperatureData(player);\n                temperature.getNearbyThermoregulators().add(pos);\n            }\n\n            // Perform fill\n            BlockPos fillStart = pos.relative(state.getValue(ThermoregulatorBlock.FACING));\n\n            blockEntity.filledBlocks.clear();\n            AreaFill.fill(level, fillStart, new AreaFill.PositionChecker() {\n                @Override\n                public void onSolid(Level level, AreaFill.FillPos pos) {}\n\n                @Override\n                public void onPassable(Level level, AreaFill.FillPos pos)\n                {\n                    blockEntity.filledBlocks.add(pos.pos());\n                }\n\n                @Override\n                public boolean isPassable(Level level, AreaFill.FillPos pos)\n                {\n                    BlockState state = level.getBlockState(pos.pos());\n                    return isConfined(level, pos.pos()) && (state.isAir() || state.is(ModTags.Blocks.PASSABLE_BLOCKS) || !isFlowBlocking(level, pos, state));\n                }\n            }, SPREAD_RADIUS);\n\n            changed = true;\n        }\n\n        ++blockEntity.fillTimer;\n\n        // Mark as changed\n        if (changed)\n        {\n            setChanged(level, pos, state);\n            level.sendBlockUpdated(pos, state, state, 3);\n        }\n    }\n\n    public Effect getEffectAtPos(BlockPos pos)\n    {\n        if (this.filledBlocks.contains(pos)) return this.getEffect();\n        else return Effect.NONE;\n    }\n\n    public ImmutableSet<BlockPos> getFilledBlocks()\n    {\n        return ImmutableSet.copyOf(this.filledBlocks);\n    }\n\n    public Effect getEffect()\n    {\n        boolean cooling = isCooling();\n        boolean heating = isHeating();\n\n        if (cooling && heating) return Effect.NEUTRALIZING;\n        else if (cooling) return Effect.COOLING;\n        else if (heating) return Effect.HEATING;\n        else return Effect.NONE;\n    }\n\n    public boolean isCooling()\n    {\n        return this.coolingTimeRemaining > 0;\n    }\n\n    public boolean isHeating()\n    {\n        return this.heatingTimeRemaining > 0;\n    }\n\n    @Override\n    public boolean stillValid(Player player)\n    {\n        return Container.stillValidBlockEntity(this, player);\n    }\n\n    @Override\n    protected AbstractContainerMenu createMenu(int id, Inventory player)\n    {\n        return new ThermoregulatorContainer(id, player, this, this.dataAccess);\n    }\n\n    @Override\n    protected Component getDefaultName()\n    {\n        return Component.translatable(\"container.toughasnails.thermoregulator\");\n    }\n\n    @Override\n    public int[] getSlotsForFace(Direction direction)\n    {\n        if (direction == Direction.UP)\n            return new int[]{SLOT_COOLING, SLOT_HEATING};\n\n        BlockState state = this.getBlockState();\n        Direction facing = state.getValue(ThermoregulatorBlock.FACING);\n\n        if (facing.getClockWise() == direction) return new int[]{SLOT_COOLING};\n        else if (facing.getCounterClockWise() == direction) return new int[]{SLOT_HEATING};\n        else return new int[]{};\n    }\n\n    @Override\n    public boolean canPlaceItemThroughFace(int index, ItemStack stack, @Nullable Direction direction)\n    {\n        return this.canPlaceItem(index, stack);\n    }\n\n    @Override\n    public boolean canPlaceItem(int index, ItemStack stack)\n    {\n        if (index == SLOT_COOLING) return isCoolingFuel(stack);\n        else if (index == SLOT_HEATING) return isHeatingFuel(stack);\n        else return false;\n    }\n\n    @Override\n    public boolean canTakeItemThroughFace(int index, ItemStack stack, Direction direction) {\n        return false;\n    }\n\n    @Override\n    public int getContainerSize()\n    {\n        return this.items.size();\n    }\n\n    @Override\n    public boolean isEmpty()\n    {\n        for (ItemStack itemstack : this.items)\n        {\n            if (!itemstack.isEmpty()) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    @Override\n    public ItemStack getItem(int index)\n    {\n        return this.items.get(index);\n    }\n\n    @Override\n    public ItemStack removeItem(int index, int count)\n    {\n        return ContainerHelper.removeItem(this.items, index, count);\n    }\n\n    @Override\n    protected NonNullList<ItemStack> getItems()\n    {\n        return this.items;\n    }\n\n    @Override\n    protected void setItems(NonNullList<ItemStack> items)\n    {\n        this.items = items;\n    }\n\n    @Override\n    public ItemStack removeItemNoUpdate(int index)\n    {\n        return ContainerHelper.takeItem(this.items, index);\n    }\n\n    @Override\n    public void setItem(int index, ItemStack stack)\n    {\n        ItemStack currentStack = this.items.get(index);\n        boolean sameItem = !stack.isEmpty() && ItemStack.isSameItemSameComponents(stack, currentStack);\n        this.items.set(index, stack);\n\n        if (stack.getCount() > this.getMaxStackSize())\n        {\n            stack.setCount(this.getMaxStackSize());\n        }\n\n        if (!sameItem)\n        {\n            this.setChanged();\n        }\n    }\n\n    @Override\n    public void clearContent()\n    {\n        this.items.clear();\n    }\n\n    public static boolean isCoolingFuel(ItemStack stack)\n    {\n        return stack.is(ModTags.Items.THERMOREGULATOR_COOLING_FUEL);\n    }\n\n    public static boolean isHeatingFuel(ItemStack stack)\n    {\n        return stack.is(ModTags.Items.THERMOREGULATOR_HEATING_FUEL);\n    }\n\n    public enum Effect\n    {\n        COOLING, HEATING, NEUTRALIZING, NONE;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/block/entity/WaterPurifierBlockEntity.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.block.entity;\n\nimport com.google.common.collect.ImmutableMap;\nimport net.minecraft.core.*;\nimport net.minecraft.core.registries.BuiltInRegistries;\nimport net.minecraft.nbt.CompoundTag;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.tags.ItemTags;\nimport net.minecraft.tags.TagKey;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.ContainerHelper;\nimport net.minecraft.world.WorldlyContainer;\nimport net.minecraft.world.entity.player.Inventory;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.inventory.ContainerData;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.crafting.*;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.entity.BaseContainerBlockEntity;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.storage.ValueInput;\nimport net.minecraft.world.level.storage.ValueOutput;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\nimport toughasnails.api.crafting.TANRecipeTypes;\nimport toughasnails.block.WaterPurifierBlock;\nimport toughasnails.container.WaterPurifierMenu;\nimport toughasnails.crafting.WaterPurifierRecipe;\n\nimport javax.annotation.Nullable;\nimport java.util.Iterator;\n\npublic class WaterPurifierBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer\n{\n    protected static final int SLOT_INPUT = 0;\n    protected static final int SLOT_FILTER = 1;\n    protected static final int SLOT_RESULT = 2;\n    private static final int[] SLOTS_FOR_UP = new int[]{SLOT_INPUT};\n    private static final int[] SLOTS_FOR_DOWN = new int[]{SLOT_RESULT, SLOT_FILTER};\n    private static final int[] SLOTS_FOR_SIDES = new int[]{SLOT_FILTER};\n\n    private NonNullList<ItemStack> items = NonNullList.withSize(3, ItemStack.EMPTY);\n\n    /** The time remaining from the previously used filter */\n    private int filterTimeRemaining;\n\n    /** The total duration associated with the previously used filter */\n    private int filterDuration;\n\n    /** The progress towards meeting the total purify time. */\n    private int purifyProgress;\n\n    /** The total time needed to complete purification. */\n    private int purifyTotalTime;\n\n    private final RecipeManager.CachedCheck<SingleRecipeInput, ? extends Recipe<SingleRecipeInput>> quickCheck;\n\n    protected final ContainerData dataAccess = new ContainerData()\n    {\n        @Override\n        public int get(int index)\n        {\n            switch(index) {\n                case 0:\n                    return WaterPurifierBlockEntity.this.filterTimeRemaining;\n                case 1:\n                    return WaterPurifierBlockEntity.this.filterDuration;\n                case 2:\n                    return WaterPurifierBlockEntity.this.purifyProgress;\n                case 3:\n                    return WaterPurifierBlockEntity.this.purifyTotalTime;\n                default:\n                    return 0;\n            }\n        }\n\n        @Override\n        public void set(int index, int value)\n        {\n            switch(index) {\n                case 0:\n                    WaterPurifierBlockEntity.this.filterTimeRemaining = value;\n                    break;\n                case 1:\n                    WaterPurifierBlockEntity.this.filterDuration = value;\n                    break;\n                case 2:\n                    WaterPurifierBlockEntity.this.purifyProgress = value;\n                    break;\n                case 3:\n                    WaterPurifierBlockEntity.this.purifyTotalTime = value;\n            }\n\n        }\n\n        @Override\n        public int getCount()\n        {\n            return 4;\n        }\n    };\n\n    public WaterPurifierBlockEntity(BlockPos pos, BlockState state)\n    {\n        super(TANBlockEntityTypes.WATER_PURIFIER, pos, state);\n        this.quickCheck = RecipeManager.createCheck(TANRecipeTypes.WATER_PURIFYING);\n    }\n\n    @Override\n    protected void loadAdditional(ValueInput input)\n    {\n        super.loadAdditional(input);\n        this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);\n        ContainerHelper.loadAllItems(input, this.items);\n        this.filterTimeRemaining = input.getInt(\"FilterTimeRemaining\").orElse(0);\n        this.filterDuration = input.getInt(\"FilterDuration\").orElse(0);\n        this.purifyProgress = input.getInt(\"PurifyProgress\").orElse(0);\n        this.purifyTotalTime = input.getInt(\"PurifyTotalTime\").orElse(0);\n    }\n\n    @Override\n    protected void saveAdditional(ValueOutput output)\n    {\n        super.saveAdditional(output);\n        output.putInt(\"FilterTimeRemaining\", this.filterTimeRemaining);\n        output.putInt(\"FilterDuration\", this.filterDuration);\n        output.putInt(\"PurifyProgress\", this.purifyProgress);\n        output.putInt(\"PurifyTotalTime\", this.purifyTotalTime);\n        ContainerHelper.saveAllItems(output, this.items);\n    }\n\n    public static void serverTick(Level level, BlockPos pos, BlockState state, WaterPurifierBlockEntity blockEntity)\n    {\n        boolean previouslyFiltering = blockEntity.isFiltering();\n        boolean changed = false;\n\n        if (blockEntity.isFiltering())\n        {\n            --blockEntity.filterTimeRemaining;\n        }\n\n        ItemStack filterStack = blockEntity.items.get(1);\n        boolean hasFilter = !filterStack.isEmpty();\n        if (blockEntity.isFiltering() || hasFilter && !blockEntity.items.get(0).isEmpty()) {\n            RecipeHolder<? extends Recipe<SingleRecipeInput>> recipe = blockEntity.quickCheck.getRecipeFor(new SingleRecipeInput(blockEntity.items.get(0)), (ServerLevel)level).orElse(null);\n\n            if (recipe != null)\n            {\n                if (!blockEntity.isFiltering() && blockEntity.canFilter(recipe.value())) {\n                    blockEntity.filterTimeRemaining = blockEntity.getFilterDuration(filterStack);\n                    blockEntity.filterDuration = blockEntity.filterTimeRemaining;\n\n                    // If we are now filtering, consume the filter item\n                    if (blockEntity.isFiltering()) {\n                        changed = true;\n\n                        if (hasFilter)\n                        {\n                            Item filter = filterStack.getItem();\n                            filterStack.shrink(1);\n                            if (filterStack.isEmpty())\n                            {\n                                blockEntity.items.set(1, filter.getCraftingRemainder());\n                            }\n                        }\n                    }\n                }\n\n                if (blockEntity.isFiltering() && blockEntity.canFilter(recipe.value())) {\n                    ++blockEntity.purifyProgress;\n\n                    if (blockEntity.purifyProgress == blockEntity.purifyTotalTime) {\n                        blockEntity.purifyProgress = 0;\n                        blockEntity.purifyTotalTime = blockEntity.getTotalPurifyTime();\n                        blockEntity.filter(recipe.value());\n                        changed = true;\n                    }\n                } else {\n                    blockEntity.purifyProgress = 0;\n                }\n            } else if (!blockEntity.isFiltering() && blockEntity.purifyProgress > 0) {\n                blockEntity.purifyProgress = Mth.clamp(blockEntity.purifyProgress - 2, 0, blockEntity.purifyTotalTime);\n            }\n        }\n\n        if (previouslyFiltering != blockEntity.isFiltering())\n        {\n            changed = true;\n            state = state.setValue(WaterPurifierBlock.PURIFYING, blockEntity.isFiltering());\n            level.setBlock(pos, state, 3);\n        }\n\n        // Mark as changed\n        if (changed) setChanged(level, pos, state);\n    }\n\n    @Override\n    protected AbstractContainerMenu createMenu(int id, Inventory player)\n    {\n        return new WaterPurifierMenu(id, player, this, this.dataAccess);\n    }\n\n    @Override\n    protected Component getDefaultName()\n    {\n        return Component.translatable(\"container.toughasnails.water_purifier\");\n    }\n\n    @Override\n    protected NonNullList<ItemStack> getItems()\n    {\n        return this.items;\n    }\n\n    @Override\n    protected void setItems(NonNullList<ItemStack> items)\n    {\n        this.items = items;\n    }\n\n    @Override\n    public int[] getSlotsForFace(Direction side)\n    {\n        switch (side)\n        {\n            case DOWN:\n                return SLOTS_FOR_DOWN;\n            case UP:\n                return SLOTS_FOR_UP;\n            default:\n                return SLOTS_FOR_SIDES;\n        }\n    }\n\n    @Override\n    public boolean canPlaceItem(int slot, ItemStack stack)\n    {\n        if (slot == SLOT_RESULT) return false;\n        else if (slot != SLOT_FILTER) return true;\n        else\n        {\n            return isFilter(stack);\n        }\n    }\n\n    @Override\n    public boolean canPlaceItemThroughFace(int index, ItemStack stack, @Nullable Direction direction)\n    {\n        return this.canPlaceItem(index, stack);\n    }\n\n    @Override\n    public boolean canTakeItemThroughFace(int index, ItemStack stack, Direction direction)\n    {\n        return !(direction == Direction.DOWN && index == SLOT_FILTER);\n    }\n\n    @Override\n    public int getContainerSize()\n    {\n        return this.items.size();\n    }\n\n    @Override\n    public boolean isEmpty()\n    {\n        for (ItemStack itemstack : this.items)\n        {\n            if (!itemstack.isEmpty()) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    @Override\n    public ItemStack getItem(int index)\n    {\n        return this.items.get(index);\n    }\n\n    @Override\n    public ItemStack removeItem(int index, int count)\n    {\n        return ContainerHelper.removeItem(this.items, index, count);\n    }\n\n    @Override\n    public ItemStack removeItemNoUpdate(int index)\n    {\n        return ContainerHelper.takeItem(this.items, index);\n    }\n\n    @Override\n    public void setItem(int index, ItemStack stack)\n    {\n        ItemStack currentStack = this.items.get(index);\n        boolean sameItem = !stack.isEmpty() && ItemStack.isSameItemSameComponents(stack, currentStack);\n        this.items.set(index, stack);\n\n        if (stack.getCount() > this.getMaxStackSize())\n        {\n            stack.setCount(this.getMaxStackSize());\n        }\n\n        // Update the purify time for the new input\n        if (index == 0 && !sameItem)\n        {\n            this.purifyTotalTime = this.getTotalPurifyTime();\n            this.purifyProgress = 0;\n            this.setChanged();\n        }\n    }\n\n    @Override\n    public boolean stillValid(Player player)\n    {\n        if (this.level.getBlockEntity(this.worldPosition) != this)\n        {\n            return false;\n        }\n        else\n        {\n            return player.distanceToSqr((double)this.worldPosition.getX() + 0.5D, (double)this.worldPosition.getY() + 0.5D, (double)this.worldPosition.getZ() + 0.5D) <= 64.0D;\n        }\n    }\n\n    @Override\n    public void clearContent()\n    {\n        this.items.clear();\n    }\n\n    public boolean isFiltering()\n    {\n        return this.filterTimeRemaining > 0;\n    }\n\n    protected boolean canFilter(@Nullable Recipe<SingleRecipeInput> recipe)\n    {\n        if (!this.items.get(0).isEmpty() && recipe != null)\n        {\n            ItemStack input = this.items.get(0);\n            ItemStack recipeResult = recipe.assemble(new SingleRecipeInput(input), this.level.registryAccess());\n\n            // Invalid recipe result\n            if (recipeResult.isEmpty())\n                return false;\n\n            ItemStack currentResult = this.items.get(2);\n\n            // Result slot is free, we're good to go\n            if (currentResult.isEmpty())\n                return true;\n\n            // The item can't be filtered if the existing item in the result slot isn't the same as this\n            if (!ItemStack.isSameItem(currentResult, recipeResult))\n                return false;\n\n            if (currentResult.getCount() + recipeResult.getCount() <= this.getMaxStackSize() && currentResult.getCount() + recipeResult.getCount() <= currentResult.getMaxStackSize())\n            {\n                return true;\n            }\n            else\n            {\n                return currentResult.getCount() + recipeResult.getCount() <= recipeResult.getMaxStackSize();\n            }\n        }\n        else return false;\n    }\n\n    /** Get the time taken for an input item to be purified. */\n    protected int getTotalPurifyTime()\n    {\n        SingleRecipeInput singlerecipeinput = new SingleRecipeInput(this.items.get(0));\n        return this.quickCheck.getRecipeFor(singlerecipeinput, (ServerLevel)this.level).map(p_379263_ -> ((WaterPurifierRecipe)p_379263_.value()).getPurifyTime()).orElse(200);\n    }\n\n    private void filter(@Nullable Recipe<SingleRecipeInput> recipe)\n    {\n        if (recipe != null && this.canFilter(recipe))\n        {\n            ItemStack input = this.items.get(0);\n            ItemStack recipeResult = recipe.assemble(new SingleRecipeInput(input), this.level.registryAccess());\n            ItemStack currentResult = this.items.get(2);\n\n            // Update the result stuck\n            if (currentResult.isEmpty())\n            {\n                this.items.set(2, recipeResult.copy());\n            }\n            else if (currentResult.getItem() == recipeResult.getItem())\n            {\n                currentResult.grow(recipeResult.getCount());\n            }\n\n            // Reduce the input stack\n            input.shrink(1);\n        }\n    }\n\n    public static boolean isFilter(ItemStack stack)\n    {\n        return getFilterDuration(stack) > 0;\n    }\n\n    public static int getFilterDuration(ItemStack filter)\n    {\n        if (filter == null || filter.isEmpty())\n            return 0;\n\n        return getFilterDurations().getOrDefault(filter.getItem(), 0);\n    }\n\n    private static ImmutableMap<Item, Integer> getFilterDurations()\n    {\n        ImmutableMap.Builder<Item, Integer> builder = ImmutableMap.builder();\n        add(builder, Items.SHORT_GRASS, 100);\n        add(builder, Items.PAPER, 200);\n        add(builder, Items.GRAVEL, 400);\n        add(builder, ItemTags.SAND, 800);\n        add(builder, Items.CHARCOAL, 1600);\n        add(builder, Items.PRISMARINE_CRYSTALS, 3200);\n        add(builder, Items.HEART_OF_THE_SEA, 6400);\n        return builder.build();\n    }\n\n    private static void add(ImmutableMap.Builder<Item, Integer> builder, TagKey<Item> tagKey, int i)\n    {\n        Iterator var3 = BuiltInRegistries.ITEM.getTagOrEmpty(tagKey).iterator();\n\n        while(var3.hasNext())\n        {\n            Holder<Item> holder = (Holder)var3.next();\n            builder.put(holder.value(), i);\n        }\n    }\n\n    private static void add(ImmutableMap.Builder<Item, Integer> builder, Item item, int i)\n    {\n        builder.put(item, i);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/gui/ThermoregulatorScreen.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.client.gui;\n\nimport net.minecraft.client.gui.GuiGraphics;\nimport net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;\nimport net.minecraft.client.renderer.RenderPipelines;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.entity.player.Inventory;\nimport toughasnails.api.TANAPI;\nimport toughasnails.container.ThermoregulatorContainer;\n\npublic class ThermoregulatorScreen extends AbstractContainerScreen<ThermoregulatorContainer>\n{\n    private static final Identifier TEXTURE = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"textures/gui/container/thermoregulator.png\");\n\n    public ThermoregulatorScreen(ThermoregulatorContainer screenContainer, Inventory inv, Component titleIn)\n    {\n        super(screenContainer, inv, titleIn);\n    }\n\n    public void init()\n    {\n        super.init();\n        this.leftPos = (this.width - this.imageWidth) / 2;\n        this.titleLabelX = (this.imageWidth - this.font.width(this.title)) / 2;\n    }\n\n    @Override\n    public void render(GuiGraphics gui, int mouseX, int mouseY, float partialTicks)\n    {\n        this.renderBackground(gui, mouseX, mouseY, partialTicks);\n        super.render(gui, mouseX, mouseY, partialTicks);\n        this.renderTooltip(gui, mouseX, mouseY);\n    }\n\n    @Override\n    protected void renderBg(GuiGraphics gui, float partialTicks, int mouseX, int mouseY)\n    {\n        int leftPos = this.leftPos;\n        int topPos = this.topPos;\n        gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos, topPos, 0, 0, this.imageWidth, this.imageHeight, 256, 256);\n\n        if (this.menu.isCooling())\n        {\n            int progress = this.menu.getCoolingFuelProgress();\n            gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 44 + 1, topPos + 25 + 13 - progress, 176, 13 - progress, 14, progress + 1, 256, 256);\n        }\n\n        if (this.menu.isHeating())\n        {\n            int progress = this.menu.getHeatingFuelProgress();\n            gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 116 + 1, topPos + 25 + 13 - progress, 176, 27 - progress, 14, progress + 1, 256, 256);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/gui/WaterPurifierScreen.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.client.gui;\n\nimport net.minecraft.client.gui.GuiGraphics;\nimport net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;\nimport net.minecraft.client.renderer.RenderPipelines;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.entity.player.Inventory;\nimport toughasnails.api.TANAPI;\nimport toughasnails.container.WaterPurifierMenu;\n\npublic class WaterPurifierScreen extends AbstractContainerScreen<WaterPurifierMenu>\n{\n    private static final Identifier TEXTURE = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"textures/gui/container/water_purifier.png\");\n\n    public WaterPurifierScreen(WaterPurifierMenu screenContainer, Inventory inv, Component titleIn)\n    {\n        super(screenContainer, inv, titleIn);\n    }\n\n    public void init()\n    {\n        super.init();\n        this.leftPos = (this.width - this.imageWidth) / 2;\n        this.titleLabelX = (this.imageWidth - this.font.width(this.title)) / 2;\n    }\n\n    @Override\n    public void render(GuiGraphics gui, int mouseX, int mouseY, float partialTicks)\n    {\n        this.renderBackground(gui, mouseX, mouseY, partialTicks);\n        super.render(gui, mouseX, mouseY, partialTicks);\n        this.renderTooltip(gui, mouseX, mouseY);\n    }\n\n    @Override\n    protected void renderBg(GuiGraphics gui, float partialTicks, int mouseX, int mouseY)\n    {\n        int leftPos = this.leftPos;\n        int topPos = this.topPos;\n        gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos, topPos, 0, 0, this.imageWidth, this.imageHeight, 256, 256);\n\n        if (this.menu.isFiltering())\n        {\n            int filterProgress = this.menu.getFilterProgress();\n\n            // NOTE: This is moved over right by 1 compared to the furnace\n            // stack, x, y, u, v, width, height\n            gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 56 + 1, topPos + 36 + 13 - filterProgress, 176, 13 - filterProgress, 14, filterProgress + 1, 256, 256);\n        }\n\n        int purifyProgress = this.menu.getPurifyProgress();\n        gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 79, topPos + 34, 176, 14, purifyProgress + 1, 16, 256, 256);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/handler/KeyHandler.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.client.handler;\n\nimport com.mojang.blaze3d.platform.InputConstants;\nimport glitchcore.event.client.InputEvent;\nimport net.minecraft.ChatFormatting;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.gui.components.ChatComponent;\nimport net.minecraft.network.chat.CommonComponents;\nimport net.minecraft.network.chat.Component;\n\npublic class KeyHandler\n{\n    public static void onKeyPress(InputEvent.Key event)\n    {\n        Minecraft minecraft = Minecraft.getInstance();\n        boolean isF3Down = InputConstants.isKeyDown(Minecraft.getInstance().getWindow(), InputConstants.KEY_F3);\n\n        if (minecraft.screen == null && isF3Down)\n        {\n            boolean handledDebugKey = false;\n\n            switch (event.getKey())\n            {\n                case InputConstants.KEY_7 -> {\n                    LevelRenderHandler.enableDebug = !LevelRenderHandler.enableDebug;\n\n                    if (LevelRenderHandler.enableDebug) debugFeedbackTranslated(\"debug.temperature_fill.on\");\n                    else debugFeedbackTranslated(\"debug.temperature_fill.off\");\n                    \n                    handledDebugKey = true;\n                }\n                case InputConstants.KEY_Q -> {\n                    ChatComponent component = minecraft.gui.getChat();\n                    component.addMessage(Component.translatable(\"debug.temperature_fill.help\"));\n                    // Should already be marked as handled by Vanilla\n                }\n            }\n\n            event.setHandledDebugKey(event.getHandledDebugKey() | handledDebugKey);\n        }\n    }\n\n\n    private static void debugComponent(ChatFormatting formatting, Component component) {\n        Minecraft.getInstance()\n            .gui\n            .getChat()\n            .addMessage(\n                    Component.empty()\n                            .append(Component.translatable(\"debug.prefix\").withStyle(formatting, ChatFormatting.BOLD))\n                            .append(CommonComponents.SPACE)\n                            .append(component)\n            );\n    }\n\n    private static void debugFeedbackComponent(Component $$0) {\n        debugComponent(ChatFormatting.YELLOW, $$0);\n    }\n\n    private static void debugFeedbackTranslated(String $$0, Object... $$1) {\n        debugFeedbackComponent(Component.translatableEscape($$0, $$1));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/handler/LevelRenderHandler.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.client.handler;\n\nimport com.mojang.blaze3d.vertex.PoseStack;\nimport com.mojang.blaze3d.vertex.VertexConsumer;\nimport glitchcore.event.client.LevelRenderEvent;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.renderer.MultiBufferSource;\nimport net.minecraft.client.renderer.rendertype.RenderTypes;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.phys.Vec3;\nimport org.joml.Matrix3f;\nimport org.joml.Matrix4f;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\nimport toughasnails.temperature.AreaFill;\n\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.Set;\n\npublic class LevelRenderHandler\n{\n    public static boolean enableDebug = false;\n\n    public static void onLevelRender(LevelRenderEvent event) {\n        Player player = Minecraft.getInstance().player;\n\n        if (!enableDebug || player == null)\n            return;\n\n        Vec3 cameraPos = event.getCamera().pos;\n        PoseStack poseStack = event.getPoseStack();\n\n        MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();\n        VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderTypes.lines());\n\n        poseStack.pushPose();\n        poseStack.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z());\n        getConnectedBlocks(player).forEach(block -> block.render(poseStack, vertexConsumer));\n        poseStack.popPose();\n    }\n\n    private static final Set<ConnectedBlock> connectedBlocks = new HashSet<>();\n\n    private static Set<ConnectedBlock> getConnectedBlocks(Player player)\n    {\n        Level level = player.level();\n\n        // The optimisation is good enough for me, and this isn't really a feature for a broad audience\n        // If that changes though, the below code is an option.\n        //if (connectedBlocks.isEmpty() || level.getGameTime() % 20L == 0L)\n        //{\n            // Clear old connectedBlocks\n            connectedBlocks.clear();\n            populateConnectedBlocks(player);\n        //}\n\n        return connectedBlocks;\n    }\n\n    private static void populateConnectedBlocks(Player player)\n    {\n        Level level = player.level();\n        BlockPos playerPos = player.blockPosition();\n\n        // If the player's position is obstructed (for example, when mounted or inside a block), use the position above instead\n        if (!level.isEmptyBlock(playerPos))\n            playerPos = playerPos.above();\n\n        Set<BlockPos> passablePositions = new HashSet<>();\n        Set<BlockPos> heatingPositions = new HashSet<>();\n        Set<BlockPos> coolingPositions = new HashSet<>();\n        Set<BlockPos> thermoregulatorPositions = new HashSet<>();\n        Set<BlockPos> blockingPositions = new HashSet<>();\n        AreaFill.fill(level, playerPos, new AreaFill.PositionChecker() {\n            @Override\n            public void onSolid(Level level, AreaFill.FillPos pos)\n            {\n                BlockState state = level.getBlockState(pos.pos());\n\n                if (TemperatureHelper.isHeatingBlock(state))\n                {\n                    heatingPositions.add(pos.pos());\n                }\n                else if (TemperatureHelper.isCoolingBlock(state))\n                {\n                    coolingPositions.add(pos.pos());\n                }\n                else blockingPositions.add(pos.pos());\n            }\n\n            @Override\n            public void onPassable(Level level, AreaFill.FillPos pos)\n            {\n                passablePositions.add(pos.pos());\n            }\n        });\n\n        // Add blocks from thermoregulators\n        for (BlockPos pos : TemperatureHelper.getTemperatureData(player).getNearbyThermoregulators())\n        {\n            ThermoregulatorBlockEntity blockEntity = (ThermoregulatorBlockEntity)level.getBlockEntity(pos);\n\n            if (blockEntity == null)\n                continue;\n\n            thermoregulatorPositions.addAll(blockEntity.getFilledBlocks());\n        }\n\n        connectBlocks(passablePositions, 170, 170, 170, 255); // Grey\n        connectBlocks(heatingPositions, 255, 170, 0, 255); // Orange\n        connectBlocks(coolingPositions, 85, 255, 255, 255); // Blue\n        connectBlocks(thermoregulatorPositions, 255, 85, 255, 255); // Purple\n        connectBlocks(blockingPositions, 255, 85, 85, 255); // Red\n    }\n\n    private static void connectBlocks(Set<BlockPos> positions, int r, int g, int b, int a)\n    {\n        // TODO: This could probably be optimised so that blocks opposite each other can set each other's faces, but this is good enough for now\n        for (BlockPos pos : positions)\n        {\n            Set<Direction> connectedFaces = new HashSet<>();\n\n            for (Direction dir : Direction.values())\n            {\n                if (positions.contains(pos.relative(dir)))\n                    connectedFaces.add(dir);\n            }\n\n            if (!connectedFaces.containsAll(Arrays.stream(Direction.values()).toList()))\n                connectedBlocks.add(new ConnectedBlock(pos, connectedFaces, (float)r / 255.0F, (float)g / 255.0F, (float)b / 255.0F, (float)a / 255.0F));\n        }\n    }\n\n    private static class ConnectedBlock\n    {\n        private final BlockPos pos;\n        private final Set<Direction> connectedFaces;\n        private final float r;\n        private final float g;\n        private final float b;\n        private final float a;\n        private final float minX;\n        private final float minY;\n        private final float minZ;\n        private final float maxX;\n        private final float maxY;\n        private final float maxZ;\n\n        private ConnectedBlock(BlockPos pos, Set<Direction> connectedFaces, float r, float g, float b, float a)\n        {\n            this.pos = pos;\n            this.connectedFaces = connectedFaces;\n\n            this.r = r;\n            this.g = g;\n            this.b = b;\n            this.a = a;\n\n            // Offset by 0.0001 to prevent Z-fighting with the selection box\n            this.minX = (float)pos.getX() + 0.0001F;\n            this.minY = (float)pos.getY() + 0.0001F;\n            this.minZ = (float)pos.getZ() + 0.0001F;\n            this.maxX = (float)pos.getX() + 1 - 0.0001F;\n            this.maxY = (float)pos.getY() + 1 - 0.0001F;\n            this.maxZ = (float)pos.getZ() + 1 - 0.0001F;\n        }\n\n        public void render(PoseStack poseStack, VertexConsumer vertexConsumer)\n        {\n            Matrix4f poseMatrix = poseStack.last().pose();\n            PoseStack.Pose lastPose = poseStack.last();\n\n            // North face (towards -Z)\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, minZ, maxX, minY, minZ, Direction.NORTH, Direction.DOWN);\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, minZ, minX, maxY, minZ, Direction.NORTH, Direction.WEST);\n            drawLine(vertexConsumer, poseMatrix, lastPose, maxX, minY, minZ, maxX, maxY, minZ, Direction.NORTH, Direction.EAST);\n            drawLine(vertexConsumer, poseMatrix, lastPose, maxX, maxY, minZ, minX, maxY, minZ, Direction.NORTH, Direction.UP);\n\n            // South face (towards +Z)\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, maxY, maxZ, minX, minY, maxZ, Direction.SOUTH, Direction.WEST);\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, maxZ, maxX, minY, maxZ, Direction.SOUTH, Direction.DOWN);\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, maxY, maxZ, maxX, maxY, maxZ, Direction.SOUTH, Direction.UP);\n            drawLine(vertexConsumer, poseMatrix, lastPose, maxX, minY, maxZ, maxX, maxY, maxZ, Direction.SOUTH, Direction.EAST);\n\n            // West face (towards -X)\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, minZ, minX, minY, maxZ, Direction.WEST, Direction.DOWN);\n            drawLine(vertexConsumer, poseMatrix, lastPose, minX, maxY, minZ, minX, maxY, maxZ, Direction.WEST, Direction.UP);\n\n            // East face (towards +X)\n            drawLine(vertexConsumer, poseMatrix, lastPose, maxX, minY, maxZ, maxX, minY, minZ, Direction.EAST, Direction.DOWN);\n            drawLine(vertexConsumer, poseMatrix, lastPose, maxX, maxY, minZ, maxX, maxY, maxZ, Direction.EAST, Direction.UP);\n        }\n\n        public Set<Direction> getConnectedFaces()\n        {\n            return this.connectedFaces;\n        }\n\n        private void drawLine(VertexConsumer vertexConsumer, Matrix4f poseMatrix, PoseStack.Pose lastPose, float fromX, float fromY, float fromZ, float toX, float toY, float toZ, Direction... relevantFaces)\n        {\n            // Don't draw this line if it forms part of a connected face\n            if (Arrays.stream(relevantFaces).anyMatch(this.connectedFaces::contains))\n                return;\n\n            float normalX = Math.signum(fromX - toX);\n            float normalY = Math.signum(fromY - toY);\n            float normalZ = Math.signum(fromZ - toZ);\n\n            vertexConsumer.addVertex(poseMatrix, fromX, fromY, fromZ).setColor(r, g, b, a).setNormal(lastPose, normalX, normalY, normalZ);\n            vertexConsumer.addVertex(poseMatrix, toX, toY, toZ).setColor(r, g, b, a).setNormal(lastPose, normalX, normalY, normalZ);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/handler/TooltipHandler.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.client.handler;\n\nimport glitchcore.event.client.ItemTooltipEvent;\nimport glitchcore.event.client.RenderTooltipEvent;\nimport glitchcore.util.Environment;\nimport net.minecraft.ChatFormatting;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.gui.Font;\nimport net.minecraft.client.gui.GuiGraphics;\nimport net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;\nimport net.minecraft.client.renderer.RenderPipelines;\nimport net.minecraft.core.Holder;\nimport net.minecraft.core.RegistryAccess;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.equipment.trim.TrimMaterial;\nimport net.minecraft.world.item.equipment.trim.TrimMaterials;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.state.BlockState;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModTags;\nimport toughasnails.thirst.ThirstOverlayRenderer;\n\nimport java.util.Optional;\n\npublic class TooltipHandler\n{\n    public static void onTooltip(ItemTooltipEvent event)\n    {\n        // Don't display heating or cooling tooltips if temperature is disabled\n        if (!ModConfig.temperature.enableTemperature)\n            return;\n\n        if (!Environment.isClient())\n            throw new IllegalStateException(\"ItemTooltipEvent unexpectedly called on the server\");\n\n        // In some rare cases (on Forge at least) this may be called with a null connection\n        if (Minecraft.getInstance().getConnection() == null)\n            return;\n\n        ItemStack stack = event.getStack();\n        Block block = Block.byItem(stack.getItem());\n        BlockState state = block.defaultBlockState();\n        RegistryAccess registryAccess = Minecraft.getInstance().getConnection().registryAccess();\n\n        Optional<Holder<TrimMaterial>> trimMaterial = TrimMaterials.getFromIngredient(registryAccess, stack);\n\n        // Heating/Cooling Blocks and Armor/Trimmed Armor\n        if (state.is(ModTags.Blocks.HEATING_BLOCKS) || stack.is(ModTags.Items.HEATING_ARMOR) || (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.HEATING_TRIMS)))\n        {\n            event.getTooltip().add(Component.literal(\"\\uD83D\\uDD25 \").append(Component.translatable(\"desc.toughasnails.heating\")).withStyle(ChatFormatting.GOLD));\n        }\n        if (state.is(ModTags.Blocks.COOLING_BLOCKS) || stack.is(ModTags.Items.COOLING_ARMOR) || (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.COOLING_TRIMS)))\n        {\n            event.getTooltip().add(Component.literal(\"\\u2744 \").append(Component.translatable(\"desc.toughasnails.cooling\")).withStyle(ChatFormatting.AQUA));\n        }\n\n        // Heating/Cooling Held Items\n        if (stack.is(ModTags.Items.HEATING_HELD_ITEMS))\n        {\n            event.getTooltip().add(Component.literal(\"\\uD83D\\uDD25 \").append(Component.translatable(\"desc.toughasnails.heating_held\")).withStyle(ChatFormatting.GOLD));\n        }\n        if (stack.is(ModTags.Items.COOLING_HELD_ITEMS))\n        {\n            event.getTooltip().add(Component.literal(\"\\u2744 \").append(Component.translatable(\"desc.toughasnails.cooling_held\")).withStyle(ChatFormatting.AQUA));\n        }\n\n        // Heating/Cooling Consumables\n        if (stack.is(ModTags.Items.HEATING_CONSUMED_ITEMS))\n        {\n            event.getTooltip().add(Component.literal(\"\\uD83D\\uDD25 \").append(Component.translatable(\"desc.toughasnails.heating_consumed\")).withStyle(ChatFormatting.GOLD));\n        }\n        if (stack.is(ModTags.Items.COOLING_CONSUMED_ITEMS))\n        {\n            event.getTooltip().add(Component.literal(\"\\u2744 \").append(Component.translatable(\"desc.toughasnails.cooling_consumed\")).withStyle(ChatFormatting.AQUA));\n        }\n\n        // Heating/Cooling Trim Material Items\n        if (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.HEATING_TRIMS))\n        {\n            event.getTooltip().add(Component.literal(\"\\uD83D\\uDD25 \").append(Component.translatable(\"desc.toughasnails.heating_trim\")).withStyle(ChatFormatting.GOLD));\n        }\n        if (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.COOLING_TRIMS))\n        {\n            event.getTooltip().add(Component.literal(\"\\u2744 \").append(Component.translatable(\"desc.toughasnails.cooling_trim\")).withStyle(ChatFormatting.AQUA));\n        }\n    }\n\n    public static void onRenderTooltip(RenderTooltipEvent event)\n    {\n        ItemStack stack = event.getStack();\n\n        // Don't display thirst tooltips if thirst is disabled\n        if (!ModConfig.thirst.enableThirst)\n            return;\n\n        if (stack.is(ModTags.Items.DRINKS))\n        {\n            event.getComponents().add(new ThirstClientTooltipComponent(ModTags.Items.getThirstRestored(stack)));\n        }\n    }\n\n    private static class ThirstClientTooltipComponent implements ClientTooltipComponent\n    {\n        private final int amount;\n\n        private ThirstClientTooltipComponent(int amount)\n        {\n            this.amount = amount;\n        }\n\n        @Override\n        public int getHeight(Font font)\n        {\n            return 9;\n        }\n\n        @Override\n        public int getWidth(Font font)\n        {\n            return (this.amount / 2) * 8;\n        }\n\n        @Override\n        public void renderImage(Font font, int x, int y, int width, int height, GuiGraphics gui)\n        {\n            gui.pose().pushMatrix();\n\n            for (int i = 0; i < Mth.ceil(this.amount / 2.0F); i++)\n            {\n                int dropletHalf = i * 2 + 1;\n\n                int startX = x + i * 8;\n                int startY = y;\n\n                // Args: poseStack, x, y, u, v, width, height, texWidth, texHeight\n                // Draw a full droplet\n                if (this.amount > dropletHalf)\n                {\n                    gui.blit(RenderPipelines.GUI_TEXTURED, ThirstOverlayRenderer.OVERLAY, startX, startY, 0, 41, 8, 8, 256, 256);\n                }\n                else if (this.amount == dropletHalf) // Draw a half droplet\n                {\n                    gui.blit(RenderPipelines.GUI_TEXTURED, ThirstOverlayRenderer.OVERLAY, startX, startY, 8, 41, 8, 8, 256, 256);\n                }\n            }\n\n            gui.pose().popMatrix();\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/item/TemperatureProperty.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.client.item;\n\nimport com.google.common.collect.Maps;\nimport com.mojang.serialization.Codec;\nimport com.mojang.serialization.MapCodec;\nimport com.mojang.serialization.codecs.RecordCodecBuilder;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.multiplayer.ClientLevel;\nimport net.minecraft.client.renderer.item.properties.numeric.RangeSelectItemModelProperty;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.ItemOwner;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.level.Level;\nimport org.jetbrains.annotations.Nullable;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.temperature.TemperatureHelperImpl;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Set;\n\npublic class TemperatureProperty implements RangeSelectItemModelProperty\n{\n    public static final MapCodec<TemperatureProperty> CODEC = RecordCodecBuilder.mapCodec((builder) ->\n            builder.group(\n                    Codec.unboundedMap(Codec.INT, Delta.CODEC)\n                            .fieldOf(\"deltas\")\n                            .forGetter(TemperatureProperty::deltas)\n            ).apply(builder, TemperatureProperty::new)\n    );\n\n    private final Map<Integer, Delta> deltas;\n\n    public TemperatureProperty(Map<Integer, Delta> deltas)\n    {\n        this.deltas = Maps.newHashMap(deltas);\n    }\n\n    public TemperatureProperty() { this.deltas = new HashMap<>(); }\n\n    @Override\n    public float get(ItemStack stack, @Nullable ClientLevel level, @Nullable ItemOwner owner, int i)\n    {\n        Entity holder = (Entity)(owner != null ? owner : stack.getEntityRepresentation());\n        if (owner == null)\n            return 0.5F;\n\n        if (level == null && owner.level() instanceof ClientLevel)\n            level = (ClientLevel)holder.level();\n\n        if (level == null)\n            return 0.5F;\n\n        Delta delta = deltas.computeIfAbsent(holder.getId(), k -> new Delta());\n        delta.update(level, getTemperatureForThermometer(level, holder));\n        return delta.getValue();\n    }\n\n    @Override\n    public MapCodec<? extends RangeSelectItemModelProperty> type()\n    {\n        return CODEC;\n    }\n\n    private Map<Integer, Delta> deltas()\n    {\n        return this.deltas;\n    }\n\n    private static TemperatureLevel getTemperatureForThermometer(Level level, Entity holder)\n    {\n        TemperatureLevel temperatureLevel = TemperatureHelper.getTemperatureAtPos(level, holder.blockPosition());\n\n        // Use the player to acquire nearby thermoregulators, even if they aren't holding the thermometer\n        Player player = Minecraft.getInstance().player;\n        Set<BlockPos> nearbyThermoregulators = TemperatureHelper.getTemperatureData(player).getNearbyThermoregulators();\n        return TemperatureHelperImpl.modifyTemperatureByThermoregulators(level, nearbyThermoregulators, holder.blockPosition(), temperatureLevel);\n    }\n\n    private static class Delta\n    {\n        public static final Codec<Delta> CODEC = RecordCodecBuilder.create((builder) ->\n            builder.group(\n                    Codec.LONG.fieldOf(\"last_update_tick\").forGetter(Delta::lastUpdateTick),\n                    Codec.DOUBLE.fieldOf(\"value\").forGetter(Delta::currentValue),\n                    Codec.DOUBLE.fieldOf(\"rota\").forGetter(Delta::rota)\n            ).apply(builder, Delta::new)\n        );\n\n        private long lastUpdateTick;\n        private double currentValue;\n        private double rota;\n\n        public Delta(long lastUpdateTick, double currentValue, double rota)\n        {\n            this.lastUpdateTick = lastUpdateTick;\n            this.currentValue = currentValue;\n            this.rota = rota;\n        }\n\n        public Delta() {}\n\n        private void update(ClientLevel level, TemperatureLevel temperatureLevel)\n        {\n            if (level.getGameTime() == this.lastUpdateTick)\n                return;\n\n            this.lastUpdateTick = level.getGameTime();\n            double targetValue = temperatureLevel.ordinal() * 0.25;\n            double delta = targetValue - this.currentValue;\n\n            // Add a small increment to the rota to move towards the target value\n            this.rota += delta * 0.1;\n\n            // Diminish the rota over time. The clock uses 0.9, but we want slightly less wobbling\n            this.rota *= 0.87;\n            this.currentValue = Mth.clamp(this.currentValue + this.rota, 0.0, 1.0);\n        }\n\n        public float getValue()\n        {\n            // Round to the nearest 0.05\n            return (float)((double)Math.round(this.currentValue * 20.0) / 20.0);\n        }\n\n        private long lastUpdateTick()\n        {\n            return this.lastUpdateTick;\n        }\n\n        private double currentValue()\n        {\n            return this.currentValue;\n        }\n\n        private double rota()\n        {\n            return this.rota;\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/client/particle/ThermoregulatorParticle.java",
    "content": "package toughasnails.client.particle;\n\nimport net.minecraft.client.multiplayer.ClientLevel;\nimport net.minecraft.client.particle.*;\nimport net.minecraft.client.renderer.texture.TextureAtlasSprite;\nimport net.minecraft.core.particles.SimpleParticleType;\nimport net.minecraft.util.RandomSource;\n\npublic class ThermoregulatorParticle extends SingleQuadParticle\n{\n    ThermoregulatorParticle(ClientLevel p_105856_, double p_105857_, double p_105858_, double p_105859_, double p_105860_, double p_105861_, double p_105862_, TextureAtlasSprite sprite)\n    {\n        super(p_105856_, p_105857_, p_105858_, p_105859_, sprite);\n        this.lifetime = this.random.nextInt(8) + 8;\n        this.gravity = 3.0E-6F;\n        this.xd = p_105860_;\n        this.yd = p_105861_;\n        this.zd = p_105862_;\n    }\n\n    @Override\n    public void tick()\n    {\n        this.xo = this.x;\n        this.yo = this.y;\n        this.zo = this.z;\n        if (this.age++ < this.lifetime && !(this.alpha <= 0.0F))\n        {\n            this.move(this.xd, this.yd, this.zd);\n            if (this.age >= this.lifetime - 60 && this.alpha > 0.01F)\n            {\n                this.alpha -= 0.01F;\n            }\n\n        }\n        else\n        {\n            this.remove();\n        }\n    }\n\n    @Override\n    public float getQuadSize(float p_107089_)\n    {\n        float f = ((float)this.age + p_107089_) / (float)this.lifetime;\n        return this.quadSize * (1.0F - f * f);\n    }\n\n    @Override\n    public SingleQuadParticle.Layer getLayer() {\n        return SingleQuadParticle.Layer.OPAQUE;\n    }\n\n    public static class Provider implements ParticleProvider<SimpleParticleType>\n    {\n        private final SpriteSet sprite;\n\n        public Provider(SpriteSet p_105793_) {\n            this.sprite = p_105793_;\n        }\n\n        @Override\n        public Particle createParticle(SimpleParticleType p_105804_, ClientLevel p_105805_, double p_105806_, double p_105807_, double p_105808_, double p_105809_, double p_105810_, double p_105811_, RandomSource p_445842_) {\n            return new ThermoregulatorParticle(p_105805_, p_105806_, p_105807_, p_105808_, p_105809_, p_105810_, p_105811_, this.sprite.get(p_445842_));\n        }\n    }\n}"
  },
  {
    "path": "common/src/main/java/toughasnails/config/ClientConfig.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.config;\n\nimport glitchcore.config.Config;\nimport glitchcore.util.Environment;\nimport toughasnails.api.TANAPI;\n\npublic class ClientConfig extends Config\n{\n    public int thirstLeftOffset;\n    public int thirstTopOffset;\n    public int temperatureLeftOffset;\n    public int temperatureTopOffset;\n\n    public ClientConfig()\n    {\n        super(Environment.getConfigPath().resolve(TANAPI.MOD_ID + \"/client.toml\"));\n    }\n\n    @Override\n    public void load()\n    {\n        thirstLeftOffset = addNumber(\"gui.thirst_left_offset\", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, \"The offset of the left of the thirst overlay from its default position.\");\n        thirstTopOffset = addNumber(\"gui.thirst_top_offset\", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, \"The offset of the top of the thirst overlay from its default position.\");\n        temperatureLeftOffset = addNumber(\"gui.temperature_left_offset\", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, \"The offset of the left of the temperature overlay from its default position.\");\n        temperatureTopOffset = addNumber(\"gui.temperature_top_offset\", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, \"The offset of the top of the temperature overlay from its default position.\");\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/config/TemperatureConfig.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.config;\n\nimport com.google.common.collect.ImmutableList;\nimport glitchcore.config.Config;\nimport glitchcore.util.Environment;\nimport toughasnails.api.TANAPI;\nimport toughasnails.temperature.BuiltInTemperatureModifier;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.function.Predicate;\nimport java.util.stream.Collectors;\n\npublic class TemperatureConfig extends Config\n{\n    public boolean enableTemperature;\n    \n    public int temperatureChangeDelay;\n    public int armorTemperatureChangeDelay;\n    public int mountTemperatureChangeDelay;\n    public int handheldTemperatureChangeDelay;\n    public int playerTemperatureChangeDelay;\n    public int internalTemperatureChangeDelay;\n    public int extremityReboundTemperatureChangeDelay;\n    public int extremityDamageDelay;\n    public int climateClemencyDuration;\n    public boolean climateClemencyRespawning;\n    public int consumableEffectDuration;\n\n    public int temperatureDropAltitude;\n    public int temperatureRiseAltitude;\n    public int environmentalModifierAltitude;\n\n    public int nearHeatCoolProximity;\n\n    public int nightHotTemperatureChange;\n    public int nightTemperatureChange;\n\n    public int onFireTemperatureChange;\n    public int powderSnowTemperatureChange;\n    public int wetTemperatureChange;\n    public int snowTemperatureChange;\n    public int wetTicks;\n\n    public List<String> temperatureModifierOrder;\n\n    public TemperatureConfig()\n    {\n        super(Environment.getConfigPath().resolve(TANAPI.MOD_ID + \"/temperature.toml\"));\n    }\n\n    private static final List<String> DEFAULT_TEMPERATURE_MODIFIER_ORDER = ImmutableList.of(BuiltInTemperatureModifier.PLAYER_MODIFIERS, BuiltInTemperatureModifier.ITEM_MODIFIER, BuiltInTemperatureModifier.ARMOR_MODIFIER, BuiltInTemperatureModifier.MOUNT_MODIFIER, BuiltInTemperatureModifier.INTERNAL_MODIFIER)\n        .stream().map(e -> e.toString().toLowerCase()).toList();\n\n    private static final Predicate<List<String>> TEMPERATURE_MODIFIER_VALIDATOR = list -> {\n        Set<String> configEntries = list.stream().map(String::toLowerCase).collect(Collectors.toSet());\n        Set<String> allModifiers = Arrays.stream(BuiltInTemperatureModifier.values()).map(m -> m.toString().toLowerCase()).collect(Collectors.toSet());\n        return configEntries.containsAll(allModifiers) && allModifiers.containsAll(configEntries);\n    };\n\n    @Override\n    public void load()\n    {\n        // Toggles\n        enableTemperature = add(\"toggles.enable_temperature\", true, \"Enable or disable temperature.\");\n\n        // General options\n        temperatureChangeDelay = addNumber(\"general.temperature_change_delay\", 500, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes.\");\n        armorTemperatureChangeDelay = addNumber(\"general.armor_temperature_change_delay\", 50, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes when wearing armor.\");\n        mountTemperatureChangeDelay = addNumber(\"general.mount_temperature_change_delay\", 50, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes when mounted.\");\n        handheldTemperatureChangeDelay = addNumber(\"general.handheld_temperature_change_delay\", 375, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes when holding an item.\");\n        playerTemperatureChangeDelay = addNumber(\"general.player_temperature_change_delay\", 125, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes when affected by a player-based temperature modifier.\");\n        internalTemperatureChangeDelay = addNumber(\"general.internal_temperature_change_delay\", 20, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes from consuming a heating or cooling item.\");\n        extremityReboundTemperatureChangeDelay = addNumber(\"general.extremity_rebound_temperature_change_delay\", 250, 0, Integer.MAX_VALUE, \"Number of ticks to delay changing the player's temperature after their temperature changes when rebounding from an extreme temperature.\");\n        extremityDamageDelay = addNumber(\"general.extremity_damage_delay\", 500, 0, Integer.MAX_VALUE, \"Number of ticks to delay taking damage when icy or hot.\");\n        climateClemencyDuration = addNumber(\"general.climate_clemency_duration\", 6000, 0, Integer.MAX_VALUE, \"Number of ticks for the duration of Climate Clemency.\");\n        climateClemencyRespawning = add(\"general.climate_clemency_respawning\", false, \"Whether or not Climate Clemency should be granted when respawning.\");\n        consumableEffectDuration = add(\"general.consumable_effect_duration\", 1200, \"Duration of heating or cooling effects given by consuming items.\");\n        temperatureModifierOrder = add(\"general.temperature_modifier_order\", DEFAULT_TEMPERATURE_MODIFIER_ORDER, \"The order in which to apply built-in temperature modifiers\", TEMPERATURE_MODIFIER_VALIDATOR);\n\n        // Altitude options\n        temperatureDropAltitude = addNumber(\"altitude.temperature_drop_altitude\", 160, -64, 1024, \"Y level to drop the temperature at when above\");\n        temperatureRiseAltitude = addNumber(\"altitude.temperature_rise_altitude\", -32, -64, 1024, \"Y level to rise the temperature at when below\");\n        environmentalModifierAltitude = addNumber(\"altitude.environmental_modifier_altitude\", 50, -64, 256, \"Y level above which environmental modifiers are applied\");\n\n        // Blocks options\n        nearHeatCoolProximity = addNumber(\"blocks.near_heat_cool_proximity\", 8, 1, 16, \"The proximity which constitutes near a heat or cool source\");\n\n        // Immersion options\n        onFireTemperatureChange = addNumber(\"immersion.on_fire_temperature_change\", 2, -4, 4, \"Amount to change the temperature by when on fire.\");\n        powderSnowTemperatureChange = addNumber(\"immersion.powdered_snow_temperature_change\", -2, -4, 4, \"Amount to change the temperature by when in powdered snow.\");\n        wetTemperatureChange = addNumber(\"immersion.wet_temperature_change\", -1, -4, 4, \"Amount to change the temperature by when wet.\");\n        snowTemperatureChange = addNumber(\"immersion.snow_temperature_change\", -1, -4, 4, \"Amount to change the temperature by when snowing.\");\n        wetTicks = addNumber(\"immersion.wet_ticks\", 40, 0, Integer.MAX_VALUE, \"Number of ticks a player stays wet for after touching water, rain or snow.\");\n\n        // Time options\n        nightTemperatureChange = addNumber(\"time.night_temperature_change\", -1, -4, 4, \"Amount to change the temperature at night when the original temperature is not hot.\");\n        nightHotTemperatureChange = addNumber(\"time.night_hot_temperature_change\", -2, -4, 4, \"Amount to change the temperature at night when the original temperature is hot.\");\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/config/ThirstConfig.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.config;\n\nimport glitchcore.config.Config;\nimport glitchcore.util.Environment;\nimport toughasnails.api.TANAPI;\n\nimport java.nio.file.Path;\n\npublic class ThirstConfig extends Config\n{\n    public boolean enableThirst;\n    public boolean enableHandDrinking;\n    public boolean removeSourceBlocks;\n    public boolean thirstPreventSprint;\n    public boolean thirstPreventHealthRegen;\n    public double thirstExhaustionThreshold;\n    public int handDrinkingThirst;\n    public double handDrinkingHydration;\n\n    public ThirstConfig()\n    {\n        super(Environment.getConfigPath().resolve(TANAPI.MOD_ID + \"/thirst.toml\"));\n    }\n\n    @Override\n    public void load()\n    {\n        // Toggles\n        enableThirst = add(\"toggles.enable_thirst\", true, \"Enable or disable thirst.\");\n        enableHandDrinking = add(\"toggles.enable_hand_drinking\", false, \"Enable or disable hand drinking.\");\n        removeSourceBlocks = add(\"toggles.remove_source_blocks\", false, \"Remove source blocks when filling the canteen.\");\n        thirstPreventSprint = add(\"toggles.thirst_prevent_sprint\", true, \"Prevent sprinting when thirsty.\");\n        thirstPreventHealthRegen = add(\"toggles.thirst_prevent_health_regen\", true, \"Prevent health regeneration when thirsty.\");\n\n        // General options\n        thirstExhaustionThreshold = addNumber(\"general.exhaustion_threshold\", 8.0D, 0.0D, Double.MAX_VALUE, \"The threshold at which exhaustion causes a reduction in hydration and the thirst bar.\");\n\n        // Drink options\n        handDrinkingThirst = addNumber(\"drink_options.hand_drinking_thirst\", 1, 0, 20, \"Thirst restored from drinking with hands.\");\n        handDrinkingHydration = addNumber(\"drink_options.hand_drinking_hydration\", 0.1D, 0.0D, Double.MAX_VALUE, \"Hydration restored from drinking with hands.\");\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/container/ThermoregulatorContainer.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.container;\n\nimport net.minecraft.world.Container;\nimport net.minecraft.world.SimpleContainer;\nimport net.minecraft.world.entity.player.Inventory;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.inventory.ContainerData;\nimport net.minecraft.world.inventory.SimpleContainerData;\nimport net.minecraft.world.inventory.Slot;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.crafting.RecipeType;\nimport net.minecraft.world.level.Level;\nimport org.jetbrains.annotations.NotNull;\nimport toughasnails.api.container.TANContainerTypes;\nimport toughasnails.api.crafting.TANRecipeTypes;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\nimport toughasnails.block.entity.WaterPurifierBlockEntity;\nimport toughasnails.crafting.WaterPurifierRecipe;\n\npublic class ThermoregulatorContainer extends AbstractContainerMenu\n{\n    private final Container container;\n    private final ContainerData data;\n    private final Level level;\n\n    public ThermoregulatorContainer(int id, Inventory playerInventory)\n    {\n        this(id, playerInventory, new SimpleContainer(2), new SimpleContainerData(2));\n    }\n\n    public ThermoregulatorContainer(int id, Inventory playerInventory, Container container, ContainerData data)\n    {\n        super(TANContainerTypes.THERMOREGULATOR, id);\n        this.container = container;\n        this.data = data;\n        this.level = playerInventory.player.level();\n\n        // Add input item slot\n        this.addSlot(new ThermoregulatorCoolingFuelSlot(container, ThermoregulatorBlockEntity.SLOT_COOLING, 44, 42));\n\n        // Add filter item slot\n        this.addSlot(new ThermoregulatorHeatingFuelSlot(container, ThermoregulatorBlockEntity.SLOT_HEATING, 116, 42));\n\n        // Add inventory slots\n        for (int row = 0; row < 3; ++row)\n        {\n            for (int col = 0; col < 9; ++col)\n            {\n                this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 84 + row * 18));\n            }\n        }\n\n        // Add hotbar slots\n        for (int slot = 0; slot < 9; ++slot)\n        {\n            this.addSlot(new Slot(playerInventory, slot, 8 + slot * 18, 142));\n        }\n\n        // Add data slots\n        this.addDataSlots(data);\n    }\n\n    @Override\n    public boolean stillValid(Player player)\n    {\n        return this.container.stillValid(player);\n    }\n\n    @Override\n    public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index)\n    {\n        ItemStack prevItem = ItemStack.EMPTY;\n        Slot slot = this.slots.get(index);\n        if (slot.hasItem())\n        {\n            ItemStack slotItem = slot.getItem();\n            prevItem = slotItem.copy();\n\n            // Output\n            if (index != ThermoregulatorBlockEntity.SLOT_HEATING && index != ThermoregulatorBlockEntity.SLOT_COOLING) // Moving from inventory to the purifier\n            {\n                if (ThermoregulatorBlockEntity.isCoolingFuel(slotItem))\n                {\n                    if (!this.moveItemStackTo(slotItem, 0, 1, false)) {\n                        return ItemStack.EMPTY;\n                    }\n                }\n                else if (ThermoregulatorBlockEntity.isHeatingFuel(slotItem))\n                {\n                    if (!this.moveItemStackTo(slotItem, 1, 2, false))\n                    {\n                        return ItemStack.EMPTY;\n                    }\n                }\n                else if (index >= 2 && index < 30)\n                {\n                    if (!this.moveItemStackTo(slotItem, 30, 38, false))\n                    {\n                        return ItemStack.EMPTY;\n                    }\n                }\n                else if (index >= 30 && index < 38 && !this.moveItemStackTo(slotItem, 2, 30, false)) {\n                    return ItemStack.EMPTY;\n                }\n            }\n            else if (!this.moveItemStackTo(slotItem, 2, 38, false)) // Move from purifier to inventory\n            {\n                return ItemStack.EMPTY;\n            }\n\n            if (slotItem.isEmpty())\n            {\n                slot.set(ItemStack.EMPTY);\n            }\n            else\n            {\n                slot.setChanged();\n            }\n\n            // No change\n            if (slotItem.getCount() == prevItem.getCount())\n            {\n                return ItemStack.EMPTY;\n            }\n\n            slot.onTake(player, slotItem);\n        }\n\n        return prevItem;\n    }\n\n    public int getCoolingFuelProgress()\n    {\n        return this.data.get(0) * 13 / ThermoregulatorBlockEntity.CONSUMABLE_DURATION;\n    }\n\n    public int getHeatingFuelProgress()\n    {\n        return this.data.get(1) * 13 / ThermoregulatorBlockEntity.CONSUMABLE_DURATION;\n    }\n\n    public boolean isCooling()\n    {\n        return this.data.get(0) > 0;\n    }\n\n    public boolean isHeating()\n    {\n        return this.data.get(1) > 0;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/container/ThermoregulatorCoolingFuelSlot.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.container;\n\nimport net.minecraft.world.Container;\nimport net.minecraft.world.inventory.Slot;\nimport net.minecraft.world.item.ItemStack;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\n\npublic class ThermoregulatorCoolingFuelSlot extends Slot\n{\n\n    public ThermoregulatorCoolingFuelSlot(Container inventory, int index, int xPosition, int yPosition)\n    {\n        super(inventory, index, xPosition, yPosition);\n    }\n\n    @Override\n    public boolean mayPlace(ItemStack stack)\n    {\n        return ThermoregulatorBlockEntity.isCoolingFuel(stack);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/container/ThermoregulatorHeatingFuelSlot.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.container;\n\nimport net.minecraft.world.Container;\nimport net.minecraft.world.inventory.Slot;\nimport net.minecraft.world.item.ItemStack;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\n\npublic class ThermoregulatorHeatingFuelSlot extends Slot\n{\n    public ThermoregulatorHeatingFuelSlot(Container inventory, int index, int xPosition, int yPosition)\n    {\n        super(inventory, index, xPosition, yPosition);\n    }\n\n    @Override\n    public boolean mayPlace(ItemStack stack)\n    {\n        return ThermoregulatorBlockEntity.isHeatingFuel(stack);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/container/WaterPurifierFilterSlot.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.container;\n\nimport net.minecraft.world.Container;\nimport net.minecraft.world.inventory.Slot;\nimport net.minecraft.world.item.ItemStack;\n\npublic class WaterPurifierFilterSlot extends Slot\n{\n    private final WaterPurifierMenu menu;\n\n    public WaterPurifierFilterSlot(WaterPurifierMenu container, Container inventory, int index, int xPosition, int yPosition)\n    {\n        super(inventory, index, xPosition, yPosition);\n        this.menu = container;\n    }\n\n    @Override\n    public boolean mayPlace(ItemStack stack)\n    {\n        return this.menu.isFilter(stack);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/container/WaterPurifierMenu.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.container;\n\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.world.Container;\nimport net.minecraft.world.SimpleContainer;\nimport net.minecraft.world.entity.player.Inventory;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.inventory.ContainerData;\nimport net.minecraft.world.inventory.SimpleContainerData;\nimport net.minecraft.world.inventory.Slot;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.crafting.*;\nimport net.minecraft.world.level.Level;\nimport toughasnails.api.crafting.TANRecipeTypes;\nimport toughasnails.api.container.TANContainerTypes;\nimport toughasnails.block.entity.WaterPurifierBlockEntity;\nimport toughasnails.crafting.WaterPurifierRecipe;\nimport toughasnails.init.ModRecipePropertySets;\n\npublic class WaterPurifierMenu extends AbstractContainerMenu\n{\n    private final Container container;\n    private final ContainerData data;\n    private final Level level;\n    private final RecipePropertySet acceptedInputs;\n\n    public WaterPurifierMenu(int id, Inventory playerInventory)\n    {\n        this(id, playerInventory, new SimpleContainer(3), new SimpleContainerData(4));\n    }\n\n    public WaterPurifierMenu(int id, Inventory playerInventory, Container container, ContainerData data)\n    {\n        super(TANContainerTypes.WATER_PURIFIER, id);\n        this.container = container;\n        this.data = data;\n        this.level = playerInventory.player.level();\n        this.acceptedInputs = this.level.recipeAccess().propertySet(ModRecipePropertySets.WATER_PURIFYING);\n\n        // Add input item slot\n        this.addSlot(new Slot(container, 0, 56, 17));\n\n        // Add filter item slot\n        this.addSlot(new WaterPurifierFilterSlot(this, container, 1, 56, 53));\n\n        // Add output item slot\n        this.addSlot(new WaterPurifierResultSlot(container, 2, 116, 35));\n\n        // Add inventory slots\n        for (int row = 0; row < 3; ++row)\n        {\n            for (int col = 0; col < 9; ++col)\n            {\n                this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 84 + row * 18));\n            }\n        }\n\n        // Add hotbar slots\n        for (int slot = 0; slot < 9; ++slot)\n        {\n            this.addSlot(new Slot(playerInventory, slot, 8 + slot * 18, 142));\n        }\n\n        // Add data slots\n        this.addDataSlots(data);\n    }\n\n    @Override\n    public boolean stillValid(Player player)\n    {\n        return this.container.stillValid(player);\n    }\n\n    @Override\n    public ItemStack quickMoveStack(Player player, int index)\n    {\n        ItemStack prevItem = ItemStack.EMPTY;\n        Slot slot = this.slots.get(index);\n        if (slot != null && slot.hasItem())\n        {\n            ItemStack slotItem = slot.getItem();\n            prevItem = slotItem.copy();\n\n            // Output\n            if (index == 2)\n            {\n                if (!this.moveItemStackTo(slotItem, 3, 39, true))\n                {\n                    return ItemStack.EMPTY;\n                }\n\n                slot.onQuickCraft(slotItem, prevItem);\n            }\n            else if (index != 1 && index != 0) // Moving from inventory to the purifier\n            {\n                if (this.canPurify(slotItem))\n                {\n                    if (!this.moveItemStackTo(slotItem, 0, 1, false)) {\n                        return ItemStack.EMPTY;\n                    }\n                }\n                else if (this.isFilter(slotItem))\n                {\n                    if (!this.moveItemStackTo(slotItem, 1, 2, false))\n                    {\n                        return ItemStack.EMPTY;\n                    }\n                }\n                else if (index >= 3 && index < 30)\n                {\n                    if (!this.moveItemStackTo(slotItem, 30, 39, false))\n                    {\n                        return ItemStack.EMPTY;\n                    }\n                }\n                else if (index >= 30 && index < 39 && !this.moveItemStackTo(slotItem, 3, 30, false)) {\n                    return ItemStack.EMPTY;\n                }\n            }\n            else if (!this.moveItemStackTo(slotItem, 3, 39, false)) // Move from purifier to inventory\n            {\n                return ItemStack.EMPTY;\n            }\n\n            if (slotItem.isEmpty())\n            {\n                slot.set(ItemStack.EMPTY);\n            }\n            else\n            {\n                slot.setChanged();\n            }\n\n            // No change\n            if (slotItem.getCount() == prevItem.getCount())\n            {\n                return ItemStack.EMPTY;\n            }\n\n            slot.onTake(player, slotItem);\n        }\n\n        return prevItem;\n    }\n\n    protected boolean canPurify(ItemStack stack)\n    {\n        return this.acceptedInputs.test(stack);\n    }\n\n    protected boolean isFilter(ItemStack stack)\n    {\n        return WaterPurifierBlockEntity.isFilter(stack);\n    }\n\n    public int getPurifyProgress()\n    {\n        int progress = this.data.get(2);\n        int totalTime = this.data.get(3);\n        return totalTime != 0 && progress != 0 ? progress * 24 / totalTime : 0;\n    }\n\n    public int getFilterProgress()\n    {\n        int filterDuration = this.data.get(1);\n\n        // Prevent division by 0\n        if (filterDuration == 0)\n        {\n            filterDuration = 200;\n        }\n\n        return this.data.get(0) * 13 / filterDuration;\n    }\n\n    public boolean isFiltering()\n    {\n        return this.data.get(0) > 0;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/container/WaterPurifierResultSlot.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.container;\n\nimport net.minecraft.world.Container;\nimport net.minecraft.world.inventory.Slot;\nimport net.minecraft.world.item.ItemStack;\n\npublic class WaterPurifierResultSlot extends Slot\n{\n    public WaterPurifierResultSlot(Container inventory, int index, int xPosition, int yPosition)\n    {\n        super(inventory, index, xPosition, yPosition);\n    }\n\n    // Prevent placing item in slot\n    @Override\n    public boolean mayPlace(ItemStack stack)\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/core/ToughAsNails.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.core;\n\nimport glitchcore.event.EventManager;\nimport glitchcore.util.Environment;\nimport glitchcore.util.RegistryHelper;\nimport net.minecraft.core.RegistryAccess;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.server.MinecraftServer;\nimport org.apache.logging.log4j.LogManager;\nimport org.apache.logging.log4j.Logger;\nimport toughasnails.api.TANAPI;\nimport toughasnails.client.handler.KeyHandler;\nimport toughasnails.client.handler.LevelRenderHandler;\nimport toughasnails.client.handler.TooltipHandler;\nimport toughasnails.init.*;\nimport toughasnails.temperature.TemperatureHandler;\nimport toughasnails.temperature.TemperatureOverlayRenderer;\nimport toughasnails.thirst.ThirstHandler;\nimport toughasnails.thirst.ThirstOverlayRenderer;\n\npublic class ToughAsNails\n{\n    public static final String MOD_ID = TANAPI.MOD_ID;\n    public static final Logger LOGGER = LogManager.getLogger(MOD_ID);\n\n    public static void init()\n    {\n        ModConfig.init();\n        ModTags.init();\n        addRegistrars();\n        addHandlers();\n        ModPackets.init();\n        ModApi.init();\n        ModCompatibility.init();\n    }\n\n    public static void setupClient()\n    {\n        ModClient.setupRenderTypes();\n    }\n\n    public static void onServerAboutToStart(MinecraftServer server)\n    {\n        ModVillages.addBuildings(server.registryAccess());\n    }\n\n    private static void addRegistrars()\n    {\n        var regHelper = RegistryHelper.create();\n        regHelper.addRegistrar(Registries.BLOCK, ModBlocks::registerBlocks);\n        regHelper.addRegistrar(Registries.ITEM, ModItems::registerItems);\n        regHelper.addRegistrar(Registries.MENU, ModContainerTypes::registerContainers);\n        regHelper.addRegistrar(Registries.BLOCK_ENTITY_TYPE, ModBlockEntities::registerBlockEntities);\n        regHelper.addRegistrar(Registries.RECIPE_SERIALIZER, ModCrafting::registerRecipeSerializers);\n        regHelper.addRegistrar(Registries.RECIPE_TYPE, ModCrafting::registerRecipeTypes);\n        regHelper.addRegistrar(Registries.RECIPE_BOOK_CATEGORY, ModCrafting::registerRecipeBookCategories);\n        regHelper.addRegistrar(Registries.MOB_EFFECT, ModPotions::registerEffects);\n        regHelper.addRegistrar(Registries.POTION, ModPotions::registerPotions);\n        regHelper.addRegistrar(Registries.CREATIVE_MODE_TAB, ModCreativeTab::registerCreativeTabs);\n        regHelper.addRegistrar(Registries.PARTICLE_TYPE, ModParticles::registerParticles);\n        regHelper.addRegistrar(Registries.POINT_OF_INTEREST_TYPE, ModVillages::registerPointsOfInterest);\n        regHelper.addRegistrar(Registries.VILLAGER_PROFESSION, ModVillages::registerProfessions);\n    }\n\n    private static void addHandlers()\n    {\n        // Temperature handlers\n        EventManager.addListener(TemperatureHandler::onChangeDimension);\n        EventManager.addListener(TemperatureHandler::onItemUseFinish);\n\n        // Thirst handlers\n        EventManager.addListener(ThirstHandler::onChangeDimension);\n        EventManager.addListener(ThirstHandler::onItemUseFinish);\n        EventManager.addListener(ThirstHandler::onPlayerUseItem);\n        EventManager.addListener(ThirstHandler::onUseBlock);\n\n        // Misc handlers\n        EventManager.addListener(ModVillages::addVillagerTrades);\n        EventManager.addListener(ModVillages::addWanderingVillagerTrades);\n\n        if (Environment.isClient())\n        {\n            addClientHandlers();\n        }\n    }\n\n    private static void addClientHandlers()\n    {\n        // Temperature\n        EventManager.addListener(TemperatureOverlayRenderer::onClientTick);\n        EventManager.addListener(TemperatureOverlayRenderer::onBeginRenderFood);\n        EventManager.addListener(TemperatureOverlayRenderer::onBeginRenderFrostbite);\n        EventManager.addListener(LevelRenderHandler::onLevelRender);\n\n        // Thirst\n        EventManager.addListener(ThirstOverlayRenderer::onClientTick);\n        EventManager.addListener(ThirstOverlayRenderer::onBeginRenderAir);\n        EventManager.addListener(ThirstHandler::onUseEmpty);\n        EventManager.addListener(ThirstHandler::onClientTick);\n\n        // Coloring\n        EventManager.addListener(ModClient::registerBlockColors);\n\n        // Particles\n        EventManager.addListener(ModClient::registerParticleSprites);\n\n        // Tooltips\n        EventManager.addListener(TooltipHandler::onTooltip);\n        EventManager.addListener(TooltipHandler::onRenderTooltip);\n\n        // Debug\n        EventManager.addListener(KeyHandler::onKeyPress);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/crafting/WaterPurifierRecipe.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.crafting;\n\nimport com.mojang.serialization.Codec;\nimport com.mojang.serialization.MapCodec;\nimport com.mojang.serialization.codecs.RecordCodecBuilder;\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.RegistryAccess;\nimport net.minecraft.network.FriendlyByteBuf;\nimport net.minecraft.network.RegistryFriendlyByteBuf;\nimport net.minecraft.network.codec.StreamCodec;\nimport net.minecraft.world.Container;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.crafting.*;\nimport net.minecraft.world.level.Level;\nimport toughasnails.api.crafting.TANRecipeBookCategories;\nimport toughasnails.api.crafting.TANRecipeSerializers;\nimport toughasnails.api.crafting.TANRecipeTypes;\n\nimport javax.annotation.Nullable;\n\npublic class WaterPurifierRecipe implements Recipe<SingleRecipeInput>\n{\n    protected final ItemStack input;\n    protected final ItemStack result;\n    protected final int purifyTime;\n    @Nullable\n    private PlacementInfo placementInfo;\n\n    public WaterPurifierRecipe(ItemStack input, ItemStack result, int purifyTime)\n    {\n        this.input = input;\n        this.result = result;\n        this.purifyTime = purifyTime;\n    }\n\n    @Override\n    public boolean matches(SingleRecipeInput input, Level var2)\n    {\n        if (this.input == null)\n            return false;\n\n        ItemStack containerInput = input.getItem(0);\n        return ItemStack.isSameItemSameComponents(this.input, containerInput) && this.input.getDamageValue() == containerInput.getDamageValue();\n    }\n\n    @Override\n    public ItemStack assemble(SingleRecipeInput var1, HolderLookup.Provider var2)\n    {\n        return this.result.copy();\n    }\n\n    public ItemStack input()\n    {\n        return this.input;\n    }\n\n    protected ItemStack result()\n    {\n        return this.result;\n    }\n\n    @Override\n    public PlacementInfo placementInfo()\n    {\n        if (this.placementInfo == null) {\n            this.placementInfo = PlacementInfo.create(Ingredient.of(this.input.getItem()));\n        }\n\n        return this.placementInfo;\n    }\n\n    @Override\n    public RecipeBookCategory recipeBookCategory()\n    {\n        return TANRecipeBookCategories.WATER_PURIFYING;\n    }\n\n    @Override\n    public RecipeSerializer<? extends Recipe<SingleRecipeInput>> getSerializer()\n    {\n        return TANRecipeSerializers.WATER_PURIFYING;\n    }\n\n    @Override\n    public RecipeType<? extends Recipe<SingleRecipeInput>> getType()\n    {\n        return TANRecipeTypes.WATER_PURIFYING;\n    }\n\n    public int getPurifyTime()\n    {\n        return this.purifyTime;\n    }\n\n    public static class Serializer implements RecipeSerializer<WaterPurifierRecipe>\n    {\n        private static final MapCodec<WaterPurifierRecipe> CODEC = RecordCodecBuilder.mapCodec((builder) -> {\n            return builder.group(ItemStack.CODEC.fieldOf(\"input\").forGetter((p_296920_) -> {\n                return p_296920_.input;\n            }), ItemStack.CODEC.fieldOf(\"result\").forGetter((p_296923_) -> {\n                return p_296923_.result;\n            }), Codec.INT.fieldOf(\"purifytime\").orElse(200).forGetter((p_296919_) -> {\n                return p_296919_.purifyTime;\n            })).apply(builder, WaterPurifierRecipe::new);\n        });\n\n        private final StreamCodec<RegistryFriendlyByteBuf, WaterPurifierRecipe> streamCodec = StreamCodec.of(this::toNetwork, this::fromNetwork);\n\n        public WaterPurifierRecipe fromNetwork(RegistryFriendlyByteBuf buffer)\n        {\n            ItemStack input = ItemStack.STREAM_CODEC.decode(buffer);\n            ItemStack result = ItemStack.STREAM_CODEC.decode(buffer);\n            int purifyTime = buffer.readInt();\n            return new WaterPurifierRecipe(input, result, purifyTime);\n        }\n\n        public void toNetwork(RegistryFriendlyByteBuf buffer, WaterPurifierRecipe recipe)\n        {\n            ItemStack.STREAM_CODEC.encode(buffer, recipe.input);\n            ItemStack.STREAM_CODEC.encode(buffer, recipe.result);\n            buffer.writeInt(recipe.purifyTime);\n        }\n\n        @Override\n        public MapCodec<WaterPurifierRecipe> codec()\n        {\n            return CODEC;\n        }\n\n        @Override\n        public StreamCodec<RegistryFriendlyByteBuf, WaterPurifierRecipe> streamCodec() {\n            return this.streamCodec;\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModApi.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.temperature.TemperatureHelperImpl;\nimport toughasnails.thirst.ThirstHelperImpl;\n\npublic class ModApi\n{\n    public static void init()\n    {\n        ThirstHelper.Impl.INSTANCE = new ThirstHelperImpl();\n        TemperatureHelper.Impl.INSTANCE = new TemperatureHelperImpl();\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModArmorMaterials.java",
    "content": "package toughasnails.init;\n\nimport net.minecraft.util.Util;\nimport net.minecraft.sounds.SoundEvents;\nimport net.minecraft.tags.ItemTags;\nimport net.minecraft.world.item.equipment.ArmorMaterial;\nimport net.minecraft.world.item.equipment.ArmorType;\n\nimport java.util.EnumMap;\n\npublic class ModArmorMaterials\n{\n    public static final ArmorMaterial WOOL = new ArmorMaterial(5, Util.make(new EnumMap<>(ArmorType.class), map -> {\n        map.put(ArmorType.BOOTS, 1);\n        map.put(ArmorType.LEGGINGS, 1);\n        map.put(ArmorType.CHESTPLATE, 1);\n        map.put(ArmorType.HELMET, 1);\n    }), 1, SoundEvents.ARMOR_EQUIP_GENERIC, 0.0F, 0.0F, ItemTags.WOOL, ModEquipmentAssets.WOOL);\n\n    public static ArmorMaterial LEAF = new ArmorMaterial(5, Util.make(new EnumMap<>(ArmorType.class), (map) -> {\n        map.put(ArmorType.BOOTS, 1);\n        map.put(ArmorType.LEGGINGS, 1);\n        map.put(ArmorType.CHESTPLATE, 1);\n        map.put(ArmorType.HELMET, 1);\n    }), 1, SoundEvents.ARMOR_EQUIP_GENERIC, 0.0F, 0.0F, ItemTags.LEAVES, ModEquipmentAssets.LEAF);\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModBlockEntities.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.entity.BlockEntity;\nimport net.minecraft.world.level.block.entity.BlockEntityType;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.api.blockentity.TANBlockEntityTypes;\nimport toughasnails.block.entity.TemperatureGaugeBlockEntity;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\nimport toughasnails.block.entity.WaterPurifierBlockEntity;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.Set;\nimport java.util.function.BiConsumer;\n\npublic class ModBlockEntities\n{\n    public static void registerBlockEntities(BiConsumer<Identifier, BlockEntityType<?>> func)\n    {\n        TANBlockEntityTypes.WATER_PURIFIER = register(func, \"water_purifier\", WaterPurifierBlockEntity::new, Set.of(TANBlocks.WATER_PURIFIER));\n        TANBlockEntityTypes.TEMPERATURE_GAUGE = register(func, \"temperature_gauge\", TemperatureGaugeBlockEntity::new, Set.of(TANBlocks.TEMPERATURE_GAUGE));\n        TANBlockEntityTypes.THERMOREGULATOR = register(func, \"thermoregulator\", ThermoregulatorBlockEntity::new, Set.of(TANBlocks.THERMOREGULATOR));\n    }\n\n\n    private static <T extends BlockEntity> BlockEntityType<?> register(BiConsumer<Identifier, BlockEntityType<?>> func, String name, BlockEntityType.BlockEntitySupplier<T> supplier, Set<Block> blocks)\n    {\n        var type = new BlockEntityType(supplier, blocks);\n        func.accept(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name), type);\n        return type;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModBlocks.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.CaveVines;\nimport net.minecraft.world.level.block.SoundType;\nimport net.minecraft.world.level.block.state.BlockBehaviour;\nimport net.minecraft.world.level.block.state.properties.NoteBlockInstrument;\nimport net.minecraft.world.level.material.MapColor;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.block.RainCollectorBlock;\nimport toughasnails.block.TemperatureGaugeBlock;\nimport toughasnails.block.ThermoregulatorBlock;\nimport toughasnails.block.WaterPurifierBlock;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.function.BiConsumer;\nimport java.util.function.Function;\n\npublic class ModBlocks\n{\n    public static void registerBlocks(BiConsumer<Identifier, Block> func)\n    {\n        TANBlocks.THERMOREGULATOR = register(func, \"thermoregulator\", ThermoregulatorBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.STONE).instrument(NoteBlockInstrument.BASEDRUM).requiresCorrectToolForDrops().strength(3.5F).lightLevel(ThermoregulatorBlock.lightLevel(6)));\n        TANBlocks.TEMPERATURE_GAUGE = register(func, \"temperature_gauge\", TemperatureGaugeBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_RED).requiresCorrectToolForDrops().strength(1.0F));\n        TANBlocks.RAIN_COLLECTOR = register(func, \"rain_collector\", RainCollectorBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLUE).instrument(NoteBlockInstrument.BASS).strength(2.5F).sound(SoundType.WOOD).noOcclusion());\n        TANBlocks.WATER_PURIFIER = register(func, \"water_purifier\", WaterPurifierBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).requiresCorrectToolForDrops().strength(2.5F).sound(SoundType.WOOD).noOcclusion());\n    }\n\n    private static Block register(BiConsumer<Identifier, Block> func, ResourceKey<Block> key, Function<BlockBehaviour.Properties, Block> factory, BlockBehaviour.Properties properties)\n    {\n        Block block = factory.apply(properties.setId(key));\n        func.accept(key.identifier(), block);\n        return block;\n    }\n\n    private static Block register(BiConsumer<Identifier, Block> func, String name, Function<BlockBehaviour.Properties, Block> factory, BlockBehaviour.Properties properties)\n    {\n        return register(func, blockId(name), factory, properties);\n    }\n\n    private static ResourceKey<Block> blockId(String name)\n    {\n        return ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n    }\n}\n\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModClient.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport glitchcore.event.client.RegisterColorsEvent;\nimport glitchcore.event.client.RegisterParticleSpritesEvent;\nimport glitchcore.util.RenderHelper;\nimport net.minecraft.client.renderer.chunk.ChunkSectionLayer;\nimport toughasnails.api.particle.TANParticles;\nimport toughasnails.client.particle.ThermoregulatorParticle;\n\nimport static toughasnails.api.block.TANBlocks.RAIN_COLLECTOR;\nimport static toughasnails.api.block.TANBlocks.WATER_PURIFIER;\n\npublic class ModClient\n{\n    public static void registerBlockColors(RegisterColorsEvent.Block event)\n    {\n        event.register((state, world, pos, tintIndex) -> 0x47DAFF, RAIN_COLLECTOR);\n        event.register((state, world, pos, tintIndex) -> 0x3F76E4, WATER_PURIFIER);\n    }\n\n    public static void registerParticleSprites(RegisterParticleSpritesEvent event)\n    {\n        event.registerSpriteSet(TANParticles.THERMOREGULATOR_COOL, ThermoregulatorParticle.Provider::new);\n        event.registerSpriteSet(TANParticles.THERMOREGULATOR_WARM, ThermoregulatorParticle.Provider::new);\n        event.registerSpriteSet(TANParticles.THERMOREGULATOR_NEUTRAL, ThermoregulatorParticle.Provider::new);\n    }\n\n    public static void setupRenderTypes()\n    {\n        RenderHelper.setRenderType(RAIN_COLLECTOR, ChunkSectionLayer.CUTOUT);\n        RenderHelper.setRenderType(WATER_PURIFIER, ChunkSectionLayer.CUTOUT);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModCompatibility.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport glitchcore.util.Environment;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Holder;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraft.world.level.levelgen.Heightmap;\nimport sereneseasons.api.season.Season;\nimport sereneseasons.api.season.SeasonHelper;\nimport sereneseasons.init.ModTags;\nimport sereneseasons.season.SeasonHooks;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.core.ToughAsNails;\n\npublic class ModCompatibility\n{\n    public static void init()\n    {\n        if (Environment.isModLoaded(\"sereneseasons\"))\n        {\n            ToughAsNails.LOGGER.info(\"Serene Seasons detected. Enabling season modifier.\");\n            TemperatureHelper.registerPositionalTemperatureModifier(ModCompatibility::seasonModifier);\n        }\n    }\n\n    public static boolean coldEnoughToSnowSeasonal(Level level, Holder<Biome> biome, BlockPos pos)\n    {\n        return SeasonHooks.coldEnoughToSnowSeasonal(level, pos, level.getSeaLevel());\n    }\n\n    private static TemperatureLevel seasonModifier(Level level, BlockPos pos, TemperatureLevel current)\n    {\n        Holder<Biome> biome = level.getBiome(pos);\n\n        // Only adjust if above the environmental modifier altitude\n        if (pos.getY() <= ModConfig.temperature.environmentalModifierAltitude && pos.getY() < level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, pos).below().getY())\n            return current;\n\n        // Check if biome uses seasonal effects\n        if (biome.is(ModTags.Biomes.BLACKLISTED_BIOMES))\n            return current;\n\n        Season.TropicalSeason tropicalSeason = SeasonHelper.getSeasonState(level).getTropicalSeason();\n\n        // Adjust for mid dry/wet season\n        if (biome.is(ModTags.Biomes.TROPICAL_BIOMES))\n        {\n            switch (tropicalSeason)\n            {\n                case MID_DRY:\n                    current = current.increment(1);\n                    break;\n\n                case MID_WET:\n                    if (current == TemperatureLevel.HOT)\n                        current = current.decrement(1);\n                    break;\n            }\n\n            return current;\n        }\n\n        Season season = SeasonHelper.getSeasonState(level).getSeason();\n\n        switch (season)\n        {\n            case SUMMER:\n                current = current.increment(1);\n                break;\n\n            case WINTER:\n                current = current.decrement(1);\n                break;\n        }\n\n        return current;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModConfig.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport glitchcore.config.ConfigSync;\nimport glitchcore.util.Environment;\nimport toughasnails.config.ClientConfig;\nimport toughasnails.config.TemperatureConfig;\nimport toughasnails.config.ThirstConfig;\n\npublic class ModConfig\n{\n    public static ThirstConfig thirst;\n    public static TemperatureConfig temperature;\n    public static ClientConfig client;\n\n    public static void init()\n    {\n        thirst = new ThirstConfig();\n        temperature = new TemperatureConfig();\n\n        ConfigSync.register(thirst);\n        ConfigSync.register(temperature);\n\n        if (Environment.isClient())\n        {\n            client = new ClientConfig();\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModContainerTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport glitchcore.util.Environment;\nimport net.minecraft.client.gui.screens.MenuScreens;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.flag.FeatureFlags;\nimport net.minecraft.world.inventory.AbstractContainerMenu;\nimport net.minecraft.world.inventory.MenuType;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.container.TANContainerTypes;\nimport toughasnails.client.gui.ThermoregulatorScreen;\nimport toughasnails.client.gui.WaterPurifierScreen;\nimport toughasnails.container.ThermoregulatorContainer;\nimport toughasnails.container.WaterPurifierMenu;\n\nimport java.util.function.BiConsumer;\n\npublic class ModContainerTypes\n{\n    public static void registerContainers(BiConsumer<Identifier, MenuType<?>> func)\n    {\n        TANContainerTypes.WATER_PURIFIER = register(func, \"water_purifier\", WaterPurifierMenu::new);\n        TANContainerTypes.THERMOREGULATOR = register(func, \"thermoregulator\", ThermoregulatorContainer::new);\n\n        if (Environment.isClient())\n        {\n            MenuScreens.register((MenuType<WaterPurifierMenu>) TANContainerTypes.WATER_PURIFIER, WaterPurifierScreen::new);\n            MenuScreens.register((MenuType<ThermoregulatorContainer>) TANContainerTypes.THERMOREGULATOR, ThermoregulatorScreen::new);\n        }\n    }\n\n    public static <T extends AbstractContainerMenu> MenuType<?> register(BiConsumer<Identifier, MenuType<?>> func, String name, MenuType.MenuSupplier<T> factory)\n    {\n        var menuType = new MenuType<>(factory, FeatureFlags.DEFAULT_FLAGS);\n        func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), menuType);\n        return menuType;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModCrafting.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.crafting.*;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.crafting.TANRecipeBookCategories;\nimport toughasnails.api.crafting.TANRecipeSerializers;\nimport toughasnails.api.crafting.TANRecipeTypes;\nimport toughasnails.crafting.WaterPurifierRecipe;\n\nimport java.util.function.BiConsumer;\n\npublic class ModCrafting\n{\n    public static void registerRecipeSerializers(BiConsumer<Identifier, RecipeSerializer<?>> func)\n    {\n        TANRecipeSerializers.WATER_PURIFYING = (RecipeSerializer<? extends Recipe<SingleRecipeInput>>) registerSerializer(func, \"water_purifying\", new WaterPurifierRecipe.Serializer());\n    }\n\n    public static void registerRecipeTypes(BiConsumer<Identifier, RecipeType<?>> func)\n    {\n        TANRecipeTypes.WATER_PURIFYING = (RecipeType<? extends Recipe<SingleRecipeInput>>) registerRecipe(func, \"water_purifying\", new RecipeType<WaterPurifierRecipe>()\n        {\n            @Override\n            public String toString()\n            {\n                return \"water_purifying\";\n            }\n        });\n    }\n\n    public static void registerRecipeBookCategories(BiConsumer<Identifier, RecipeBookCategory> func)\n    {\n        TANRecipeBookCategories.WATER_PURIFYING = registerRecipeBookCategory(func, \"water_purifying\", new RecipeBookCategory());\n    }\n\n    private static RecipeSerializer<?> registerSerializer(BiConsumer<Identifier, RecipeSerializer<?>> func, String name, RecipeSerializer<?> serializer)\n    {\n        func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), serializer);\n        return serializer;\n    }\n\n    private static <T> RecipeType<?> registerRecipe(BiConsumer<Identifier, RecipeType<?>> func, String name, RecipeType<?> type)\n    {\n        func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), type);\n        return type;\n    }\n\n    private static RecipeBookCategory registerRecipeBookCategory(BiConsumer<Identifier, RecipeBookCategory> func, String name, RecipeBookCategory category)\n    {\n        func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), category);\n        return category;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModCreativeTab.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport com.google.common.collect.ImmutableList;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.CreativeModeTab;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.level.block.Block;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.api.item.TANItems;\n\nimport java.lang.reflect.Field;\nimport java.util.function.BiConsumer;\n\npublic class ModCreativeTab\n{\n    public static void registerCreativeTabs(BiConsumer<Identifier, CreativeModeTab> func)\n    {\n        var ITEM_BLACKLIST = ImmutableList.of(TANItems.TAN_ICON);\n        var tab = CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0)\n            .icon(() -> new ItemStack(TANItems.TAN_ICON))\n            .title(Component.translatable(\"itemGroup.toughasnails\"))\n            .displayItems((displayParameters, output) ->\n            {\n                for (Field field : TANItems.class.getFields())\n                {\n                    if (field.getType() != Item.class) continue;\n\n                    try\n                    {\n                        Item item = (Item) field.get(null);\n                        if (!ITEM_BLACKLIST.contains(item))\n                            output.accept(new ItemStack(item));\n                    }\n                    catch (IllegalAccessException e)\n                    {\n                    }\n                }\n            }).build();\n\n        register(func, \"main\", tab);\n    }\n\n    private static CreativeModeTab register(BiConsumer<Identifier, CreativeModeTab> func, String name, CreativeModeTab tab)\n    {\n        func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), tab);\n        return tab;\n    }\n}"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModEnchantments.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.core.HolderGetter;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.worldgen.BootstrapContext;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.tags.EnchantmentTags;\nimport net.minecraft.tags.ItemTags;\nimport net.minecraft.world.entity.EquipmentSlotGroup;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.enchantment.Enchantment;\nimport toughasnails.api.enchantment.TANEnchantments;\n\npublic class ModEnchantments\n{\n    public static void bootstrap(BootstrapContext<Enchantment> context)\n    {\n        HolderGetter<Enchantment> enchantmentGetter = context.lookup(Registries.ENCHANTMENT);\n        HolderGetter<Item> itemGetter = context.lookup(Registries.ITEM);\n        register(\n                context,\n                TANEnchantments.THERMAL_TUNING,\n                Enchantment.enchantment(\n                    Enchantment.definition(itemGetter.getOrThrow(ItemTags.CHEST_ARMOR_ENCHANTABLE), 2, 1, Enchantment.dynamicCost(25, 25), Enchantment.dynamicCost(75, 25), 4, EquipmentSlotGroup.CHEST)\n                )\n        );\n\n        register(\n            context,\n            TANEnchantments.WATER_CLEANSING,\n            Enchantment.enchantment(\n                Enchantment.definition(itemGetter.getOrThrow(ModTags.Items.CANTEEN), 2, 1, Enchantment.dynamicCost(25, 25), Enchantment.dynamicCost(75, 25), 4, EquipmentSlotGroup.MAINHAND)\n            )\n        );\n    }\n\n    private static void register(BootstrapContext<Enchantment> context, ResourceKey<Enchantment> key, Enchantment.Builder builder)\n    {\n        context.register(key, builder.build(key.identifier()));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModEquipmentAssets.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.equipment.EquipmentAsset;\nimport net.minecraft.world.item.equipment.EquipmentAssets;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.function.BiConsumer;\n\npublic class ModEquipmentAssets\n{\n    public static final ResourceKey<EquipmentAsset> LEAF = createId(\"leaf\");\n    public static final ResourceKey<EquipmentAsset> WOOL = createId(\"wool\");\n\n    static ResourceKey<EquipmentAsset> createId(String name)\n    {\n        return ResourceKey.create(EquipmentAssets.ROOT_ID, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModItems.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport glitchcore.util.Environment;\nimport net.minecraft.core.component.DataComponents;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.food.FoodProperties;\nimport net.minecraft.world.item.BlockItem;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.component.Consumables;\nimport net.minecraft.world.item.component.DyedItemColor;\nimport net.minecraft.world.item.equipment.ArmorType;\nimport net.minecraft.world.level.block.Block;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.item.*;\n\nimport java.util.function.BiConsumer;\nimport java.util.function.BiFunction;\nimport java.util.function.Function;\n\npublic class ModItems\n{\n    public static void registerItems(BiConsumer<Identifier, Item> func)\n    {\n        // Block Items\n        TANItems.THERMOREGULATOR = registerBlock(func, TANBlocks.THERMOREGULATOR);\n        TANItems.TEMPERATURE_GAUGE = registerBlock(func, TANBlocks.TEMPERATURE_GAUGE);\n        TANItems.RAIN_COLLECTOR = registerBlock(func, TANBlocks.RAIN_COLLECTOR);\n        TANItems.WATER_PURIFIER = registerBlock(func, TANBlocks.WATER_PURIFIER);\n\n        // Items\n        TANItems.THERMOMETER = registerItem(func, \"thermometer\", Item::new, new Item.Properties().stacksTo(1));\n\n        TANItems.LEAF_HELMET = registerItem(func, \"leaf_helmet\", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.HELMET).stacksTo(1));\n        TANItems.LEAF_CHESTPLATE = registerItem(func, \"leaf_chestplate\", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.CHESTPLATE).stacksTo(1));\n        TANItems.LEAF_LEGGINGS = registerItem(func, \"leaf_leggings\", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.LEGGINGS).stacksTo(1));\n        TANItems.LEAF_BOOTS = registerItem(func, \"leaf_boots\", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.BOOTS).stacksTo(1));\n\n        TANItems.WOOL_HELMET = registerItem(func, \"wool_helmet\", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.HELMET).stacksTo(1));\n        TANItems.WOOL_CHESTPLATE = registerItem(func, \"wool_chestplate\", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.CHESTPLATE).stacksTo(1));\n        TANItems.WOOL_LEGGINGS = registerItem(func, \"wool_leggings\", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.LEGGINGS).stacksTo(1));\n        TANItems.WOOL_BOOTS = registerItem(func, \"wool_boots\", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.BOOTS).stacksTo(1));\n\n        TANItems.ICE_CREAM = registerItem(func, \"ice_cream\", StackableBowlFoodItem::new, new Item.Properties().stacksTo(16).component(DataComponents.CONSUMABLE, Consumables.DEFAULT_FOOD).usingConvertsTo(Items.BOWL).food(new FoodProperties.Builder().nutrition(0).saturationModifier(0.0F).alwaysEdible().build()));\n        TANItems.CHARC_0S = registerItem(func, \"charc_os\", StackableBowlFoodItem::new, new Item.Properties().stacksTo(16).component(DataComponents.CONSUMABLE, Consumables.DEFAULT_FOOD).usingConvertsTo(Items.BOWL).food(new FoodProperties.Builder().nutrition(0).saturationModifier(0.0F).alwaysEdible().build()));\n\n        TANItems.EMPTY_LEATHER_CANTEEN = registerItem(func, \"empty_leather_canteen\", p -> new EmptyCanteenItem(0, p), new Item.Properties().enchantable(1).stacksTo(1));\n        TANItems.LEATHER_DIRTY_WATER_CANTEEN = registerItem(func, \"leather_dirty_water_canteen\", p -> new FilledCanteenItem(0, p), new Item.Properties().durability(5));\n        TANItems.LEATHER_WATER_CANTEEN = registerItem(func, \"leather_water_canteen\", p -> new FilledCanteenItem(0, p), new Item.Properties().durability(5));\n        TANItems.LEATHER_PURIFIED_WATER_CANTEEN = registerItem(func, \"leather_purified_water_canteen\", p -> new FilledCanteenItem(0, p), new Item.Properties().durability(5));\n\n        TANItems.EMPTY_COPPER_CANTEEN = registerItem(func, \"empty_copper_canteen\", p -> new EmptyCanteenItem(1, p), new Item.Properties().enchantable(1).stacksTo(1));\n        TANItems.COPPER_DIRTY_WATER_CANTEEN = registerItem(func, \"copper_dirty_water_canteen\", p -> new FilledCanteenItem(1, p), new Item.Properties().durability(6));\n        TANItems.COPPER_WATER_CANTEEN = registerItem(func, \"copper_water_canteen\", p -> new FilledCanteenItem(1, p), new Item.Properties().durability(6));\n        TANItems.COPPER_PURIFIED_WATER_CANTEEN = registerItem(func, \"copper_purified_water_canteen\", p -> new FilledCanteenItem(1, p), new Item.Properties().durability(6));\n\n        TANItems.EMPTY_IRON_CANTEEN = registerItem(func, \"empty_iron_canteen\", p -> new EmptyCanteenItem(2, p), new Item.Properties().enchantable(1).stacksTo(1));\n        TANItems.IRON_DIRTY_WATER_CANTEEN = registerItem(func, \"iron_dirty_water_canteen\", p -> new FilledCanteenItem(2, p), new Item.Properties().durability(7));\n        TANItems.IRON_WATER_CANTEEN = registerItem(func, \"iron_water_canteen\", p -> new FilledCanteenItem(2, p), new Item.Properties().durability(7));\n        TANItems.IRON_PURIFIED_WATER_CANTEEN = registerItem(func, \"iron_purified_water_canteen\", p -> new FilledCanteenItem(2, p), new Item.Properties().durability(7));\n\n        TANItems.EMPTY_GOLD_CANTEEN = registerItem(func, \"empty_gold_canteen\", p -> new EmptyCanteenItem(3, p), new Item.Properties().enchantable(1).stacksTo(1));\n        TANItems.GOLD_DIRTY_WATER_CANTEEN = registerItem(func, \"gold_dirty_water_canteen\", p -> new FilledCanteenItem(3, p), new Item.Properties().durability(10));\n        TANItems.GOLD_WATER_CANTEEN = registerItem(func, \"gold_water_canteen\", p -> new FilledCanteenItem(3, p), new Item.Properties().durability(10));\n        TANItems.GOLD_PURIFIED_WATER_CANTEEN = registerItem(func, \"gold_purified_water_canteen\", p -> new FilledCanteenItem(3, p), new Item.Properties().durability(10));\n\n        TANItems.EMPTY_DIAMOND_CANTEEN = registerItem(func, \"empty_diamond_canteen\", p -> new EmptyCanteenItem(4, p), new Item.Properties().enchantable(1).stacksTo(1));\n        TANItems.DIAMOND_DIRTY_WATER_CANTEEN = registerItem(func, \"diamond_dirty_water_canteen\", p -> new FilledCanteenItem(4, p), new Item.Properties().durability(15));\n        TANItems.DIAMOND_WATER_CANTEEN = registerItem(func, \"diamond_water_canteen\", p -> new FilledCanteenItem(4, p), new Item.Properties().durability(15));\n        TANItems.DIAMOND_PURIFIED_WATER_CANTEEN = registerItem(func, \"diamond_purified_water_canteen\", p -> new FilledCanteenItem(4, p), new Item.Properties().durability(15));\n\n        TANItems.EMPTY_NETHERITE_CANTEEN = registerItem(func, \"empty_netherite_canteen\", p -> new EmptyCanteenItem(5, p), new Item.Properties().enchantable(1).stacksTo(1));\n        TANItems.NETHERITE_DIRTY_WATER_CANTEEN = registerItem(func, \"netherite_dirty_water_canteen\", p -> new FilledCanteenItem(5, p), new Item.Properties().durability(25));\n        TANItems.NETHERITE_WATER_CANTEEN = registerItem(func, \"netherite_water_canteen\", p -> new FilledCanteenItem(5, p), new Item.Properties().durability(25));\n        TANItems.NETHERITE_PURIFIED_WATER_CANTEEN = registerItem(func, \"netherite_purified_water_canteen\", p -> new FilledCanteenItem(5, p), new Item.Properties().durability(25));\n\n        TANItems.DIRTY_WATER_BOTTLE = registerItem(func, \"dirty_water_bottle\", DirtyWaterBottleItem::new, new Item.Properties().stacksTo(1));\n        TANItems.PURIFIED_WATER_BOTTLE = registerItem(func, \"purified_water_bottle\", PurifiedWaterBottleItem::new, new Item.Properties().stacksTo(1));\n\n        TANItems.APPLE_JUICE = registerItem(func, \"apple_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n        TANItems.CACTUS_JUICE = registerItem(func, \"cactus_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n        TANItems.CHORUS_FRUIT_JUICE = registerItem(func, \"chorus_fruit_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n        TANItems.GLOW_BERRY_JUICE = registerItem(func, \"glow_berry_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n        TANItems.MELON_JUICE = registerItem(func, \"melon_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n        TANItems.PUMPKIN_JUICE = registerItem(func, \"pumpkin_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n        TANItems.SWEET_BERRY_JUICE = registerItem(func, \"sweet_berry_juice\", JuiceItem::new, new Item.Properties().stacksTo(16));\n\n        TANItems.TAN_ICON = registerItem(func, \"tan_icon\", Item::new, new Item.Properties());\n    }\n\n    public static Item registerBlock(BiConsumer<Identifier, Item> func, Block block)\n    {\n        return registerBlock(func, block, BlockItem::new);\n    }\n\n    public static Item registerBlock(BiConsumer<Identifier, Item> func, Block block, BiFunction<Block, Item.Properties, Item> factory)\n    {\n        return registerBlock(func, block, factory, new Item.Properties());\n    }\n\n    public static Item registerBlock(BiConsumer<Identifier, Item> func, Block block, BiFunction<Block, Item.Properties, Item> factory, Item.Properties properties)\n    {\n        return registerItem(func, blockIdToItemId(block.builtInRegistryHolder().key()), p_370785_ -> factory.apply(block, p_370785_), properties.useBlockDescriptionPrefix()\n        );\n    }\n\n    private static Item registerItem(BiConsumer<Identifier, Item> func, ResourceKey<Item> key, Function<Item.Properties, Item> factory, Item.Properties properties)\n    {\n        Item item = factory.apply(properties.setId(key));\n        func.accept(key.identifier(), item);\n        return item;\n    }\n\n    private static Item registerItem(BiConsumer<Identifier, Item> func, String name, Function<Item.Properties, Item> factory, Item.Properties properties)\n    {\n        return registerItem(func, itemId(name), factory, properties);\n    }\n\n    private static Item registerItem(BiConsumer<Identifier, Item> func, String name, Item.Properties properties)\n    {\n        return registerItem(func, itemId(name), Item::new, properties);\n    }\n\n    private static ResourceKey<Item> blockIdToItemId(ResourceKey<Block> key)\n    {\n        return ResourceKey.create(Registries.ITEM, key.identifier());\n    }\n\n    private static ResourceKey<Item> itemId(String name)\n    {\n        return ResourceKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModPackets.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport glitchcore.network.CustomPacket;\nimport glitchcore.network.PacketHandler;\nimport net.minecraft.resources.Identifier;\nimport toughasnails.api.TANAPI;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.network.DrinkInWorldPacket;\nimport toughasnails.network.UpdateTemperaturePacket;\nimport toughasnails.network.UpdateThirstPacket;\n\npublic class ModPackets\n{\n    private static final Identifier CHANNEL = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"main\");\n    public static final PacketHandler HANDLER = new PacketHandler(CHANNEL);\n    public static void init()\n    {\n        register(\"update_temperature\", new UpdateTemperaturePacket());\n        register(\"update_thirst\", new UpdateThirstPacket());\n        register(\"drink_in_world\", new DrinkInWorldPacket());\n    }\n\n    public static void register(String name, CustomPacket<?> packet)\n    {\n        HANDLER.register(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name), packet);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModParticles.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.core.particles.ParticleOptions;\nimport net.minecraft.core.particles.ParticleType;\nimport net.minecraft.core.particles.SimpleParticleType;\nimport net.minecraft.resources.Identifier;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.particle.TANParticles;\n\nimport java.util.function.BiConsumer;\n\npublic class ModParticles\n{\n    public static void registerParticles(BiConsumer<Identifier, ParticleType<?>> func)\n    {\n        TANParticles.THERMOREGULATOR_COOL = register(func, \"thermoregulator_cool\", new SimpleParticleType(false));\n        TANParticles.THERMOREGULATOR_WARM = register(func, \"thermoregulator_warm\", new SimpleParticleType(false));\n        TANParticles.THERMOREGULATOR_NEUTRAL = register(func, \"thermoregulator_neutral\", new SimpleParticleType(false));\n    }\n\n    private static <T extends ParticleType<? extends ParticleOptions>> T register(BiConsumer<Identifier, ParticleType<?>> func, String name, T particle)\n    {\n        func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), particle);\n        return particle;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModPotions.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.core.Holder;\nimport net.minecraft.core.Registry;\nimport net.minecraft.core.registries.BuiltInRegistries;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.effect.MobEffect;\nimport net.minecraft.world.effect.MobEffectCategory;\nimport net.minecraft.world.effect.MobEffectInstance;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.alchemy.Potion;\nimport net.minecraft.world.item.alchemy.PotionBrewing;\nimport net.minecraft.world.item.alchemy.Potions;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.potion.TANPotions;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.potion.ThirstEffect;\n\nimport java.util.function.BiConsumer;\n\npublic class ModPotions\n{\n    public static void registerEffects(BiConsumer<Identifier, MobEffect> func)\n    {\n        TANEffects.THIRST = registerEffect(func, \"thirst\", new ThirstEffect(MobEffectCategory.HARMFUL, 0x76DB4C));\n        TANEffects.ICE_RESISTANCE = registerEffect(func, \"ice_resistance\", new MobEffect(MobEffectCategory.BENEFICIAL, 0x77A9FF));\n        TANEffects.CLIMATE_CLEMENCY = registerEffect(func, \"climate_clemency\", new MobEffect(MobEffectCategory.BENEFICIAL, 0xB6B6B6));\n        TANEffects.INTERNAL_WARMTH = registerEffect(func, \"internal_warmth\", new MobEffect(MobEffectCategory.BENEFICIAL, 0xFFFAD9));\n        TANEffects.INTERNAL_CHILL = registerEffect(func, \"internal_chill\", new MobEffect(MobEffectCategory.BENEFICIAL, 0xE1FCFF));\n    }\n\n    public static void registerPotions(BiConsumer<Identifier, Potion> func)\n    {\n        TANPotions.ICE_RESISTANCE = registerPotion(func, \"ice_resistance\", new Potion(\"ice_resistance\", new MobEffectInstance(TANEffects.ICE_RESISTANCE, 3600)));\n        TANPotions.LONG_ICE_RESISTANCE = registerPotion(func, \"long_ice_resistance\", new Potion(\"long_ice_resistance\", new MobEffectInstance(TANEffects.ICE_RESISTANCE, 9600)));\n    }\n\n    private static Holder<MobEffect> registerEffect(BiConsumer<Identifier, MobEffect> func, String name, MobEffect effect)\n    {\n        Identifier location = Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name);\n        ResourceKey<MobEffect> key = ResourceKey.create(Registries.MOB_EFFECT, location);\n        func.accept(location, effect);\n        return BuiltInRegistries.MOB_EFFECT.get(key).orElseThrow();\n    }\n\n    private static Holder<Potion> registerPotion(BiConsumer<Identifier, Potion> func, String name, Potion potion)\n    {\n        Identifier location = Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name);\n        ResourceKey<Potion> key = ResourceKey.create(Registries.POTION, location);\n        func.accept(location, potion);\n        return BuiltInRegistries.POTION.get(key).orElseThrow();\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModRecipePropertySets.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.crafting.RecipePropertySet;\nimport toughasnails.core.ToughAsNails;\n\npublic class ModRecipePropertySets\n{\n    public static final ResourceKey<RecipePropertySet> WATER_PURIFYING = register(\"water_purifying\");\n\n    private static ResourceKey<RecipePropertySet> register(String name)\n    {\n        return ResourceKey.create(RecipePropertySet.TYPE_KEY, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModTags.java",
    "content": "package toughasnails.init;\n\nimport net.minecraft.core.Holder;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.tags.TagKey;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.EntityType;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.equipment.trim.TrimMaterial;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraft.world.level.block.Block;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.thirst.WaterType;\nimport toughasnails.core.ToughAsNails;\n\npublic class ModTags\n{\n    public static void init()\n    {\n        Blocks.init();\n        Items.init();\n        Biomes.init();\n        Trims.init();\n        EntityTypes.init();\n    }\n\n    public static class Blocks\n    {\n        private static void init() {}\n\n        public static final TagKey<Block> COOLING_BLOCKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"cooling_blocks\"));\n        public static final TagKey<Block> HEATING_BLOCKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"heating_blocks\"));\n        public static final TagKey<Block> PASSABLE_BLOCKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"passable_blocks\"));\n\n        public static TagKey<Block> create(Identifier name) \n        {\n            return TagKey.create(Registries.BLOCK, name);\n        }\n    }\n\n    public static class Items\n    {\n        private static void init() {}\n\n        public static final TagKey<Item> COOLING_ARMOR = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"cooling_armor\"));\n        public static final TagKey<Item> HEATING_ARMOR = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"heating_armor\"));\n        public static final TagKey<Item> COOLING_HELD_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"cooling_held_items\"));\n        public static final TagKey<Item> HEATING_HELD_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"heating_held_items\"));\n        public static final TagKey<Item> COOLING_CONSUMED_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"cooling_consumed_items\"));\n        public static final TagKey<Item> HEATING_CONSUMED_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"heating_consumed_items\"));\n\n        public static final TagKey<Item> THERMOREGULATOR_COOLING_FUEL = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thermoregulator_cooling_fuel\"));\n        public static final TagKey<Item> THERMOREGULATOR_HEATING_FUEL = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thermoregulator_heating_fuel\"));\n\n        public static final TagKey<Item> ONE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/1_thirst_drinks\"));\n        public static final TagKey<Item> TWO_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/2_thirst_drinks\"));\n        public static final TagKey<Item> THREE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/3_thirst_drinks\"));\n        public static final TagKey<Item> FOUR_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/4_thirst_drinks\"));\n        public static final TagKey<Item> FIVE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/5_thirst_drinks\"));\n        public static final TagKey<Item> SIX_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/6_thirst_drinks\"));\n        public static final TagKey<Item> SEVEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/7_thirst_drinks\"));\n        public static final TagKey<Item> EIGHT_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/8_thirst_drinks\"));\n        public static final TagKey<Item> NINE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/9_thirst_drinks\"));\n        public static final TagKey<Item> TEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/10_thirst_drinks\"));\n        public static final TagKey<Item> ELEVEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/11_thirst_drinks\"));\n        public static final TagKey<Item> TWELVE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/12_thirst_drinks\"));\n        public static final TagKey<Item> THIRTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/13_thirst_drinks\"));\n        public static final TagKey<Item> FOURTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/14_thirst_drinks\"));\n        public static final TagKey<Item> FIFTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/15_thirst_drinks\"));\n        public static final TagKey<Item> SIXTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/16_thirst_drinks\"));\n        public static final TagKey<Item> SEVENTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/17_thirst_drinks\"));\n        public static final TagKey<Item> EIGHTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/18_thirst_drinks\"));\n        public static final TagKey<Item> NINETEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/19_thirst_drinks\"));\n        public static final TagKey<Item> TWENTY_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"thirst/20_thirst_drinks\"));\n\n        public static final TagKey<Item> TEN_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/10_hydration_drinks\"));\n        public static final TagKey<Item> TWENTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/20_hydration_drinks\"));\n        public static final TagKey<Item> THIRTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/30_hydration_drinks\"));\n        public static final TagKey<Item> FOURTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/40_hydration_drinks\"));\n        public static final TagKey<Item> FIFTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/50_hydration_drinks\"));\n        public static final TagKey<Item> SIXTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/60_hydration_drinks\"));\n        public static final TagKey<Item> SEVENTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/70_hydration_drinks\"));\n        public static final TagKey<Item> EIGHTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/80_hydration_drinks\"));\n        public static final TagKey<Item> NINETY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/90_hydration_drinks\"));\n        public static final TagKey<Item> ONE_HUNDRED_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hydration/100_hydration_drinks\"));\n\n        public static final TagKey<Item> TWENTY_FIVE_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"poison_chance/25_poison_chance_drinks\"));\n        public static final TagKey<Item> FIFTY_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"poison_chance/50_poison_chance_drinks\"));\n        public static final TagKey<Item> SEVENTY_FIVE_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"poison_chance/75_poison_chance_drinks\"));\n        public static final TagKey<Item> ONE_HUNDRED_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"poison_chance/100_poison_chance_drinks\"));\n\n        public static final TagKey<Item> DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"drinks\"));\n        public static final TagKey<Item> CANTEEN = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"enchantable/canteen\"));\n        public static int getThirstRestored(ItemStack drink)\n        {\n            if (drink.is(ModTags.Items.ONE_THIRST_DRINKS)) { return 1; }\n            if (drink.is(ModTags.Items.TWO_THIRST_DRINKS)) { return 2; }\n            if (drink.is(ModTags.Items.THREE_THIRST_DRINKS)) { return 3; }\n            if (drink.is(ModTags.Items.FOUR_THIRST_DRINKS)) { return 4; }\n            if (drink.is(ModTags.Items.FIVE_THIRST_DRINKS)) { return 5; }\n            if (drink.is(ModTags.Items.SIX_THIRST_DRINKS)) { return 6; }\n            if (drink.is(ModTags.Items.SEVEN_THIRST_DRINKS)) { return 7; }\n            if (drink.is(ModTags.Items.EIGHT_THIRST_DRINKS)) { return 8; }\n            if (drink.is(ModTags.Items.NINE_THIRST_DRINKS)) { return 9; }\n            if (drink.is(ModTags.Items.TEN_THIRST_DRINKS)) { return 10; }\n            if (drink.is(ModTags.Items.ELEVEN_THIRST_DRINKS)) { return 11; }\n            if (drink.is(ModTags.Items.TWELVE_THIRST_DRINKS)) { return 12; }\n            if (drink.is(ModTags.Items.THIRTEEN_THIRST_DRINKS)) { return 13; }\n            if (drink.is(ModTags.Items.FOURTEEN_THIRST_DRINKS)) { return 14; }\n            if (drink.is(ModTags.Items.FIFTEEN_THIRST_DRINKS)) { return 15; }\n            if (drink.is(ModTags.Items.SIXTEEN_THIRST_DRINKS)) { return 16; }\n            if (drink.is(ModTags.Items.SEVENTEEN_THIRST_DRINKS)) { return 17; }\n            if (drink.is(ModTags.Items.EIGHTEEN_THIRST_DRINKS)) { return 18; }\n            if (drink.is(ModTags.Items.NINETEEN_THIRST_DRINKS)) { return 19; }\n            if (drink.is(ModTags.Items.TWENTY_THIRST_DRINKS)) { return 20; }\n            return 0;\n        }\n\n        public static TagKey<Item> create(final Identifier name) \n        {\n            return TagKey.create(Registries.ITEM, name);\n        }\n    }\n\n    public static class Biomes\n    {\n        private static void init() {}\n\n        public static final TagKey<Biome> ICY_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"icy_biomes\"));\n        public static final TagKey<Biome> COLD_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"cold_biomes\"));\n        public static final TagKey<Biome> NEUTRAL_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"neutral_biomes\"));\n        public static final TagKey<Biome> WARM_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"warm_biomes\"));\n        public static final TagKey<Biome> HOT_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"hot_biomes\"));\n        public static final TagKey<Biome> DIRTY_WATER_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"dirty_water_biomes\"));\n        public static final TagKey<Biome> PURIFIED_WATER_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"purified_water_biomes\"));\n\n        private static TagKey<Biome> create(Identifier loc)\n        {\n            return TagKey.create(Registries.BIOME, loc);\n        }\n\n        public static WaterType getBiomeWaterType(Holder<Biome> biome)\n        {\n            if (biome.is(DIRTY_WATER_BIOMES))\n                return WaterType.DIRTY;\n            else if (biome.is(PURIFIED_WATER_BIOMES))\n                return WaterType.PURIFIED;\n            else\n                return WaterType.NORMAL;\n        }\n    }\n\n    public static class Trims\n    {\n        public static void init() {}\n\n        public static final TagKey<TrimMaterial> COOLING_TRIMS =  create(\"cooling_trims\");\n        public static final TagKey<TrimMaterial> HEATING_TRIMS =  create(\"heating_trims\");\n\n        private static TagKey<TrimMaterial> create(String name)\n        {\n            return TagKey.create(Registries.TRIM_MATERIAL, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));\n        }\n    }\n\n    public static class EntityTypes\n    {\n        private static void init() {}\n\n        public static final TagKey<EntityType<?>> NEUTRALISING_MOUNTS = create(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, \"neutralising_mounts\"));\n\n        public static TagKey<EntityType<?>> create(Identifier name)\n        {\n            return TagKey.create(Registries.ENTITY_TYPE, name);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/init/ModVillages.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.init;\n\nimport com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.ImmutableSet;\nimport com.mojang.datafixers.util.Pair;\nimport glitchcore.event.village.VillagerTradesEvent;\nimport glitchcore.event.village.WandererTradesEvent;\nimport it.unimi.dsi.fastutil.ints.Int2ObjectMap;\nimport it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;\nimport net.minecraft.core.Holder;\nimport net.minecraft.core.Registry;\nimport net.minecraft.core.RegistryAccess;\nimport net.minecraft.core.registries.BuiltInRegistries;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.network.chat.Component;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.sounds.SoundEvent;\nimport net.minecraft.sounds.SoundEvents;\nimport net.minecraft.util.RandomSource;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.ai.village.poi.PoiType;\nimport net.minecraft.world.entity.ai.village.poi.PoiTypes;\nimport net.minecraft.world.entity.npc.villager.VillagerProfession;\nimport net.minecraft.world.entity.npc.villager.VillagerTrades;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.trading.ItemCost;\nimport net.minecraft.world.item.trading.MerchantOffer;\nimport net.minecraft.world.level.ItemLike;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.Blocks;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.levelgen.structure.pools.SinglePoolElement;\nimport net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement;\nimport net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;\nimport net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.api.village.TANPoiTypes;\nimport toughasnails.api.village.TANVillagerProfessions;\nimport toughasnails.core.ToughAsNails;\n\nimport javax.annotation.Nullable;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.function.BiConsumer;\nimport java.util.function.Predicate;\n\npublic class ModVillages\n{\n    //Cost, Amount, Trades Until Disabled, Villager XP, Price Multiplier\n    //Amount Required, Trades Until Disabled, Villager XP\n    private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_1_TRADES = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(new ItemStack(TANItems.ICE_CREAM), 1, 2, 12, 1, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.CHARC_0S), 1, 2, 12, 1, 0.2F)};\n\n    private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_2_TRADES = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(new ItemStack(Blocks.PACKED_ICE), 4, 8, 16, 1, 0.2F),\n            new ItemsForEmeralds(new ItemStack(Blocks.MAGMA_BLOCK), 4, 8, 16, 1, 0.2F),\n            new EmeraldForItems(Blocks.PACKED_ICE, 16, 10, 2),\n            new EmeraldForItems(Blocks.MAGMA_BLOCK, 16, 10, 2)};\n\n    private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_3_TRADES = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(new ItemStack(TANItems.WOOL_HELMET), 5, 1, 12, 3, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.WOOL_BOOTS), 4, 1, 12, 3, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.LEAF_HELMET), 5, 1, 12, 3, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.LEAF_BOOTS), 4, 1, 12, 3, 0.2F)};\n\n    private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_4_TRADES = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(new ItemStack(TANItems.WOOL_CHESTPLATE), 7, 1, 12, 3, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.WOOL_LEGGINGS), 3, 1, 12, 3, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.LEAF_CHESTPLATE), 7, 1, 12, 3, 0.2F),\n            new ItemsForEmeralds(new ItemStack(TANItems.LEAF_LEGGINGS), 3, 1, 12, 3, 0.2F)};\n\n    private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_5_TRADES = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(new ItemStack(Items.POWDER_SNOW_BUCKET), 4, 1, 10, 2, 0.2F),\n            new ItemsForEmeralds(new ItemStack(Items.LAVA_BUCKET), 4, 1, 10, 2, 0.2F),\n            new EmeraldForItems(Items.SNOWBALL, 16, 5, 1),\n            new EmeraldForItems(Items.CHARCOAL, 16, 5, 1)};\n\n    private static final Int2ObjectMap<VillagerTrades.ItemListing[]> CLIMATOLOGIST_TRADES = toIntMap(ImmutableMap.of(1, CLIMATOLOGIST_LEVEL_1_TRADES, 2, CLIMATOLOGIST_LEVEL_2_TRADES, 3, CLIMATOLOGIST_LEVEL_3_TRADES, 4, CLIMATOLOGIST_LEVEL_4_TRADES, 5, CLIMATOLOGIST_LEVEL_5_TRADES));\n\n    public static void addVillagerTrades(VillagerTradesEvent event)\n    {\n        if (event.getProfession() == TANVillagerProfessions.CLIMATOLOGIST)\n        {\n            for (int level = 1; level <= 5; level++)\n            {\n                for (VillagerTrades.ItemListing trade : CLIMATOLOGIST_TRADES.get(level))\n                {\n                    if (event.getLevel() == level)\n                    {\n                        event.getTrades().add(trade);\n                    }\n                }\n            }\n        }\n    }\n\n    //Cost, Amount, Trades Until Disabled, Villager XP\n    private static final VillagerTrades.ItemListing[] WANDERING_TRADER_GENERIC = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(TANItems.ICE_CREAM, 2, 1, 4, 1),\n            new ItemsForEmeralds(TANItems.CHARC_0S, 2, 1, 4, 1),\n            new ItemsForEmeralds(TANItems.GLOW_BERRY_JUICE, 2, 1, 4, 1),\n            new ItemsForEmeralds(TANItems.SWEET_BERRY_JUICE, 2, 1, 4, 1),\n            new ItemsForEmeralds(TANItems.PUMPKIN_JUICE, 2, 1, 3, 1),\n            new ItemsForEmeralds(TANItems.MELON_JUICE, 3, 1, 3, 1),\n            new ItemsForEmeralds(TANItems.APPLE_JUICE, 4, 1, 2, 1),\n            new ItemsForEmeralds(TANItems.CACTUS_JUICE, 4, 1, 2, 1)};\n\n    private static final VillagerTrades.ItemListing[] WANDERING_TRADER_RARE = new VillagerTrades.ItemListing[]{\n            new ItemsForEmeralds(TANItems.CHORUS_FRUIT_JUICE, 5, 1, 1, 1),\n            new ItemsForEmeralds(TANItems.PURIFIED_WATER_BOTTLE, 4, 1, 2, 1)};\n\n    public static void addWanderingVillagerTrades(WandererTradesEvent event)\n    {\n        event.addGenericTrades(Arrays.stream(WANDERING_TRADER_GENERIC).toList());\n        event.addRareTrades(Arrays.stream(WANDERING_TRADER_RARE).toList());\n    }\n\n    public static void addBuildings(RegistryAccess registryAccess)\n    {\n        Registry<StructureTemplatePool> templatePools = registryAccess.lookupOrThrow(Registries.TEMPLATE_POOL);\n        Registry<StructureProcessorList> processorLists = registryAccess.lookupOrThrow(Registries.PROCESSOR_LIST);\n\n        addBuildingToPool(templatePools, processorLists, Identifier.parse(\"minecraft:village/desert/houses\"), ToughAsNails.MOD_ID + \":village/desert/houses/desert_climatologist_1\", 1);\n        addBuildingToPool(templatePools, processorLists, Identifier.parse(\"minecraft:village/savanna/houses\"), ToughAsNails.MOD_ID + \":village/savanna/houses/savanna_climatologist_1\", 2);\n        addBuildingToPool(templatePools, processorLists, Identifier.parse(\"minecraft:village/plains/houses\"), ToughAsNails.MOD_ID + \":village/plains/houses/plains_climatologist_1\", 2);\n        addBuildingToPool(templatePools, processorLists, Identifier.parse(\"minecraft:village/taiga/houses\"), ToughAsNails.MOD_ID + \":village/taiga/houses/taiga_climatologist_1\", 3);\n        addBuildingToPool(templatePools, processorLists, Identifier.parse(\"minecraft:village/snowy/houses\"), ToughAsNails.MOD_ID + \":village/snowy/houses/snowy_climatologist_1\", 2);\n    }\n\n    public static void registerPointsOfInterest(BiConsumer<Identifier, PoiType> func)\n    {\n        register(func, TANPoiTypes.CLIMATOLOGIST, getBlockStates(TANBlocks.THERMOREGULATOR), 1, 1);\n    }\n\n    public static void registerProfessions(BiConsumer<Identifier, VillagerProfession> func)\n    {\n        register(func, TANVillagerProfessions.CLIMATOLOGIST, TANPoiTypes.CLIMATOLOGIST, SoundEvents.VILLAGER_WORK_ARMORER);\n    }\n\n    static class EmeraldForItems implements VillagerTrades.ItemListing {\n        private final Item item;\n        private final int cost;\n        private final int maxUses;\n        private final int villagerXp;\n        private final float priceMultiplier;\n\n        public EmeraldForItems(ItemLike p_35657_, int p_35658_, int p_35659_, int p_35660_) {\n            this.item = p_35657_.asItem();\n            this.cost = p_35658_;\n            this.maxUses = p_35659_;\n            this.villagerXp = p_35660_;\n            this.priceMultiplier = 0.05F;\n        }\n\n        @Override\n        public MerchantOffer getOffer(ServerLevel level, Entity p_219682_, RandomSource p_219683_) {\n            ItemCost cost = new ItemCost(this.item, this.cost);\n            return new MerchantOffer(cost, new ItemStack(Items.EMERALD), this.maxUses, this.villagerXp, this.priceMultiplier);\n        }\n    }\n\n    static class ItemsForEmeralds implements VillagerTrades.ItemListing {\n        private final ItemStack itemStack;\n        private final int emeraldCost;\n        private final int numberOfItems;\n        private final int maxUses;\n        private final int villagerXp;\n        private final float priceMultiplier;\n\n        public ItemsForEmeralds(Item p_35746_, int p_35747_, int p_35748_, int p_35749_, int p_35750_) {\n            this(new ItemStack(p_35746_), p_35747_, p_35748_, p_35749_, p_35750_);\n        }\n\n        public ItemsForEmeralds(ItemStack p_35752_, int p_35753_, int p_35754_, int p_35755_, int p_35756_) {\n            this(p_35752_, p_35753_, p_35754_, p_35755_, p_35756_, 0.05F);\n        }\n\n        public ItemsForEmeralds(ItemStack p_35758_, int p_35759_, int p_35760_, int p_35761_, int p_35762_, float p_35763_) {\n            this.itemStack = p_35758_;\n            this.emeraldCost = p_35759_;\n            this.numberOfItems = p_35760_;\n            this.maxUses = p_35761_;\n            this.villagerXp = p_35762_;\n            this.priceMultiplier = p_35763_;\n        }\n\n        @Override\n        public MerchantOffer getOffer(ServerLevel level, Entity p_219699_, RandomSource p_219700_) {\n            return new MerchantOffer(new ItemCost(Items.EMERALD, this.emeraldCost), new ItemStack(this.itemStack.getItem(), this.numberOfItems), this.maxUses, this.villagerXp, this.priceMultiplier);\n        }\n    }\n\n    private static Int2ObjectMap<VillagerTrades.ItemListing[]> toIntMap(ImmutableMap<Integer, VillagerTrades.ItemListing[]> p_221238_0_) {\n        return new Int2ObjectOpenHashMap<>(p_221238_0_);\n    }\n\n    public static void addBuildingToPool(Registry<StructureTemplatePool> templatePoolRegistry, Registry<StructureProcessorList> processorListRegistry, Identifier poolRL, String nbtPieceRL, int weight)\n    {\n        templatePoolRegistry.get(poolRL).ifPresent(pool -> {\n            Identifier emptyProcessor = Identifier.fromNamespaceAndPath(\"minecraft\", \"empty\");\n            Holder<StructureProcessorList> processorHolder = processorListRegistry.getOrThrow(ResourceKey.create(Registries.PROCESSOR_LIST, emptyProcessor));\n\n            SinglePoolElement piece = SinglePoolElement.single(nbtPieceRL, processorHolder).apply(StructureTemplatePool.Projection.RIGID);\n\n            for (int i = 0; i < weight; i++) {\n                pool.value().templates.add(piece);\n            }\n\n            List<Pair<StructurePoolElement, Integer>> listOfPieceEntries = new ArrayList<>(pool.value().rawTemplates);\n            listOfPieceEntries.add(new Pair<>(piece, weight));\n            pool.value().rawTemplates = listOfPieceEntries;\n        });\n    }\n\n    private static PoiType register(BiConsumer<Identifier, PoiType> func, ResourceKey<PoiType> key, Set<BlockState> states, int maxTickets, int validRange)\n    {\n        PoiType type = new PoiType(states, maxTickets, validRange);\n        func.accept(key.identifier(), type);\n        registerBlockStates(key, states);\n        return type;\n    }\n\n    private static VillagerProfession register(BiConsumer<Identifier, VillagerProfession> func, ResourceKey<VillagerProfession> key, ResourceKey<PoiType> poi, @Nullable SoundEvent workSound)\n    {\n        return register(func, key, (h) -> h.is(poi), (h) -> h.is(poi), workSound);\n    }\n\n    private static VillagerProfession register(BiConsumer<Identifier, VillagerProfession> func, ResourceKey<VillagerProfession> key, Predicate<Holder<PoiType>> heldJobSite, Predicate<Holder<PoiType>> acquirableJobSite, @Nullable SoundEvent workSound)\n    {\n        return register(func, key, heldJobSite, acquirableJobSite, ImmutableSet.of(), ImmutableSet.of(), workSound);\n    }\n\n    private static VillagerProfession register(BiConsumer<Identifier, VillagerProfession> func, ResourceKey<VillagerProfession> key, ResourceKey<PoiType> poi, ImmutableSet<Item> requestedItems, ImmutableSet<Block> secondaryPoi, @Nullable SoundEvent workSound) {\n        return register(func, key, ($$1x) -> $$1x.is(poi), ($$1x) -> $$1x.is(poi), requestedItems, secondaryPoi, workSound);\n    }\n\n    private static VillagerProfession register(BiConsumer<Identifier, VillagerProfession> func, ResourceKey<VillagerProfession> key, Predicate<Holder<PoiType>> heldJobSite, Predicate<Holder<PoiType>> acquirableJobSite, ImmutableSet<Item> requestedItems, ImmutableSet<Block> secondaryPoi, @Nullable SoundEvent workSound) {\n        return register(func, key, new VillagerProfession(Component.translatable(\"entity.\" + ToughAsNails.MOD_ID + \".villager.\" + key.identifier().getPath()), heldJobSite, acquirableJobSite, requestedItems, secondaryPoi, workSound));\n    }\n\n    private static VillagerProfession register(BiConsumer<Identifier, VillagerProfession> func, ResourceKey<VillagerProfession> key, VillagerProfession profession)\n    {\n        func.accept(key.identifier(), profession);\n        return profession;\n    }\n\n    private static Set<BlockState> getBlockStates(Block block)\n    {\n        return ImmutableSet.copyOf(block.getStateDefinition().getPossibleStates());\n    }\n\n    private static void registerBlockStates(ResourceKey<PoiType> key, Set<BlockState> states)\n    {\n        var holder = BuiltInRegistries.POINT_OF_INTEREST_TYPE.getOrThrow(key);\n        states.forEach(state -> {\n            if (!PoiTypes.hasPoi(state)) PoiTypes.registerBlockStates(holder, Set.of(state));\n        });\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/DirtyWaterBottleItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\nimport net.minecraft.world.item.Item;\n\npublic class DirtyWaterBottleItem extends DrinkItem\n{\n    public DirtyWaterBottleItem(Item.Properties properties)\n    {\n        super(properties);\n    }\n\n    @Override\n    public boolean canAlwaysDrink()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/DrinkItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\nimport net.minecraft.advancements.CriteriaTriggers;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.stats.Stats;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.*;\nimport net.minecraft.world.level.Level;\nimport toughasnails.api.thirst.ThirstHelper;\n\npublic abstract class DrinkItem extends Item\n{\n    public DrinkItem(Properties properties)\n    {\n        super(properties);\n    }\n\n    @Override\n    public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity entityLiving)\n    {\n        Player player = entityLiving instanceof Player ? (Player)entityLiving : null;\n\n        // Do nothing if this isn't a player\n        if (player == null)\n            return stack;\n\n        if (player instanceof ServerPlayer)\n        {\n            CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer)player, stack);\n        }\n\n        player.awardStat(Stats.ITEM_USED.get(this));\n\n        if (!player.getAbilities().instabuild)\n        {\n            stack.shrink(1);\n\n            if (stack.isEmpty())\n            {\n                return new ItemStack(Items.GLASS_BOTTLE);\n            }\n\n            player.getInventory().add(new ItemStack(Items.GLASS_BOTTLE));\n        }\n\n        return stack;\n    }\n\n    @Override\n    public int getUseDuration(ItemStack stack, LivingEntity entity)\n    {\n        return 32;\n    }\n\n    @Override\n    public ItemUseAnimation getUseAnimation(ItemStack stack)\n    {\n        return ItemUseAnimation.DRINK;\n    }\n\n    @Override\n    public InteractionResult use(Level world, Player player, InteractionHand hand)\n    {\n        if (ThirstHelper.canDrink(player, this.canAlwaysDrink()))\n        {\n            return ItemUtils.startUsingInstantly(world, player, hand);\n        }\n\n        return InteractionResult.FAIL;\n    }\n\n    public abstract boolean canAlwaysDrink();\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/EmptyCanteenItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Holder;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.sounds.SoundEvents;\nimport net.minecraft.sounds.SoundSource;\nimport net.minecraft.stats.Stats;\nimport net.minecraft.tags.FluidTags;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.ItemUtils;\nimport net.minecraft.world.item.enchantment.EnchantmentHelper;\nimport net.minecraft.world.level.ClipContext;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraft.world.level.block.Block;\nimport net.minecraft.world.level.block.Blocks;\nimport net.minecraft.world.level.block.LayeredCauldronBlock;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.phys.BlockHitResult;\nimport net.minecraft.world.phys.HitResult;\nimport org.jetbrains.annotations.NotNull;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.api.enchantment.TANEnchantments;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.block.RainCollectorBlock;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModTags;\n\npublic class EmptyCanteenItem extends Item\n{\n    int tier;\n\n    public EmptyCanteenItem(int tier, Properties properties)\n    {\n        super(properties);\n        this.tier = tier;\n    }\n\n    @Override\n    public InteractionResult use(@NotNull Level level, Player player, @NotNull InteractionHand hand)\n    {\n        return this.fillCanteen(level, player, player.getItemInHand(hand));\n    }\n\n    protected InteractionResult fillCanteen(Level level, Player player, ItemStack stack)\n    {\n        HitResult rayTraceResult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY);\n\n        if (rayTraceResult.getType() == HitResult.Type.BLOCK)\n        {\n            BlockPos pos = ((BlockHitResult)rayTraceResult).getBlockPos();\n\n            if (level.mayInteract(player, pos))\n            {\n                BlockState state = level.getBlockState(pos);\n\n                if (state.getBlock() instanceof RainCollectorBlock)\n                {\n                    // Fill the canteen from purified water from a rain collector\n                    int waterLevel = state.getValue(RainCollectorBlock.LEVEL);\n\n                    if (waterLevel > 0 && !level.isClientSide())\n                    {\n                        level.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_FILL, SoundSource.NEUTRAL, 1.0F, 1.0F);\n                        ((RainCollectorBlock) TANBlocks.RAIN_COLLECTOR).setWaterLevel(level, pos, state, waterLevel - 1);\n                        return InteractionResult.SUCCESS.heldItemTransformedTo(this.replaceCanteen(stack, player, new ItemStack(getPurifiedWaterCanteen())));\n                    }\n                }\n                else if (state.getBlock() == Blocks.WATER_CAULDRON)\n                {\n                    // Fill the canteen from water from a cauldron\n                    int waterLevel = state.getValue(LayeredCauldronBlock.LEVEL);\n\n                    if (waterLevel > 0 && !level.isClientSide())\n                    {\n                        level.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_FILL, SoundSource.NEUTRAL, 1.0F, 1.0F);\n                        LayeredCauldronBlock.lowerFillLevel(state, level, pos);\n                        return InteractionResult.SUCCESS.heldItemTransformedTo(this.replaceCanteen(stack, player, new ItemStack(getWaterCanteen())));\n                    }\n                }\n                else if (level.getFluidState(pos).is(FluidTags.WATER))\n                {\n                    // Fill the canteen with water in the world\n                    level.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_FILL, SoundSource.NEUTRAL, 1.0F, 1.0F);\n\n                    if (ModConfig.thirst.removeSourceBlocks)\n                        level.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL_IMMEDIATE);\n\n                    Holder<Biome> biome = player.level().getBiome(player.blockPosition());\n                    Item canteenItem;\n\n                    var enchantmentRegistry = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT);\n                    if (EnchantmentHelper.getItemEnchantmentLevel(enchantmentRegistry.getOrThrow(TANEnchantments.WATER_CLEANSING), stack) > 0 || biome.is(ModTags.Biomes.PURIFIED_WATER_BIOMES))\n                    {\n                        canteenItem = getPurifiedWaterCanteen();\n                    }\n                    else if (biome.is(ModTags.Biomes.DIRTY_WATER_BIOMES))\n                    {\n                        canteenItem = getDirtyWaterCanteen();\n                    }\n                    else\n                    {\n                        canteenItem = getWaterCanteen();\n                    }\n\n                    return InteractionResult.SUCCESS.heldItemTransformedTo(this.replaceCanteen(stack, player, new ItemStack(canteenItem)));\n                }\n            }\n        }\n\n        return InteractionResult.PASS;\n    }\n\n    protected ItemStack replaceCanteen(ItemStack oldStack, Player player, ItemStack newStack)\n    {\n        player.awardStat(Stats.ITEM_USED.get(this));\n\n        // Copy enchantments from the old stack to the new stack\n        EnchantmentHelper.setEnchantments(newStack, EnchantmentHelper.getEnchantmentsForCrafting(oldStack));\n        return ItemUtils.createFilledResult(oldStack, player, newStack);\n    }\n\n    public Item getDirtyWaterCanteen()\n    {\n        switch (this.tier)\n        {\n            default: case 0: return TANItems.LEATHER_DIRTY_WATER_CANTEEN;\n            case 1: return TANItems.COPPER_DIRTY_WATER_CANTEEN;\n            case 2: return TANItems.IRON_DIRTY_WATER_CANTEEN;\n            case 3: return TANItems.GOLD_DIRTY_WATER_CANTEEN;\n            case 4: return TANItems.DIAMOND_DIRTY_WATER_CANTEEN;\n            case 5: return TANItems.NETHERITE_DIRTY_WATER_CANTEEN;\n        }\n    }\n\n    public Item getWaterCanteen()\n    {\n        switch (this.tier)\n        {\n            default: case 0: return TANItems.LEATHER_WATER_CANTEEN;\n            case 1: return TANItems.COPPER_WATER_CANTEEN;\n            case 2: return TANItems.IRON_WATER_CANTEEN;\n            case 3: return TANItems.GOLD_WATER_CANTEEN;\n            case 4: return TANItems.DIAMOND_WATER_CANTEEN;\n            case 5: return TANItems.NETHERITE_WATER_CANTEEN;\n        }\n    }\n\n    public Item getPurifiedWaterCanteen()\n    {\n        switch (this.tier)\n        {\n            default: case 0: return TANItems.LEATHER_PURIFIED_WATER_CANTEEN;\n            case 1: return TANItems.COPPER_PURIFIED_WATER_CANTEEN;\n            case 2: return TANItems.IRON_PURIFIED_WATER_CANTEEN;\n            case 3: return TANItems.GOLD_PURIFIED_WATER_CANTEEN;\n            case 4: return TANItems.DIAMOND_PURIFIED_WATER_CANTEEN;\n            case 5: return TANItems.NETHERITE_PURIFIED_WATER_CANTEEN;\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/FilledCanteenItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\nimport glitchcore.event.EventManager;\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.sounds.SoundEvent;\nimport net.minecraft.sounds.SoundEvents;\nimport net.minecraft.stats.Stats;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.EquipmentSlot;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Inventory;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.ItemUseAnimation;\nimport net.minecraft.world.item.ItemUtils;\nimport net.minecraft.world.item.component.Consumable;\nimport net.minecraft.world.level.Level;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.api.thirst.ThirstHelper;\n\nimport javax.annotation.Nullable;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\npublic class FilledCanteenItem extends EmptyCanteenItem\n{\n    private static final int CONSUME_TICKS = 32;\n\n    public FilledCanteenItem(int tier, Properties properties)\n    {\n        super(tier, properties);\n    }\n\n    @Override\n    public void inventoryTick(ItemStack stack, ServerLevel level, Entity entity, @Nullable EquipmentSlot slot)\n    {\n        if (!(entity instanceof Player player) || stack.getItem() == getPurifiedWaterCanteen() || stack.getEnchantments().isEmpty())\n            return;\n\n        // Create a new stack with the same damage value, except purified\n        ItemStack newStack = new ItemStack(getPurifiedWaterCanteen());\n        newStack.setDamageValue(stack.getDamageValue());\n        stack.getEnchantments().entrySet().forEach(e -> newStack.enchant(e.getKey(), e.getIntValue()));\n\n        // Replace the current stack in the player's inventory\n        player.getInventory().setItem(slot.getIndex(), newStack);\n    }\n\n    @Override\n    public void onUseTick(Level level, LivingEntity entity, ItemStack stack, int useItemRemainingTicks)\n    {\n        if (shouldEmitSounds(useItemRemainingTicks))\n        {\n            entity.playSound(SoundEvents.GENERIC_DRINK.value(), 0.5F, Mth.randomBetween(level.getRandom(), 0.9F, 1.0F));\n        }\n    }\n\n    private boolean shouldEmitSounds(int useItemRemainingTicks)\n    {\n        int elapsedTicks = CONSUME_TICKS - useItemRemainingTicks;\n        int delay = (int)(CONSUME_TICKS * 0.21875F);\n        boolean flag = elapsedTicks > delay;\n        return flag && useItemRemainingTicks % 4 == 0;\n    }\n\n    @Override\n    public InteractionResult use(Level level, Player player, InteractionHand hand)\n    {\n        ItemStack stack = player.getItemInHand(hand);\n        InteractionResult result;\n\n        if ((result = this.fillCanteen(level, player, stack)).consumesAction())\n        {\n            return result;\n        }\n\n        if (ThirstHelper.canDrink(player, this.canAlwaysDrink()))\n        {\n            return ItemUtils.startUsingInstantly(level, player, hand);\n        }\n\n        return InteractionResult.FAIL;\n    }\n\n    @Override\n    public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity entityLiving)\n    {\n        Player player = entityLiving instanceof Player ? (Player)entityLiving : null;\n\n        // Do nothing if this isn't a player\n        if (player == null)\n            return stack;\n\n        player.awardStat(Stats.ITEM_USED.get(this));\n\n        // Damage the item if we're on the server and the player isn't in creative mode\n        if (!worldIn.isClientSide() && !player.getAbilities().instabuild)\n        {\n            ItemStack emptyStack = new ItemStack(getEmptyCanteen());\n            stack.getEnchantments().entrySet().forEach(e -> emptyStack.enchant(e.getKey(), e.getIntValue()));\n\n            AtomicBoolean broken = new AtomicBoolean(false);\n            stack.hurtAndBreak(1, (ServerLevel)worldIn, (ServerPlayer)player, item -> broken.set(true));\n            if (broken.get())\n            {\n                return emptyStack;\n            }\n        }\n\n        return stack;\n    }\n\n    @Override\n    public int getUseDuration(ItemStack stack, LivingEntity entity)\n    {\n        return CONSUME_TICKS;\n    }\n\n    @Override\n    public ItemUseAnimation getUseAnimation(ItemStack stack)\n    {\n        return ItemUseAnimation.DRINK;\n    }\n\n    public boolean canAlwaysDrink()\n    {\n        return false;\n    }\n\n    public Item getEmptyCanteen()\n    {\n        switch (this.tier)\n        {\n            default: case 0: return TANItems.EMPTY_LEATHER_CANTEEN;\n            case 1: return TANItems.EMPTY_COPPER_CANTEEN;\n            case 2: return TANItems.EMPTY_IRON_CANTEEN;\n            case 3: return TANItems.EMPTY_GOLD_CANTEEN;\n            case 4: return TANItems.EMPTY_DIAMOND_CANTEEN;\n            case 5: return TANItems.EMPTY_NETHERITE_CANTEEN;\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/JuiceItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\npublic class JuiceItem extends DrinkItem\n{\n    public JuiceItem(Properties properties)\n    {\n        super(properties);\n    }\n\n    @Override\n    public boolean canAlwaysDrink()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/PurifiedWaterBottleItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\npublic class PurifiedWaterBottleItem extends DrinkItem\n{\n    public PurifiedWaterBottleItem(Properties properties)\n    {\n        super(properties);\n    }\n\n    @Override\n    public boolean canAlwaysDrink()\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/item/StackableBowlFoodItem.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.item;\n\nimport net.minecraft.advancements.CriteriaTriggers;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.stats.Stats;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.level.Level;\n\npublic class StackableBowlFoodItem extends Item\n{\n    public StackableBowlFoodItem(Properties properties)\n    {\n        super(properties);\n    }\n\n    @Override\n    public ItemStack finishUsingItem(ItemStack stack, Level worldIn, LivingEntity entityLiving)\n    {\n        Player player = entityLiving instanceof Player ? (Player)entityLiving : null;\n\n        // Do nothing if this isn't a player\n        if (player == null)\n            return stack;\n\n        if (player instanceof ServerPlayer)\n        {\n            CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer)player, stack);\n        }\n\n        player.awardStat(Stats.ITEM_USED.get(this));\n\n        if (!player.getAbilities().instabuild)\n        {\n            stack.shrink(1);\n\n            if (stack.isEmpty())\n            {\n                return new ItemStack(Items.BOWL);\n            }\n\n            player.getInventory().add(new ItemStack(Items.BOWL));\n        }\n\n        return stack;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinFoodData.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.food.FoodData;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.thirst.ThirstHooks;\n\n@Mixin(FoodData.class)\npublic abstract class MixinFoodData\n{\n    @Inject(method=\"tick\", at=@At(value=\"HEAD\"), cancellable = true)\n    public void onTick(ServerPlayer player, CallbackInfo ci)\n    {\n        ThirstHooks.doFoodDataTick((FoodData)(Object)this, player);\n        ci.cancel();\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinLivingEntity.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport net.minecraft.world.effect.MobEffects;\nimport net.minecraft.world.entity.Attackable;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.EntityType;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.level.Level;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.Redirect;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.core.ToughAsNails;\n\n@Mixin(LivingEntity.class)\npublic abstract class MixinLivingEntity extends Entity implements Attackable\n{\n    public MixinLivingEntity(EntityType<?> $$0, Level $$1) {\n        super($$0, $$1);\n    }\n\n    @Redirect(method=\"aiStep\", at=@At(value=\"INVOKE\", target=\"Lnet/minecraft/world/entity/LivingEntity;setTicksFrozen(I)V\"))\n    public void onAiStep_setTicksFrozen(LivingEntity instance, int ticks)\n    {\n        if (!((Object)this instanceof Player))\n        {\n            this.setTicksFrozen(ticks);\n        }\n    }\n\n    @Inject(method=\"aiStep\", at=@At(value=\"INVOKE\", target=\"Lnet/minecraft/world/entity/LivingEntity;getTicksFrozen()I\"))\n    public void onAiStep_getTicksFrozen(CallbackInfo ci)\n    {\n        // Only apply to players\n        if (!((Object)this instanceof Player))\n        {\n            return;\n        }\n\n        Player player = (Player)(Object)this;\n        ITemperature data = TemperatureHelper.getTemperatureData(player);\n        int prevTicksFrozen = player.getTicksFrozen();\n\n        if (!player.hasEffect(TANEffects.ICE_RESISTANCE))\n        {\n            if (!player.isCreative() && !player.isSpectator() && data.getLevel() == TemperatureLevel.ICY && data.getExtremityDelayTicks() == 0)\n            {\n                // Add 2 to the ticksRequiredToFreeze to cause damage\n                player.setTicksFrozen(Math.min(player.getTicksRequiredToFreeze() + 2, player.getTicksFrozen() + 2));\n            }\n            else if (this.isInPowderSnow && this.canFreeze())\n            {\n                this.setTicksFrozen(Math.min(this.getTicksRequiredToFreeze(), player.getTicksFrozen() + 1));\n            }\n        }\n        else\n        {\n            // Set frozen ticks to 0 if ice resistance is active\n            player.setTicksFrozen(0);\n        }\n\n        // If the ticksFrozen hasn't changed, do melting\n        if (prevTicksFrozen == player.getTicksFrozen())\n        {\n            this.setTicksFrozen(Math.max(0, player.getTicksFrozen() - 2));\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinPlayer.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport net.minecraft.client.renderer.BiomeColors;\nimport net.minecraft.core.component.DataComponents;\nimport net.minecraft.nbt.CompoundTag;\nimport net.minecraft.world.entity.EntityType;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Abilities;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.food.FoodData;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.component.DyedItemColor;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.storage.ValueInput;\nimport net.minecraft.world.level.storage.ValueOutput;\nimport org.spongepowered.asm.mixin.Final;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Shadow;\nimport org.spongepowered.asm.mixin.Unique;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.api.player.ITANPlayer;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.temperature.TemperatureData;\nimport toughasnails.temperature.TemperatureHandler;\nimport toughasnails.thirst.ThirstData;\nimport toughasnails.thirst.ThirstHandler;\nimport toughasnails.thirst.ThirstHooks;\n\n@Mixin(Player.class)\npublic abstract class MixinPlayer extends LivingEntity implements ITANPlayer\n{\n    @Shadow\n    @Final\n    private Abilities abilities;\n\n    @Unique\n    private TemperatureData temperatureData = new TemperatureData();\n    @Unique\n    private ThirstData thirstData = new ThirstData();\n    @Unique\n    private boolean climateClemencyGranted = false;\n\n\n    private MixinPlayer(EntityType<? extends LivingEntity> type, Level level)\n    {\n        super(type, level);\n    }\n\n    @Inject(method=\"readAdditionalSaveData\", at=@At(value=\"TAIL\"))\n    public void onReadAdditionalSaveData(ValueInput input, CallbackInfo ci)\n    {\n        this.temperatureData.readAdditionalSaveData(input);\n        this.thirstData.readAdditionalSaveData(input);\n        this.climateClemencyGranted = input.getBooleanOr(\"climateClemencyGranted\", false);\n    }\n\n    @Inject(method=\"addAdditionalSaveData\", at=@At(value=\"TAIL\"))\n    public void onAddAdditionalSaveData(ValueOutput output, CallbackInfo ci)\n    {\n        this.temperatureData.addAdditionalSaveData(output);\n        this.thirstData.addAdditionalSaveData(output);\n        output.putBoolean(\"climateClemencyGranted\", this.climateClemencyGranted);\n    }\n\n    @Inject(method=\"causeFoodExhaustion\", at=@At(value=\"HEAD\"))\n    public void onCauseFoodExhaustion(float exhaustion, CallbackInfo ci)\n    {\n        if (!this.abilities.invulnerable)\n        {\n            if (!this.level().isClientSide())\n            {\n                ThirstHooks.onCauseFoodExhaustion((Player)(Object)this, exhaustion);\n            }\n        }\n    }\n\n    @Inject(method=\"tick\", at=@At(value=\"TAIL\"))\n    public void onTick(CallbackInfo ci)\n    {\n        Player player = (Player)(Object)this;\n        TemperatureHandler.onPlayerTick(player);\n        ThirstHandler.onPlayerTick(player);\n    }\n\n    @Override\n    public ITemperature getTemperatureData()\n    {\n        return this.temperatureData;\n    }\n\n    @Override\n    public IThirst getThirstData()\n    {\n        return this.thirstData;\n    }\n\n    @Override\n    public boolean getClimateClemencyGranted()\n    {\n        return this.climateClemencyGranted;\n    }\n\n    @Override\n    public void setClimateClemencyGranted(boolean value)\n    {\n        this.climateClemencyGranted = value;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinPotionBrewing.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.alchemy.PotionBrewing;\nimport net.minecraft.world.item.alchemy.Potions;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.api.potion.TANPotions;\n\n@Mixin(PotionBrewing.class)\npublic class MixinPotionBrewing\n{\n    @Inject(method=\"addVanillaMixes\", at=@At(\"TAIL\"))\n    private static void addVanillaMixes(PotionBrewing.Builder builder, CallbackInfo ci)\n    {\n        builder.addMix(Potions.AWKWARD, Items.SNOWBALL, TANPotions.ICE_RESISTANCE);\n        builder.addMix(TANPotions.ICE_RESISTANCE, Items.REDSTONE, TANPotions.LONG_ICE_RESISTANCE);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinRecipeManager.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport com.google.common.collect.ImmutableMap;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.world.item.crafting.Ingredient;\nimport net.minecraft.world.item.crafting.RecipeManager;\nimport net.minecraft.world.item.crafting.RecipePropertySet;\nimport net.minecraft.world.item.crafting.SmithingRecipe;\nimport org.spongepowered.asm.mixin.Final;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Shadow;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.crafting.WaterPurifierRecipe;\nimport toughasnails.init.ModRecipePropertySets;\n\nimport java.util.Map;\nimport java.util.Optional;\n\n@Mixin(RecipeManager.class)\npublic class MixinRecipeManager\n{\n    @Shadow private static Map<ResourceKey<RecipePropertySet>, RecipeManager.IngredientExtractor> RECIPE_PROPERTY_SETS;\n\n    @Inject(method = \"<clinit>\", at = @At(\"TAIL\"))\n    private static void onInit(CallbackInfo ci)\n    {\n        RECIPE_PROPERTY_SETS = ImmutableMap.<ResourceKey<RecipePropertySet>, RecipeManager.IngredientExtractor>builder().putAll(RECIPE_PROPERTY_SETS).put(ModRecipePropertySets.WATER_PURIFYING, recipe -> recipe instanceof WaterPurifierRecipe waterPurifierRecipe ? Optional.of(Ingredient.of(waterPurifierRecipe.input().getItem())) : Optional.empty()).build();\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinServerLevel.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.world.effect.MobEffectInstance;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.api.player.ITANPlayer;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.init.ModConfig;\n\n@Mixin(ServerLevel.class)\npublic class MixinServerLevel\n{\n    @Inject(method=\"addPlayer\", at=@At(value=\"HEAD\"))\n    public void onAddPlayer(ServerPlayer player, CallbackInfo ci)\n    {\n        ITANPlayer tanPlayer = (ITANPlayer)player;\n\n        if (ModConfig.temperature.enableTemperature && ModConfig.temperature.climateClemencyDuration > 0 && !tanPlayer.getClimateClemencyGranted() && !player.isCreative())\n        {\n            tanPlayer.setClimateClemencyGranted(true);\n            player.addEffect(new MobEffectInstance(TANEffects.CLIMATE_CLEMENCY, ModConfig.temperature.climateClemencyDuration, 0, false, false, true));\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/MixinServerPlayer.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin;\n\nimport com.mojang.authlib.GameProfile;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.nbt.CompoundTag;\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.level.Level;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Unique;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Group;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;\nimport toughasnails.api.player.ITANPlayer;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.init.ModConfig;\nimport toughasnails.temperature.TemperatureHandler;\n\nimport static toughasnails.temperature.TemperatureHandler.syncTemperature;\nimport static toughasnails.thirst.ThirstHandler.syncThirst;\n\n@Mixin(ServerPlayer.class)\npublic abstract class MixinServerPlayer extends Player implements ITANPlayer\n{\n    public MixinServerPlayer(Level $$0, GameProfile $$1) {\n        super($$0, $$1);\n    }\n\n    @Inject(method=\"doTick\", at=@At(value=\"TAIL\"))\n    public void onDoTick(CallbackInfo ci)\n    {\n        ServerPlayer player = (ServerPlayer)(Player)this;\n        ITemperature data = TemperatureHelper.getTemperatureData(player);\n        IThirst thirst = ThirstHelper.getThirst(player);\n\n        // Update the temperature if it has changed\n        if (data.getLastLevel() != data.getLevel() || data.getLastHyperthermiaTicks() != data.getHyperthermiaTicks() || !data.getLastNearbyThermoregulators().equals(data.getNearbyThermoregulators()))\n        {\n            syncTemperature(player);\n        }\n\n        // Update thirst if it has changed\n        if (thirst.getLastThirst() != thirst.getThirst() || thirst.getHydration() == 0.0F != thirst.getLastHydrationZero())\n        {\n            syncThirst(player);\n        }\n    }\n\n    @Inject(method=\"restoreFrom\", at=@At(value=\"TAIL\"))\n    public void onRestoreFrom(ServerPlayer player, boolean $$1, CallbackInfo ci)\n    {\n        if (!ModConfig.temperature.climateClemencyRespawning)\n        {\n            this.setClimateClemencyGranted(((ITANPlayer)player).getClimateClemencyGranted());\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/client/MixinGui.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin.client;\n\nimport net.minecraft.client.gui.Gui;\nimport net.minecraft.client.gui.GuiGraphics;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Group;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.Surrogate;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.temperature.TemperatureHooksClient;\n\n@Mixin(Gui.class)\npublic abstract class MixinGui\n{\n    @Inject(method=\"renderHeart\", at=@At(value=\"HEAD\"), cancellable = true)\n    public void onRenderHeart(GuiGraphics gui, Gui.HeartType heartType, int x, int y, boolean isHardcore, boolean isBlinking, boolean isHalf, CallbackInfo ci)\n    {\n        TemperatureHooksClient.heartBlit(gui, heartType, x, y, isHardcore, isBlinking, isHalf);\n        ci.cancel();\n    }\n}"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/client/MixinItemStack.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin.client;\n\nimport net.minecraft.client.renderer.BiomeColors;\nimport net.minecraft.core.component.DataComponentType;\nimport net.minecraft.core.component.DataComponents;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.EquipmentSlot;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.component.DyedItemColor;\nimport net.minecraft.world.level.Level;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Shadow;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.api.item.TANItems;\n\nimport javax.annotation.Nullable;\n\n@Mixin(ItemStack.class)\npublic abstract class MixinItemStack\n{\n    @Shadow public abstract Item getItem();\n\n    @Shadow @org.jetbrains.annotations.Nullable public abstract <T> T set(DataComponentType<T> dataComponentType, @org.jetbrains.annotations.Nullable T object);\n\n    @Inject(method=\"inventoryTick\", at=@At(value=\"TAIL\"))\n    public void onTick(Level level, Entity entity, @Nullable EquipmentSlot slot, CallbackInfo ci)\n    {\n        // As of 1.21.5 the item-based inventory tick isn't called on the client\n        if (!level.isClientSide())\n            return;\n\n        Item item = this.getItem();\n\n        if (item == TANItems.LEAF_BOOTS || item == TANItems.LEAF_LEGGINGS || item == TANItems.LEAF_CHESTPLATE || item == TANItems.LEAF_HELMET)\n            this.set(DataComponents.DYED_COLOR, new DyedItemColor(BiomeColors.getAverageFoliageColor(entity.level(), entity.blockPosition())));\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/client/MixinLocalPlayer.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin.client;\n\nimport net.minecraft.client.player.LocalPlayer;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Redirect;\nimport toughasnails.thirst.ThirstHooksClient;\n\n@Mixin(LocalPlayer.class)\npublic class MixinLocalPlayer\n{\n    @Redirect(method=\"aiStep\", at=@At(value=\"INVOKE\", target=\"Lnet/minecraft/client/player/LocalPlayer;setSprinting(Z)V\"))\n    public void aiStep_setSprinting(LocalPlayer player, boolean sprinting)\n    {\n        ThirstHooksClient.onAiStepSetSprinting(player, sprinting);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/mixin/client/MixinRangeSelectItemModelProperties.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.mixin.client;\n\nimport com.mojang.serialization.MapCodec;\nimport net.minecraft.client.renderer.item.properties.numeric.RangeSelectItemModelProperties;\nimport net.minecraft.client.renderer.item.properties.numeric.RangeSelectItemModelProperty;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.util.ExtraCodecs;\nimport org.spongepowered.asm.mixin.Final;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Shadow;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.client.item.TemperatureProperty;\n\n@Mixin(RangeSelectItemModelProperties.class)\npublic class MixinRangeSelectItemModelProperties\n{\n    @Shadow\n    @Final\n    private static ExtraCodecs.LateBoundIdMapper<Identifier, MapCodec<? extends RangeSelectItemModelProperty>> ID_MAPPER;\n\n    @Inject(method = \"bootstrap\", at=@At(\"TAIL\"))\n    private static void onBootstrap(CallbackInfo ci)\n    {\n        ID_MAPPER.put(Identifier.withDefaultNamespace(\"temperature\"), TemperatureProperty.CODEC);\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/network/DrinkInWorldPacket.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.network;\n\nimport glitchcore.network.CustomPacket;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Holder;\nimport net.minecraft.network.FriendlyByteBuf;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.tags.FluidTags;\nimport net.minecraft.world.effect.MobEffectInstance;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModTags;\n\npublic class DrinkInWorldPacket implements CustomPacket<DrinkInWorldPacket>\n{\n    private BlockPos pos;\n\n    public DrinkInWorldPacket(BlockPos pos)\n    {\n        this.pos = pos;\n    }\n\n    public DrinkInWorldPacket() {}\n\n    @Override\n    public void encode(FriendlyByteBuf buf)\n    {\n        buf.writeBlockPos(this.pos);\n    }\n\n    @Override\n    public DrinkInWorldPacket decode(FriendlyByteBuf buf)\n    {\n        return new DrinkInWorldPacket(buf.readBlockPos());\n    }\n\n    @Override\n    public void handle(DrinkInWorldPacket packet, Context context)\n    {\n        context.getPlayer().ifPresent(player -> {\n            Level level = player.level();\n            IThirst thirst = ThirstHelper.getThirst(player);\n\n            // Whilst we already checked on the client, check again to be sure\n            if (level.mayInteract(player, packet.pos) && level.getFluidState(packet.pos).is(FluidTags.WATER))\n            {\n                thirst.drink(ModConfig.thirst.handDrinkingThirst, (float)ModConfig.thirst.handDrinkingHydration);\n\n                Holder<Biome> biome = level.getBiome(packet.pos);\n\n                if (level.random.nextFloat() < ModTags.Biomes.getBiomeWaterType(biome).getPoisonChance())\n                {\n                    player.addEffect(new MobEffectInstance(TANEffects.THIRST, 600));\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/network/UpdateTemperaturePacket.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.network;\n\nimport glitchcore.network.CustomPacket;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.network.FriendlyByteBuf;\nimport net.minecraft.world.entity.player.Player;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.temperature.TemperatureLevel;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\npublic class UpdateTemperaturePacket implements CustomPacket<UpdateTemperaturePacket>\n{\n    private TemperatureLevel temperatureLevel;\n    private int hyperthermiaTicks;\n    private Set<BlockPos> nearbyThermoregulators;\n\n    public UpdateTemperaturePacket(TemperatureLevel temperatureLevel, int hyperthermiaTicks, Set<BlockPos> nearbyThermoregulators)\n    {\n        this.temperatureLevel = temperatureLevel;\n        this.hyperthermiaTicks = hyperthermiaTicks;\n        this.nearbyThermoregulators = nearbyThermoregulators;\n    }\n\n    public UpdateTemperaturePacket() {}\n\n    @Override\n    public void encode(FriendlyByteBuf buf)\n    {\n        buf.writeEnum(this.temperatureLevel);\n        buf.writeInt(this.hyperthermiaTicks);\n        buf.writeCollection(this.nearbyThermoregulators, (o, pos) -> o.writeBlockPos(pos));\n    }\n\n    @Override\n    public UpdateTemperaturePacket decode(FriendlyByteBuf buf)\n    {\n        return new UpdateTemperaturePacket(buf.readEnum(TemperatureLevel.class), buf.readInt(), buf.readCollection(HashSet::new, (o) -> o.readBlockPos()));\n    }\n\n    @Override\n    public void handle(UpdateTemperaturePacket packet, Context context)\n    {\n        if (context.isServerSide())\n            return;\n\n        context.getPlayer().ifPresent(player -> {\n            ITemperature temperature = TemperatureHelper.getTemperatureData(player);\n\n            temperature.setLevel(packet.temperatureLevel);\n            temperature.setHyperthermiaTicks(packet.hyperthermiaTicks);\n            temperature.setNearbyThermoregulators(packet.nearbyThermoregulators);\n        });\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/network/UpdateThirstPacket.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.network;\n\nimport glitchcore.network.CustomPacket;\nimport net.minecraft.network.FriendlyByteBuf;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\n\npublic class UpdateThirstPacket implements CustomPacket<UpdateThirstPacket>\n{\n    private int thirstLevel;\n    private float hydrationLevel;\n\n    public UpdateThirstPacket(int thirstLevel, float hydrationLevel)\n    {\n        this.thirstLevel = thirstLevel;\n        this.hydrationLevel = hydrationLevel;\n    }\n\n    public UpdateThirstPacket() {}\n\n    @Override\n    public void encode(FriendlyByteBuf buf)\n    {\n        buf.writeInt(this.thirstLevel);\n        buf.writeFloat(this.hydrationLevel);\n    }\n\n    @Override\n    public UpdateThirstPacket decode(FriendlyByteBuf buf)\n    {\n        return new UpdateThirstPacket(buf.readInt(), buf.readFloat());\n    }\n\n    @Override\n    public void handle(UpdateThirstPacket packet, Context context)\n    {\n        if (context.isServerSide())\n            return;\n\n        context.getPlayer().ifPresent(player -> {\n            IThirst thirst = ThirstHelper.getThirst(player);\n\n            thirst.setThirst(packet.thirstLevel);\n            thirst.setHydration(packet.hydrationLevel);\n        });\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/potion/ThirstEffect.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.potion;\n\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.world.entity.LivingEntity;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.effect.MobEffect;\nimport net.minecraft.world.effect.MobEffectCategory;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\n\npublic class ThirstEffect extends MobEffect\n{\n    public ThirstEffect(MobEffectCategory type, int color)\n    {\n        super(type, color);\n    }\n\n    @Override\n    public boolean applyEffectTick(ServerLevel level, LivingEntity entity, int amplifier)\n    {\n        if (entity instanceof Player)\n        {\n            Player player = (Player)entity;\n            IThirst thirst = ThirstHelper.getThirst(player);\n            thirst.addExhaustion(0.025F * (float)(amplifier + 1));\n        }\n\n        return true;\n    }\n\n    @Override\n    public boolean shouldApplyEffectTickThisTick(int duration, int amplifier)\n    {\n        return true;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/AreaFill.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport com.google.common.collect.Sets;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.levelgen.Heightmap;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModTags;\n\nimport java.util.LinkedList;\nimport java.util.Queue;\nimport java.util.Set;\n\npublic class AreaFill\n{\n    public static void fill(Level level, BlockPos pos, PositionChecker checker)\n    {\n        fill(level, pos, checker, ModConfig.temperature.nearHeatCoolProximity);\n    }\n\n    public static void fill(Level level, BlockPos pos, PositionChecker checker, final int maxDepth)\n    {\n        Set<FillPos> checked = Sets.newHashSet();\n        Queue<FillPos> queue = new LinkedList();\n\n        queue.add(new FillPos(pos, 1, Direction.DOWN));\n        while (!queue.isEmpty())\n        {\n            FillPos posToCheck = queue.poll();\n\n            // Skip already checked positions\n            if (checked.contains(posToCheck))\n                continue;\n\n            // Positive x is east, negative x is west\n            if (checkPassable(checker, level, posToCheck))\n            {\n                FillPos westPos = posToCheck;\n                while (westPos.depth() < maxDepth && checkPassable(checker, level, westPos))\n                {\n                    checked.add(westPos);\n                    expand(queue, checked, checker, level, westPos);\n                    westPos = westPos.west();\n                }\n\n                checked.add(westPos);\n                if (!checkPassable(checker, level, westPos)) checkSolid(checked, checker, level, westPos);\n\n                // Don't spread further or else we'll exceed the max depth\n                if (posToCheck.depth() >= maxDepth)\n                    continue;\n\n                FillPos eastPos = posToCheck.east();\n                while (eastPos.depth() < maxDepth && checkPassable(checker, level, eastPos))\n                {\n                    checked.add(eastPos);\n                    expand(queue, checked, checker, level, eastPos);\n                    eastPos = eastPos.east();\n                }\n\n                checked.add(eastPos);\n                if (!checkPassable(checker, level, eastPos)) checkSolid(checked, checker, level, eastPos);\n            }\n            else\n            {\n                checkSolid(checked, checker, level, posToCheck);\n            }\n        }\n    }\n\n    private static void expand(Queue<FillPos> queue, Set<FillPos> checked, PositionChecker checker, Level level, FillPos pos)\n    {\n        FillPos north = pos.north(); // Negative Z\n        FillPos south = pos.south(); // Positive Z\n        FillPos down = pos.below(); // Negative Y\n        FillPos up = pos.above(); // Positive Y\n\n        if (checkPassable(checker, level, north)) queue.add(north);\n        else checkSolid(checked, checker, level, north);\n\n        if (checkPassable(checker, level, south)) queue.add(south);\n        else checkSolid(checked, checker, level, south);\n\n        if (checkPassable(checker, level, down)) queue.add(down);\n        else checkSolid(checked, checker, level, down);\n\n        if (checkPassable(checker, level, up)) queue.add(up);\n        else checkSolid(checked, checker, level, up);\n    }\n\n    private static void checkSolid(Set<FillPos> checked, PositionChecker checker, Level level, FillPos pos)\n    {\n        checked.add(pos);\n        checker.onSolid(level, pos);\n    }\n    \n    private static boolean checkPassable(PositionChecker checker, Level level, FillPos pos)\n    {\n        boolean passable = checker.isPassable(level, pos);\n        if (passable) checker.onPassable(level, pos);\n        return passable;\n    }\n\n    public interface PositionChecker {\n        void onSolid(Level level, FillPos pos);\n\n        default void onPassable(Level level, FillPos pos) {\n        }\n\n        default boolean isPassable(Level level, FillPos pos)\n        {\n            BlockState state = level.getBlockState(pos.pos());\n            return state.isAir() || state.is(ModTags.Blocks.PASSABLE_BLOCKS) || (!isFlowBlocking(level, pos, state) && !TemperatureHelper.isHeatingBlock(state) && !TemperatureHelper.isCoolingBlock(state));\n        }\n\n        default boolean isConfined(Level level, BlockPos pos)\n        {\n            return pos.getY() < level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, pos).below().getY();\n        }\n\n        default boolean isFlowBlocking(Level level, FillPos pos, BlockState state)\n        {\n            return state.isFaceSturdy(level, pos.pos(), pos.source()) || state.isFaceSturdy(level, pos.pos(), pos.source().getOpposite());\n        }\n    }\n\n    public record FillPos(BlockPos pos, int depth, Direction source)\n    {\n        public FillPos north()\n        {\n            return new FillPos(pos().north(), depth() + 1, Direction.SOUTH);\n        }\n\n        public FillPos south()\n        {\n            return new FillPos(pos().south(), depth() + 1, Direction.NORTH);\n        }\n\n        public FillPos east()\n        {\n            return new FillPos(pos().east(), depth() + 1, Direction.WEST);\n        }\n\n        public FillPos west()\n        {\n            return new FillPos(pos().west(), depth() + 1, Direction.EAST);\n        }\n\n        public FillPos above()\n        {\n            return new FillPos(pos().above(), depth() + 1, Direction.DOWN);\n        }\n\n        public FillPos below()\n        {\n            return new FillPos(pos().below(), depth() + 1, Direction.UP);\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/BuiltInTemperatureModifier.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport net.minecraft.util.Tuple;\nimport net.minecraft.world.entity.player.Player;\nimport toughasnails.api.temperature.IPlayerTemperatureModifier;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModConfig;\n\nimport java.util.List;\n\nimport static toughasnails.temperature.TemperatureHelperImpl.playerModifiers;\n\npublic enum BuiltInTemperatureModifier\n{\n    PLAYER_MODIFIERS(((player, currentTarget, currentChangeDelay) -> {\n        TemperatureLevel newTarget = currentTarget;\n        int newChangeDelay = currentChangeDelay;\n        for (IPlayerTemperatureModifier modifier : playerModifiers)\n        {\n            newTarget = modifier.modify(player, newTarget);\n        }\n\n        if (newTarget != currentTarget) newChangeDelay = Math.min(currentChangeDelay, ModConfig.temperature.playerTemperatureChangeDelay);\n        return new Tuple<>(newTarget, newChangeDelay);\n    })),\n    ITEM_MODIFIER((player, currentTarget, currentChangeDelay) -> {\n        int newChangeDelay = currentChangeDelay;\n        TemperatureLevel newTarget = TemperatureHelperImpl.handheldModifier(player, currentTarget);\n        if (newTarget != currentTarget) newChangeDelay = Math.min(currentChangeDelay, ModConfig.temperature.handheldTemperatureChangeDelay);\n        return new Tuple<>(newTarget, newChangeDelay);\n    }),\n    ARMOR_MODIFIER((player, currentTarget, currentChangeDelay) -> {\n        int newChangeDelay = currentChangeDelay;\n        TemperatureLevel newTarget = TemperatureHelperImpl.armorModifier(player, currentTarget);\n        if (newTarget != currentTarget) newChangeDelay = Math.min(currentChangeDelay, ModConfig.temperature.armorTemperatureChangeDelay);\n        return new Tuple<>(newTarget, newChangeDelay);\n    }),\n    MOUNT_MODIFIER((player, currentTarget, currentChangeDelay) -> {\n        int newChangeDelay = currentChangeDelay;\n        TemperatureLevel newTarget = TemperatureHelperImpl.mountModifier(player, currentTarget);\n        if (newTarget != currentTarget) newChangeDelay = Math.min(currentChangeDelay, ModConfig.temperature.mountTemperatureChangeDelay);\n        return new Tuple<>(newTarget, newChangeDelay);\n    }),\n    INTERNAL_MODIFIER((player, currentTarget, currentChangeDelay) -> {\n        int newChangeDelay = currentChangeDelay;\n        TemperatureLevel newTarget = TemperatureHelperImpl.internalModifier(player, currentTarget);\n        if (newTarget != currentTarget) newChangeDelay = Math.min(currentChangeDelay, ModConfig.temperature.internalTemperatureChangeDelay);\n        return new Tuple<>(newTarget, newChangeDelay);\n    });\n\n    private final Modifier modifier;\n\n    BuiltInTemperatureModifier(Modifier modifier)\n    {\n        this.modifier = modifier;\n    }\n\n    public Tuple<TemperatureLevel, Integer> apply(Player player, TemperatureLevel currentTarget, int currentChangeDelay)\n    {\n        return this.modifier.apply(player, currentTarget, currentChangeDelay);\n    }\n\n    private interface Modifier\n    {\n        public Tuple<TemperatureLevel, Integer> apply(Player player, TemperatureLevel currentTarget, int currentChangeDelay);\n    }\n\n    private static List<BuiltInTemperatureModifier> temperatureModifierOrderCache;\n    public static List<BuiltInTemperatureModifier> getTemperatureModifierOrder()\n    {\n        if (temperatureModifierOrderCache == null)\n        {\n            temperatureModifierOrderCache = ModConfig.temperature.temperatureModifierOrder.stream().map(s -> BuiltInTemperatureModifier.valueOf(s.toUpperCase())).toList();\n        }\n        return temperatureModifierOrderCache;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/TemperatureData.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.nbt.CompoundTag;\nimport net.minecraft.world.level.storage.ValueInput;\nimport net.minecraft.world.level.storage.ValueOutput;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.init.ModConfig;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\npublic class TemperatureData implements ITemperature\n{\n    public static final TemperatureLevel DEFAULT_LEVEL = TemperatureLevel.NEUTRAL;\n\n    private TemperatureLevel level = DEFAULT_LEVEL;\n    private TemperatureLevel targetLevel = DEFAULT_LEVEL;\n    private int positionalChangeDelayTicks;\n    private int ticksHyperthermic;\n    private int ticksDry;\n    private int extremityDelayTicks;\n\n    private Set<BlockPos> nearbyThermoregulators = new HashSet<>();\n    private TemperatureLevel lastTemperature = DEFAULT_LEVEL;\n    private int lastHyperthermiaTicks;\n    private Set<BlockPos> lastNearbyThermoregulators = new HashSet<>();\n\n    public void addAdditionalSaveData(ValueOutput output)\n    {\n        if (ModConfig.temperature.enableTemperature)\n        {\n            output.putInt(\"temperatureLevel\", this.getLevel().ordinal());\n            output.putInt(\"targetTemperatureLevel\", this.getTargetLevel().ordinal());\n            output.putInt(\"changeDelayTicks\", this.getChangeDelayTicks());\n            output.putInt(\"hyperthermiaTicks\", this.getHyperthermiaTicks());\n            output.putInt(\"extremityDelayTicks\", this.getExtremityDelayTicks());\n            output.putInt(\"dryTicks\", this.getDryTicks());\n        }\n        else\n        {\n            // Save default values\n            output.putInt(\"temperatureLevel\", TemperatureData.DEFAULT_LEVEL.ordinal());\n            output.putInt(\"targetTemperatureLevel\", TemperatureData.DEFAULT_LEVEL.ordinal());\n            output.putInt(\"changeDelayTicks\", 0);\n            output.putInt(\"hyperthermiaTicks\", 0);\n            output.putInt(\"extremityDelayTicks\", 0);\n            output.putInt(\"dryTicks\", 0);\n        }\n    }\n\n    public void readAdditionalSaveData(ValueInput input)\n    {\n        if (ModConfig.temperature.enableTemperature)\n        {\n            this.setLevel(TemperatureLevel.values()[input.getInt(\"temperatureLevel\").orElse(TemperatureData.DEFAULT_LEVEL.ordinal())]);\n            this.setTargetLevel(TemperatureLevel.values()[input.getInt(\"targetTemperatureLevel\").orElse(TemperatureData.DEFAULT_LEVEL.ordinal())]);\n            this.setChangeDelayTicks(input.getInt(\"changeDelayTicks\").orElse(0));\n            this.setHyperthermiaTicks(input.getInt(\"hyperthermiaTicks\").orElse(0));\n            this.setExtremityDelayTicks(input.getInt(\"extremityDelayTicks\").orElse(0));\n        }\n        else\n        {\n            // Use default values if temperature is disabled\n            this.setLevel(TemperatureData.DEFAULT_LEVEL);\n            this.setTargetLevel(TemperatureData.DEFAULT_LEVEL);\n            this.setChangeDelayTicks(0);\n            this.setHyperthermiaTicks(0);\n            this.setExtremityDelayTicks(0);\n            this.setDryTicks(0);\n        }\n    }\n\n    @Override\n    public TemperatureLevel getLevel()\n    {\n        return this.level;\n    }\n\n    @Override\n    public int getHyperthermiaTicks()\n    {\n        return this.ticksHyperthermic;\n    }\n\n    @Override\n    public int getExtremityDelayTicks()\n    {\n        return this.extremityDelayTicks;\n    }\n\n    @Override\n    public int getDryTicks() {\n        return ticksDry;\n    }\n\n    @Override\n    public TemperatureLevel getLastLevel()\n    {\n        return this.lastTemperature;\n    }\n\n    @Override\n    public TemperatureLevel getTargetLevel()\n    {\n        return this.targetLevel;\n    }\n\n    @Override\n    public int getChangeDelayTicks()\n    {\n        return this.positionalChangeDelayTicks;\n    }\n\n    @Override\n    public int getLastHyperthermiaTicks()\n    {\n        return this.lastHyperthermiaTicks;\n    }\n\n    @Override\n    public Set<BlockPos> getLastNearbyThermoregulators()\n    {\n        return this.lastNearbyThermoregulators;\n    }\n\n    @Override\n    public Set<BlockPos> getNearbyThermoregulators()\n    {\n        return this.nearbyThermoregulators;\n    }\n\n    @Override\n    public void setLevel(TemperatureLevel level)\n    {\n        this.level = level;\n    }\n\n    @Override\n    public void setHyperthermiaTicks(int ticks)\n    {\n        this.ticksHyperthermic = ticks;\n    }\n\n    @Override\n    public void setExtremityDelayTicks(int ticks)\n    {\n        this.extremityDelayTicks = ticks;\n    }\n\n    @Override\n    public void setDryTicks(int ticks) {\n        ticksDry = ticks;\n    }\n\n    @Override\n    public void setLastLevel(TemperatureLevel level)\n    {\n        this.lastTemperature = level;\n    }\n\n    @Override\n    public void setTargetLevel(TemperatureLevel level)\n    {\n        this.targetLevel = level;\n    }\n\n    @Override\n    public void setChangeDelayTicks(int ticks)\n    {\n        this.positionalChangeDelayTicks = ticks;\n    }\n\n    @Override\n    public void setLastHyperthermiaTicks(int ticks)\n    {\n        this.lastHyperthermiaTicks = ticks;\n    }\n\n    @Override\n    public void setLastNearbyThermoregulators(Set<BlockPos> values)\n    {\n        this.lastNearbyThermoregulators = values;\n    }\n\n    @Override\n    public void setNearbyThermoregulators(Set<BlockPos> values)\n    {\n        this.nearbyThermoregulators = values;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/TemperatureHandler.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport glitchcore.event.entity.LivingEntityUseItemEvent;\nimport glitchcore.event.player.PlayerEvent;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.util.Mth;\nimport net.minecraft.util.Tuple;\nimport net.minecraft.world.effect.MobEffectInstance;\nimport net.minecraft.world.effect.MobEffects;\nimport net.minecraft.world.entity.ai.attributes.AttributeInstance;\nimport net.minecraft.world.entity.ai.attributes.AttributeModifier;\nimport net.minecraft.world.entity.ai.attributes.Attributes;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.level.Level;\nimport toughasnails.api.damagesource.TANDamageTypes;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModPackets;\nimport toughasnails.init.ModTags;\nimport toughasnails.network.UpdateTemperaturePacket;\n\nimport java.util.HashSet;\n\npublic class TemperatureHandler\n{\n    protected static final Identifier SPEED_MODIFIER_ID = Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, \"speed_modifier\");\n\n    public static void onPlayerTick(Player player)\n    {\n        if (!ModConfig.temperature.enableTemperature || player.level().isClientSide())\n            return;\n\n        Level level = player.level();\n        ITemperature data = TemperatureHelper.getTemperatureData(player);\n\n        // Remove thermoregulators more than 32 blocks away\n        data.getNearbyThermoregulators().removeIf(pos -> level.getBlockEntity(pos) == null || player.distanceToSqr((double) pos.getX() + 0.5, (double) pos.getY() + 0.5, (double) pos.getZ() + 0.5) > 32 * 32);\n\n        // Decrement the positional change delay ticks\n        data.setChangeDelayTicks(Math.max(0, data.getChangeDelayTicks() - 1));\n        // Increment dry ticks\n        data.setDryTicks(data.getDryTicks() + 1);\n\n        // Use the positional temperature as the new target level if the player doesn't have climate clemency active\n        if (!player.hasEffect(TANEffects.CLIMATE_CLEMENCY))\n        {\n            int changeDelay = ModConfig.temperature.temperatureChangeDelay;\n            TemperatureLevel currentTargetLevel = data.getTargetLevel();\n            TemperatureLevel newTargetLevel = TemperatureHelper.getTemperatureAtPos(player.level(), player.blockPosition());\n\n            // Apply modifiers in the configured order\n            for (BuiltInTemperatureModifier modifier : BuiltInTemperatureModifier.getTemperatureModifierOrder())\n            {\n                Tuple<TemperatureLevel, Integer> output = modifier.apply(player, newTargetLevel, changeDelay);\n                newTargetLevel = output.getA();\n                changeDelay = output.getB();\n            }\n\n            // If necessary, change the target level and reset the timer\n            if (newTargetLevel != currentTargetLevel)\n            {\n                data.setTargetLevel(newTargetLevel);\n\n                // Rebound quickly from extremes\n                if ((data.getLevel() == TemperatureLevel.ICY || data.getLevel() == TemperatureLevel.HOT) && newTargetLevel != TemperatureLevel.ICY && newTargetLevel != TemperatureLevel.HOT)\n                {\n                    changeDelay = Math.min(changeDelay, ModConfig.temperature.extremityReboundTemperatureChangeDelay);\n                }\n\n                data.setChangeDelayTicks(changeDelay);\n            }\n\n            // If the delay timer is complete, and the target temperature isn't the same as the player's current temperature,\n            // move the player's positional temperature level to move towards the target.\n            if (data.getChangeDelayTicks() == 0 && currentTargetLevel != data.getLevel())\n            {\n                data.setLevel(data.getLevel().increment(Mth.sign(data.getTargetLevel().ordinal() - data.getLevel().ordinal())));\n                data.setChangeDelayTicks(changeDelay);\n            }\n        }\n        else\n        {\n            // Always set the temperature to neutral when climate clemency is active\n            data.setLevel(TemperatureLevel.NEUTRAL);\n        }\n\n        // Decrement the extremity delay ticks\n        data.setExtremityDelayTicks(Math.max(0, data.getExtremityDelayTicks() - 1));\n\n        // If we are entering an extreme temperature, add to the extremity delay\n        if (data.getLastLevel() != data.getLevel() && (data.getLevel() == TemperatureLevel.ICY || data.getLevel() == TemperatureLevel.HOT))\n        {\n            data.setExtremityDelayTicks(ModConfig.temperature.extremityDamageDelay);\n        }\n\n        int hyperthermicTicks = data.getHyperthermiaTicks();\n        int ticksToHyperthermia = TemperatureHelper.getTicksRequiredForHyperthermia();\n\n        // Don't perform extremity effects in creative or spectator modes\n        if (!player.isCreative() && !player.isSpectator())\n        {\n            // Increase hyperthermia ticks if hot\n            if (!player.hasEffect(MobEffects.FIRE_RESISTANCE) && data.getLevel() == TemperatureLevel.HOT && data.getExtremityDelayTicks() == 0)\n            {\n                data.setHyperthermiaTicks(Math.min(ticksToHyperthermia, hyperthermicTicks + 1));\n            }\n            else data.setHyperthermiaTicks(Math.max(0, hyperthermicTicks - 2));\n        }\n        else\n        {\n            // Decrease hyperthermia, if present\n            if (data.getHyperthermiaTicks() > 0)\n                data.setHyperthermiaTicks(Math.max(0, hyperthermicTicks - 2));\n        }\n\n        removeHeatExhaustion(player);\n        tryAddHeatExhaustion(player);\n\n        // Hurt the player if hyperthermic\n        if (player.tickCount % 40 == 0 && TemperatureHelper.isFullyHyperthermic(player))\n            player.hurt(player.damageSources().source(TANDamageTypes.HYPERTHERMIA), 1);\n    }\n\n    public static void onChangeDimension(PlayerEvent.ChangeDimension event)\n    {\n        ITemperature temperature = TemperatureHelper.getTemperatureData(event.getPlayer());\n        temperature.setLastLevel(TemperatureData.DEFAULT_LEVEL);\n        temperature.setLastHyperthermiaTicks(0);\n        temperature.setLastNearbyThermoregulators(new HashSet<>());\n    }\n\n    public static void onItemUseFinish(LivingEntityUseItemEvent.Finish event)\n    {\n        if (!ModConfig.temperature.enableTemperature || !(event.getEntity() instanceof Player) || event.getEntity().level().isClientSide())\n            return;\n\n        Player player = (Player) event.getEntity();\n        ItemStack item = event.getItem();\n\n        if (item.is(ModTags.Items.COOLING_CONSUMED_ITEMS))\n            player.addEffect(new MobEffectInstance(TANEffects.INTERNAL_CHILL, ModConfig.temperature.consumableEffectDuration, 0, false, false, true));\n\n        if (item.is(ModTags.Items.HEATING_CONSUMED_ITEMS))\n            player.addEffect(new MobEffectInstance(TANEffects.INTERNAL_WARMTH, ModConfig.temperature.consumableEffectDuration, 0, false, false, true));\n    }\n\n    public static void syncTemperature(ServerPlayer player)\n    {\n        ITemperature temperature = TemperatureHelper.getTemperatureData(player);\n        ModPackets.HANDLER.sendToPlayer(new UpdateTemperaturePacket(temperature.getLevel(), temperature.getHyperthermiaTicks(), temperature.getNearbyThermoregulators()), player);\n        temperature.setLastLevel(temperature.getLevel());\n        temperature.setLastHyperthermiaTicks(temperature.getHyperthermiaTicks());\n        temperature.setNearbyThermoregulators(temperature.getNearbyThermoregulators());\n    }\n\n    private static void removeHeatExhaustion(Player player)\n    {\n        AttributeInstance attribute = player.getAttribute(Attributes.MOVEMENT_SPEED);\n\n        if (attribute != null)\n        {\n            if (attribute.getModifier(SPEED_MODIFIER_ID) != null)\n            {\n                attribute.removeModifier(SPEED_MODIFIER_ID);\n            }\n        }\n    }\n\n    protected static void tryAddHeatExhaustion(Player player)\n    {\n        if (!player.level().getBlockState(player.getOnPos()).isAir())\n        {\n            int ticks = TemperatureHelper.getTicksHyperthermic(player);\n            if (ticks > 0)\n            {\n                AttributeInstance attributeinstance = player.getAttribute(Attributes.MOVEMENT_SPEED);\n                if (attributeinstance == null)\n                    return;\n\n                float f = 0.015F * TemperatureHelper.getPercentHyperthermic(player);\n                attributeinstance.addTransientModifier(new AttributeModifier(SPEED_MODIFIER_ID, f, AttributeModifier.Operation.ADD_VALUE));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/TemperatureHelperImpl.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Sets;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Holder;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.tags.FluidTags;\nimport net.minecraft.util.Mth;\nimport net.minecraft.world.attribute.EnvironmentAttribute;\nimport net.minecraft.world.attribute.EnvironmentAttributes;\nimport net.minecraft.world.entity.EquipmentSlot;\nimport net.minecraft.world.entity.EquipmentSlotGroup;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.entity.vehicle.boat.Boat;\nimport net.minecraft.world.item.enchantment.EnchantmentHelper;\nimport net.minecraft.world.item.equipment.trim.TrimMaterials;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraft.world.level.block.state.properties.BlockStateProperties;\nimport net.minecraft.world.level.block.state.properties.BooleanProperty;\nimport net.minecraft.world.level.levelgen.Heightmap;\nimport toughasnails.api.enchantment.TANEnchantments;\nimport toughasnails.api.player.ITANPlayer;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.temperature.*;\nimport toughasnails.api.temperature.IProximityBlockModifier.Type;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModTags;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicInteger;\n\npublic class TemperatureHelperImpl implements TemperatureHelper.Impl.ITemperatureHelper\n{\n    protected static List<IPositionalTemperatureModifier> positionalModifiers = Lists.newArrayList(TemperatureHelperImpl::altitudeModifier, TemperatureHelperImpl::rainModifier);\n    protected static List<IProximityBlockModifier> proximityModifiers = new ArrayList<>();\n    protected static List<IPlayerTemperatureModifier> playerModifiers = Lists.newArrayList(TemperatureHelperImpl::thermoregulatorModifier, TemperatureHelperImpl::immersionModifier);\n\n    @Override\n    public TemperatureLevel getTemperatureAtPos(Level level, BlockPos pos)\n    {\n        TemperatureLevel temperature = getBiomeTemperatureLevel(level, pos);\n        temperature = nightModifier(level, pos, temperature);\n\n        for (IPositionalTemperatureModifier modifier : positionalModifiers)\n        {\n            temperature = modifier.modify(level, pos, temperature);\n        }\n\n        return proximityModifier(level, pos, temperature);\n    }\n\n    public static TemperatureLevel getTemperatureAtPosWithoutProximity(Level level, BlockPos pos)\n    {\n        TemperatureLevel temperature = getBiomeTemperatureLevel(level, pos);\n        temperature = nightModifier(level, pos, temperature);\n\n        for (IPositionalTemperatureModifier modifier : positionalModifiers)\n        {\n            temperature = modifier.modify(level, pos, temperature);\n        }\n\n        return temperature;\n    }\n\n    @Override\n    public ITemperature getPlayerTemperature(Player player)\n    {\n        return ((ITANPlayer)player).getTemperatureData();\n    }\n\n    @Override\n    public boolean isTemperatureEnabled()\n    {\n        return ModConfig.temperature.enableTemperature;\n    }\n\n    @Override\n    public void setTicksHyperthermic(Player player, int ticks)\n    {\n        this.getPlayerTemperature(player).setHyperthermiaTicks(ticks);\n    }\n\n    @Override\n    public float getPercentHyperthermic(Player player)\n    {\n        int i = this.getTicksRequiredForHyperthermia();\n        return (float)Math.min(getTicksHyperthermic(player), i) / (float)i;\n    }\n\n    @Override\n    public boolean isFullyHyperthermic(Player player)\n    {\n        return this.getTicksHyperthermic(player) >= this.getTicksRequiredForHyperthermia();\n    }\n\n    @Override\n    public int getTicksRequiredForHyperthermia()\n    {\n        return 140;\n    }\n\n    @Override\n    public int getTicksHyperthermic(Player player)\n    {\n        return this.getPlayerTemperature(player).getHyperthermiaTicks();\n    }\n\n    @Override\n    public boolean isHeating(BlockState state)\n    {\n        return state.is(ModTags.Blocks.HEATING_BLOCKS) && ((state.hasProperty(BlockStateProperties.LIT) ? state.getValue(BlockStateProperties.LIT) : (state.hasProperty(BlockStateProperties.POWERED) ? state.getValue(BlockStateProperties.POWERED) : (state.hasProperty(BlockStateProperties.ENABLED) ? state.getValue(BlockStateProperties.ENABLED) : (state.hasProperty(BooleanProperty.create(\"active\")) ? state.getValue(BooleanProperty.create(\"active\")) : (state.hasProperty(BooleanProperty.create(\"on\")) ? state.getValue(BooleanProperty.create(\"on\")) : true))))));\n    }\n\n    @Override\n    public boolean isCooling(BlockState state)\n    {\n        return state.is(ModTags.Blocks.COOLING_BLOCKS) && ((state.hasProperty(BlockStateProperties.LIT) ? state.getValue(BlockStateProperties.LIT) : (state.hasProperty(BlockStateProperties.POWERED) ? state.getValue(BlockStateProperties.POWERED) : (state.hasProperty(BlockStateProperties.ENABLED) ? state.getValue(BlockStateProperties.ENABLED) : (state.hasProperty(BooleanProperty.create(\"active\")) ? state.getValue(BooleanProperty.create(\"active\")) : (state.hasProperty(BooleanProperty.create(\"on\")) ? state.getValue(BooleanProperty.create(\"on\")) : true))))));\n    }\n\n    @Override\n    public void registerPlayerTemperatureModifier(IPlayerTemperatureModifier modifier)\n    {\n        playerModifiers.add(modifier);\n    }\n\n    @Override\n    public void registerPositionalTemperatureModifier(IPositionalTemperatureModifier modifier)\n    {\n        positionalModifiers.add(modifier);\n    }\n\n    @Override\n    public void registerProximityBlockModifier(IProximityBlockModifier modifier)\n    {\n        proximityModifiers.add(modifier);\n    }\n\n    private static TemperatureLevel getBiomeTemperatureLevel(Level level, BlockPos pos)\n    {\n        Holder<Biome> biome = level.getBiome(pos);\n        float biomeTemperature = biome.value().getBaseTemperature();\n\n        if ((pos.getY() > ModConfig.temperature.environmentalModifierAltitude || pos.getY() >= level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, pos).below().getY()))\n        {\n            if (biome.is(ModTags.Biomes.ICY_BIOMES)) return TemperatureLevel.ICY;\n            else if (biome.is(ModTags.Biomes.COLD_BIOMES)) return TemperatureLevel.COLD;\n            else if (biome.is(ModTags.Biomes.NEUTRAL_BIOMES)) return TemperatureLevel.NEUTRAL;\n            else if (biome.is(ModTags.Biomes.WARM_BIOMES)) return TemperatureLevel.WARM;\n            else if (biome.is(ModTags.Biomes.HOT_BIOMES)) return TemperatureLevel.HOT;\n            else if (biomeTemperature < 0.15F) return TemperatureLevel.ICY;\n            else if (biomeTemperature >= 0.15F && biomeTemperature < 0.45F) return TemperatureLevel.COLD;\n            else if (biomeTemperature >= 0.45F && biomeTemperature < 0.85F) return TemperatureLevel.NEUTRAL;\n            else if (biomeTemperature >= 0.85F && biomeTemperature < 1.0F) return TemperatureLevel.WARM;\n            else if (biomeTemperature >= 1.0F) return TemperatureLevel.HOT;\n        }\n\n        return TemperatureLevel.NEUTRAL;\n    }\n\n    private static TemperatureLevel altitudeModifier(Level level, BlockPos pos, TemperatureLevel current)\n    {\n        if (pos.getY() > ModConfig.temperature.temperatureDropAltitude) current = current.decrement(1);\n        else if (pos.getY() < ModConfig.temperature.temperatureRiseAltitude) current = current.increment(1);\n        return current;\n    }\n\n    private static TemperatureLevel rainModifier(Level level, BlockPos pos, TemperatureLevel current)\n    {\n        Holder<Biome> biome = level.getBiome(pos);\n\n        if (isExposedToRain(level, pos))\n        {\n            if (coldEnoughToSnow(level, biome, pos))\n                current = current.increment(ModConfig.temperature.snowTemperatureChange);\n            else\n                current = current.increment(ModConfig.temperature.wetTemperatureChange);\n        }\n\n        return current;\n    }\n\n    private static TemperatureLevel nightModifier(Level level, BlockPos pos, TemperatureLevel current)\n    {\n        float time = timeOfDay(level.getGameTime());\n        boolean isNight = time >= 0.25F && time <= 0.75F;\n\n        // Drop the temperature during the night\n        if (isNight && (pos.getY() > ModConfig.temperature.environmentalModifierAltitude || pos.getY() >= level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, pos).below().getY()))\n        {\n            if (current == TemperatureLevel.HOT)\n                current = current.increment(ModConfig.temperature.nightHotTemperatureChange);\n            else if (current != TemperatureLevel.NEUTRAL)\n                current = current.increment(ModConfig.temperature.nightTemperatureChange);\n        }\n\n        return current;\n    }\n\n    public static float timeOfDay(long p_63905_) {\n        double d0 = Mth.frac(p_63905_ / 24000.0 - 0.25);\n        double d1 = 0.5 - Math.cos(d0 * Math.PI) / 2.0;\n        return (float)(d0 * 2.0 + d1) / 3.0F;\n    }\n\n    private static TemperatureLevel proximityModifier(Level level, BlockPos pos, TemperatureLevel current)\n    {\n        Set<BlockPos> heating = Sets.newHashSet();\n        Set<BlockPos> cooling = Sets.newHashSet();\n\n        // If the player's position is obstructed (for example, when mounted or inside a block), use the position above instead\n        if (!level.isEmptyBlock(pos))\n            pos = pos.above();\n\n        AreaFill.fill(level, pos, (checkerLevel, checkedPos) -> {\n           addHeatingOrCooling(heating, cooling, checkerLevel, checkedPos.pos());\n        });\n\n        if (heating.size() > cooling.size()) current = current.increment(1);\n        else if (cooling.size() > heating.size()) current = current.decrement(1);\n        return current;\n    }\n\n    private static void addHeatingOrCooling(Set<BlockPos> heating, Set<BlockPos> cooling, Level level, BlockPos pos)\n    {\n        BlockState state = level.getBlockState(pos);\n\n        if (TemperatureHelper.isHeatingBlock(state))\n        {\n            heating.add(pos);\n        }\n        else if (TemperatureHelper.isCoolingBlock(state))\n        {\n            cooling.add(pos);\n        }\n        else\n        {\n            for(IProximityBlockModifier modifier : proximityModifiers)\n            {\n                Type sourceType = modifier.getProximityType(level, pos, state);\n\n                if(sourceType == Type.HEATING)\n                {\n                    heating.add(pos);\n                }\n                else if(sourceType == Type.COOLING)\n                {\n                    cooling.add(pos);\n                }\n            }\n        }\n    }\n\n    private static TemperatureLevel thermoregulatorModifier(Player player, TemperatureLevel current)\n    {\n        return modifyTemperatureByThermoregulators(player.level(), TemperatureHelper.getTemperatureData(player).getNearbyThermoregulators(), player.blockPosition(), current);\n    }\n\n    private static TemperatureLevel immersionModifier(Player player, TemperatureLevel current)\n    {\n        Level level = player.level();\n        BlockPos pos = player.blockPosition();\n        ITemperature temperature = TemperatureHelper.getTemperatureData(player);\n\n        if (player.isOnFire()) current = current.increment(ModConfig.temperature.onFireTemperatureChange);\n        if (player.isInPowderSnow) current = current.increment(ModConfig.temperature.powderSnowTemperatureChange);\n        if (isExposedToRain(level, pos))\n        {\n            // Only set the dry ticks here, as the temperature change associated with rain has already been handled by the positional modifier\n            temperature.setDryTicks(0);\n        }\n        else if (!(player.getRootVehicle() instanceof Boat) && (player.isInWater() || level.getFluidState(pos).is(FluidTags.WATER)))\n        {\n            temperature.setDryTicks(0);\n            current = current.increment(ModConfig.temperature.wetTemperatureChange);\n        }\n        else\n        {\n            if (temperature.getDryTicks() < ModConfig.temperature.wetTicks)\n                current.increment(ModConfig.temperature.wetTemperatureChange);\n        }\n\n        return current;\n    }\n\n    protected static TemperatureLevel handheldModifier(Player player, TemperatureLevel current)\n    {\n        AtomicInteger coolingItems = new AtomicInteger();\n        AtomicInteger heatingItems = new AtomicInteger();\n\n        for (EquipmentSlot slot : EquipmentSlotGroup.HAND) {\n            var stack = player.getItemBySlot(slot);\n            if (stack.is(ModTags.Items.COOLING_HELD_ITEMS)) coolingItems.getAndIncrement();\n            if (stack.is(ModTags.Items.HEATING_HELD_ITEMS)) heatingItems.getAndIncrement();\n        }\n\n        return current.increment(heatingItems.get() - coolingItems.get());\n    }\n\n    protected static TemperatureLevel armorModifier(Player player, TemperatureLevel current)\n    {\n        AtomicInteger coolingPieces = new AtomicInteger();\n        AtomicInteger heatingPieces = new AtomicInteger();\n\n        for (EquipmentSlot slot : EquipmentSlotGroup.ARMOR) {\n            var stack = player.getItemBySlot(slot);\n            // Prevent doubling of effects if armor were to be tagged as heating/cooling and also had a heating/cooling trim applied\n            if (stack.is(ModTags.Items.COOLING_ARMOR) || stack.is(ModTags.Items.HEATING_ARMOR))\n            {\n                if (stack.is(ModTags.Items.COOLING_ARMOR)) coolingPieces.getAndIncrement();\n                if (stack.is(ModTags.Items.HEATING_ARMOR)) heatingPieces.getAndIncrement();\n            }\n            else\n            {\n                TrimMaterials.getFromIngredient(player.level().registryAccess(), stack).ifPresent(material -> {\n                    if (material.is(ModTags.Trims.COOLING_TRIMS)) coolingPieces.getAndIncrement();\n                    if (material.is(ModTags.Trims.HEATING_TRIMS)) heatingPieces.getAndIncrement();\n                });\n            }\n        }\n\n        // Prevent armor from sending players over the edge into hot or icy temperature levels\n        TemperatureLevel armorAdjTemp = current.increment(heatingPieces.get() / 2 - coolingPieces.get() / 2);\n        if (armorAdjTemp == TemperatureLevel.HOT && current != TemperatureLevel.HOT) current = armorAdjTemp.decrement(1);\n        else if (armorAdjTemp == TemperatureLevel.ICY && current != TemperatureLevel.ICY) current = armorAdjTemp.increment(1);\n        else current = armorAdjTemp;\n\n        var enchantmentRegistry = player.registryAccess().lookupOrThrow(Registries.ENCHANTMENT);\n\n        // Armor enchantments\n        if (EnchantmentHelper.getEnchantmentLevel(enchantmentRegistry.getOrThrow(TANEnchantments.THERMAL_TUNING), player) > 0)\n            current = TemperatureLevel.NEUTRAL;\n\n        return current;\n    }\n\n    protected static TemperatureLevel mountModifier(Player player, TemperatureLevel current)\n    {\n        var vehicle = player.getVehicle();\n\n        if (vehicle == null)\n            return current;\n\n        if (vehicle.getType().is(ModTags.EntityTypes.NEUTRALISING_MOUNTS))\n        {\n            current = TemperatureLevel.NEUTRAL;\n        }\n\n        return current;\n    }\n\n    protected static TemperatureLevel internalModifier(Player player, TemperatureLevel current)\n    {\n        TemperatureLevel newTemperature = current;\n\n        if (player.hasEffect(TANEffects.INTERNAL_WARMTH)) newTemperature = newTemperature.increment(1);\n        if (player.hasEffect(TANEffects.INTERNAL_CHILL)) newTemperature = newTemperature.decrement(1);\n\n        // Prevent internal effects from sending players into extremities\n        if (newTemperature == TemperatureLevel.HOT && current != TemperatureLevel.HOT) current = newTemperature.decrement(1);\n        else if (newTemperature == TemperatureLevel.ICY && current != TemperatureLevel.ICY) current = newTemperature.increment(1);\n        else current = newTemperature;\n\n        return current;\n    }\n\n    private static boolean isExposedToRain(Level level, BlockPos pos)\n    {\n        return level.isRaining() && pos.getY() >= level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, pos).below().getY();\n    }\n\n    private static boolean coldEnoughToSnow(Level level, Holder<Biome> biome, BlockPos pos)\n    {\n        return biome.value().coldEnoughToSnow(pos, level.getSeaLevel());\n    }\n\n    public static TemperatureLevel modifyTemperatureByThermoregulators(Level level, Set<BlockPos> thermoregulators, BlockPos checkPos, TemperatureLevel current)\n    {\n        int coolingCount = 0;\n        int heatingCount = 0;\n        int neutralCount = 0;\n\n        for (BlockPos pos : thermoregulators)\n        {\n            ThermoregulatorBlockEntity blockEntity = (ThermoregulatorBlockEntity)level.getBlockEntity(pos);\n\n            if (blockEntity == null)\n                continue;\n\n            switch (blockEntity.getEffectAtPos(checkPos))\n            {\n                case COOLING -> ++coolingCount;\n                case HEATING -> ++heatingCount;\n                case NEUTRALIZING -> ++neutralCount;\n            }\n        }\n\n        if (coolingCount == 0 && heatingCount == 0 && neutralCount > 0) return TemperatureLevel.NEUTRAL;\n        else if (coolingCount > heatingCount) return current.decrement(2);\n        else if (heatingCount > coolingCount) return current.increment(2);\n        else return current;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/TemperatureHooksClient.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport glitchcore.util.GuiUtils;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.gui.Gui;\nimport net.minecraft.client.gui.GuiGraphics;\nimport net.minecraft.client.player.LocalPlayer;\nimport net.minecraft.client.renderer.RenderPipelines;\nimport net.minecraft.resources.Identifier;\nimport org.joml.Matrix3x2f;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.init.ModConfig;\n\npublic class TemperatureHooksClient\n{\n    private static final Identifier OVERHEATED_HEART_FULL = Identifier.parse(\"toughasnails:hud/heart/overheated_full\");\n    private static final Identifier OVERHEATED_HEART_FULL_BLINKING = Identifier.parse(\"toughasnails:hud/heart/overheated_full_blinking\");\n    private static final Identifier OVERHEATED_HEART_HALF = Identifier.parse(\"toughasnails:hud/heart/overheated_half\");\n    private static final Identifier OVERHEATED_HEART_HALF_BLINKING = Identifier.parse(\"toughasnails:hud/heart/overheated_half_blinking\");\n    private static final Identifier OVERHEATED_HEART_HARDCORE_FULL = Identifier.parse(\"toughasnails:hud/heart/overheated_hardcore_full\");\n    private static final Identifier OVERHEATED_HEART_HARDCORE_FULL_BLINKING = Identifier.parse(\"toughasnails:hud/heart/overheated_hardcore_full_blinking\");\n    private static final Identifier OVERHEATED_HEART_HARDCORE_HALF = Identifier.parse(\"toughasnails:hud/heart/overheated_hardcore_half\");\n    private static final Identifier OVERHEATED_HEART_HARDCORE_HALF_BLINKING = Identifier.parse(\"toughasnails:hud/heart/overheated_hardcore_half_blinking\");\n\n    public static void heartBlit(GuiGraphics gui, Gui.HeartType heartType, int x, int y, boolean isHardcore, boolean isBlinking, boolean isHalf)\n    {\n        Minecraft minecraft = Minecraft.getInstance();\n        LocalPlayer player = minecraft.player;\n\n        // Normal hearts\n        if (heartType == Gui.HeartType.NORMAL && TemperatureHelper.isFullyHyperthermic(player))\n        {\n            gui.blitSprite(RenderPipelines.GUI_TEXTURED, getOverheatedHeartSprite(isHardcore, isHalf, isBlinking), x, y, 9, 9);\n        }\n        else\n        {\n            gui.blitSprite(RenderPipelines.GUI_TEXTURED, heartType.getSprite(isHardcore, isHalf, isBlinking), x, y, 9, 9);\n        }\n    }\n\n    public static void adjustSelectedItemText(GuiGraphics guiGraphics)\n    {\n        var pose = guiGraphics.pose();\n\n        // If temperature is enabled, move the selected item text up by 2 pixels. This is only done in survival mode.\n        if (ModConfig.temperature.enableTemperature && GuiUtils.shouldDrawSurvivalElements())\n        {\n            pose.translate(0F, -2F, new Matrix3x2f());\n        }\n    }\n\n    private static Identifier getOverheatedHeartSprite(boolean isHardcore, boolean isHalf, boolean isBlinking)\n    {\n        if (!isHardcore)\n        {\n            if (isHalf) {\n                return isBlinking ? OVERHEATED_HEART_HALF_BLINKING : OVERHEATED_HEART_HALF;\n            } else {\n                return isBlinking ? OVERHEATED_HEART_FULL_BLINKING : OVERHEATED_HEART_FULL;\n            }\n        }\n        else if (isHalf)\n        {\n            return isBlinking ? OVERHEATED_HEART_HARDCORE_HALF_BLINKING : OVERHEATED_HEART_HARDCORE_HALF;\n        }\n        else\n        {\n            return isBlinking ? OVERHEATED_HEART_HARDCORE_FULL_BLINKING : OVERHEATED_HEART_HARDCORE_FULL;\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/temperature/TemperatureOverlayRenderer.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.temperature;\n\nimport glitchcore.event.TickEvent;\nimport glitchcore.event.client.RenderGuiEvent;\nimport glitchcore.util.GuiUtils;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.gui.Gui;\nimport net.minecraft.client.gui.GuiGraphics;\nimport net.minecraft.client.renderer.RenderPipelines;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.entity.player.Player;\nimport toughasnails.api.TANAPI;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.temperature.TemperatureLevel;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModConfig;\n\nimport java.util.Random;\n\npublic class TemperatureOverlayRenderer\n{\n    private static final Random RANDOM = new Random();\n    public static final Identifier OVERLAY = Identifier.parse(\"toughasnails:textures/gui/icons.png\");\n    private static final Identifier HYPERTHERMIA_OUTLINE_LOCATION = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, \"textures/misc/hyperthermia_outline.png\");\n    private static long updateCounter;\n    private static long flashCounter;\n    private static long arrowCounter;\n    private static ArrowDirection arrowDirection;\n    private static TemperatureLevel prevTemperatureLevel;\n\n    public static void onBeginRenderFood(RenderGuiEvent.Pre event)\n    {\n        if (event.getType() != RenderGuiEvent.Type.FOOD)\n            return;\n\n        Gui gui = event.getGui();\n        Minecraft minecraft = Minecraft.getInstance();\n        if (!minecraft.options.hideGui && GuiUtils.shouldDrawSurvivalElements())\n        {\n            renderTemperature(event.getGuiGraphics(), event.getDeltaTracker().getRealtimeDeltaTicks(), event.getScreenWidth(), event.getScreenHeight());\n        }\n    }\n\n    public static void onBeginRenderFrostbite(RenderGuiEvent.Pre event)\n    {\n        if (event.getType() != RenderGuiEvent.Type.FROSTBITE)\n            return;\n\n        Gui gui = event.getGui();\n        Minecraft minecraft = Minecraft.getInstance();\n        Player player = minecraft.player;\n\n        if (TemperatureHelper.getTicksHyperthermic(player) > 0)\n            gui.renderTextureOverlay(event.getGuiGraphics(), HYPERTHERMIA_OUTLINE_LOCATION, TemperatureHelper.getPercentHyperthermic(player));\n    }\n\n    public static void onClientTick(TickEvent.Client event)\n    {\n        Minecraft minecraft = Minecraft.getInstance();\n\n        if (event.getPhase() == TickEvent.Phase.END && !minecraft.isPaused())\n        {\n            updateCounter++;\n        }\n    }\n\n    public static void renderTemperature(GuiGraphics guiGraphics, float partialTicks, int width, int height)\n    {\n        Minecraft minecraft = Minecraft.getInstance();\n\n        // Do nothing if temperature is disabled\n        if (!ModConfig.temperature.enableTemperature)\n            return;\n\n        Player player = minecraft.player;\n        TemperatureLevel temperature = TemperatureHelper.getTemperatureForPlayer(player);\n\n        // When the update counter isn't incrementing, ensure the same numbers are produced (freezes moving gui elements)\n        RANDOM.setSeed(updateCounter * 312871L);\n\n        if (minecraft.gameMode.getPlayerMode().isSurvival())\n        {\n            drawTemperature(guiGraphics, width, height, temperature);\n        }\n    }\n\n    private static void drawTemperature(GuiGraphics gui, int width, int height, TemperatureLevel temperature)\n    {\n        int left = width / 2 - 8 + ModConfig.client.temperatureLeftOffset;\n        int top = height - 52 + ModConfig.client.temperatureTopOffset;\n\n        if (prevTemperatureLevel == null)\n            prevTemperatureLevel = temperature;\n\n        // Reset arrow direction when duration has elapsed\n        if (updateCounter > arrowCounter)\n            arrowDirection = null;\n\n        // Flash for 16 ticks when the temperature changes\n        if (prevTemperatureLevel != temperature)\n        {\n            flashCounter = updateCounter + 3;\n            arrowCounter = updateCounter + 15;\n            if (temperature.compareTo(prevTemperatureLevel) > 0) arrowDirection = ArrowDirection.UP;\n            else if (temperature.compareTo(prevTemperatureLevel) < 0) arrowDirection = ArrowDirection.DOWN;\n        }\n\n        // Update the prevTemperatureLevel to the current temperature level\n        prevTemperatureLevel = temperature;\n\n        // Shake the temperature meter when ICY or HOT\n        if (temperature == TemperatureLevel.ICY || temperature == TemperatureLevel.HOT)\n        {\n            if ((updateCounter % 1) == 0)\n            {\n                top += (int)((RANDOM.nextInt(3) - 1) * Math.min(3F, 1.0));\n                left += (int)((RANDOM.nextInt(3) - 1) * Math.min(1.5F, 1.0));\n            }\n        }\n\n        int iconIndex = temperature.ordinal() * 16;\n        int v = 0;\n\n        // Adjust v for flashing\n        if (flashCounter > updateCounter)\n            v += 16;\n\n        gui.blit(RenderPipelines.GUI_TEXTURED, OVERLAY, left, top, iconIndex, v, 16, 16, 256, 256);\n\n        // Draw the arrow\n        if (arrowDirection != null)\n        {\n            gui.blit(RenderPipelines.GUI_TEXTURED, OVERLAY, left, top, arrowDirection.getU(15 - (int)(arrowCounter - updateCounter)), arrowDirection.getV(), 16, 16, 256, 256);\n        }\n    }\n\n    private enum ArrowDirection\n    {\n        UP(224),\n        DOWN(240);\n\n        private final int v;\n\n        ArrowDirection(int v)\n        {\n            this.v = v;\n        }\n\n        public int getU(int frame)\n        {\n            return frame * 16;\n        }\n\n        public int getV()\n        {\n            return this.v;\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/thirst/ThirstData.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.thirst;\n\nimport net.minecraft.nbt.CompoundTag;\nimport net.minecraft.world.level.storage.ValueInput;\nimport net.minecraft.world.level.storage.ValueOutput;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.init.ModConfig;\n\npublic class ThirstData implements IThirst\n{\n    public static final int DEFAULT_THIRST = 20;\n    public static final float DEFAULT_HYDRATION = 2.0F;\n\n    private int thirstLevel = DEFAULT_THIRST;\n    private float hydrationLevel = DEFAULT_HYDRATION;\n    private float exhaustionLevel;\n    private int tickTimer;\n    private int lastThirst = -99999999;\n    private boolean lastHydrationZero = true;\n\n    public void addAdditionalSaveData(ValueOutput output)\n    {\n        if (ModConfig.thirst.enableThirst)\n        {\n            output.putInt(\"thirstLevel\", this.getThirst());\n            output.putInt(\"thirstTickTimer\", this.getTickTimer());\n            output.putFloat(\"thirstHydrationLevel\", this.getHydration());\n            output.putFloat(\"thirstExhaustionLevel\", this.getExhaustion());\n        }\n        else\n        {\n            // Save default values\n            output.putInt(\"thirstLevel\", ThirstData.DEFAULT_THIRST);\n            output.putInt(\"thirstTickTimer\", 0);\n            output.putFloat(\"thirstHydrationLevel\", ThirstData.DEFAULT_HYDRATION);\n            output.putFloat(\"thirstExhaustionLevel\", 0.0F);\n        }\n    }\n\n    public void readAdditionalSaveData(ValueInput input)\n    {\n        if (ModConfig.thirst.enableThirst)\n        {\n            this.setThirst(input.getInt(\"thirstLevel\").orElse(ThirstData.DEFAULT_THIRST));\n            this.setTickTimer(input.getInt(\"thirstTickTimer\").orElse(0));\n            this.setHydration(input.getFloatOr(\"thirstHydrationLevel\", ThirstData.DEFAULT_HYDRATION));\n            this.setExhaustion(input.getFloatOr(\"thirstExhaustionLevel\", 0.0F));\n        }\n        else\n        {\n            // Use default values if thirst is disabled\n            this.setThirst(ThirstData.DEFAULT_THIRST);\n            this.setTickTimer(0);\n            this.setHydration(ThirstData.DEFAULT_HYDRATION);\n            this.setExhaustion(0.0F);\n        }\n    }\n\n    @Override\n    public int getThirst()\n    {\n        return this.thirstLevel;\n    }\n\n    @Override\n    public int getLastThirst()\n    {\n        return this.lastThirst;\n    }\n\n    @Override\n    public int getTickTimer()\n    {\n        return this.tickTimer;\n    }\n\n    @Override\n    public float getHydration()\n    {\n        return this.hydrationLevel;\n    }\n\n    @Override\n    public boolean getLastHydrationZero()\n    {\n        return this.lastHydrationZero;\n    }\n\n    @Override\n    public float getExhaustion()\n    {\n        return this.exhaustionLevel;\n    }\n\n    @Override\n    public void setThirst(int level)\n    {\n        this.thirstLevel = level;\n    }\n\n    @Override\n    public void addThirst(int thirst)\n    {\n        this.thirstLevel = Math.min(this.thirstLevel + thirst, 20);\n    }\n\n    @Override\n    public void setLastThirst(int thirst)\n    {\n        this.lastThirst = thirst;\n    }\n\n    @Override\n    public void setTickTimer(int timer)\n    {\n        this.tickTimer = timer;\n    }\n\n    @Override\n    public void addTicks(int ticks)\n    {\n        this.tickTimer += ticks;\n    }\n\n    @Override\n    public void setHydration(float hydration)\n    {\n        this.hydrationLevel = hydration;\n    }\n\n    @Override\n    public void setLastHydrationZero(boolean value)\n    {\n        this.lastHydrationZero = value;\n    }\n\n    @Override\n    public void addHydration(float hydration)\n    {\n        this.hydrationLevel += hydration;\n    }\n\n    @Override\n    public void setExhaustion(float exhaustion)\n    {\n        this.exhaustionLevel = exhaustion;\n    }\n\n    @Override\n    public void addExhaustion(float exhaustion)\n    {\n        this.exhaustionLevel += exhaustion;\n    }\n\n    @Override\n    public void drink(int thirst, float hydrationModifier)\n    {\n        if (!this.isThirsty())\n            return;\n\n        this.thirstLevel = Math.min(thirst + this.thirstLevel, 20);\n        this.hydrationLevel = Math.min(this.hydrationLevel + (float)thirst * hydrationModifier * 2.0F, (float)this.thirstLevel);\n    }\n\n    @Override\n    public boolean isThirsty()\n    {\n        return this.thirstLevel < 20;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/thirst/ThirstHandler.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.thirst;\n\nimport glitchcore.event.TickEvent;\nimport glitchcore.event.entity.LivingEntityUseItemEvent;\nimport glitchcore.event.player.PlayerEvent;\nimport glitchcore.event.player.PlayerInteractEvent;\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Holder;\nimport net.minecraft.server.level.ServerLevel;\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.sounds.SoundEvents;\nimport net.minecraft.sounds.SoundSource;\nimport net.minecraft.stats.Stats;\nimport net.minecraft.tags.FluidTags;\nimport net.minecraft.world.Difficulty;\nimport net.minecraft.world.InteractionHand;\nimport net.minecraft.world.InteractionResult;\nimport net.minecraft.world.effect.MobEffectInstance;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.ItemUtils;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.alchemy.PotionContents;\nimport net.minecraft.world.item.alchemy.Potions;\nimport net.minecraft.world.level.ClipContext;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraft.world.level.gamerules.GameRules;\nimport net.minecraft.world.phys.BlockHitResult;\nimport net.minecraft.world.phys.HitResult;\nimport toughasnails.api.damagesource.TANDamageTypes;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.temperature.ITemperature;\nimport toughasnails.api.temperature.TemperatureHelper;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModConfig;\nimport toughasnails.init.ModPackets;\nimport toughasnails.init.ModTags;\nimport toughasnails.network.DrinkInWorldPacket;\nimport toughasnails.network.UpdateThirstPacket;\nimport toughasnails.temperature.TemperatureData;\n\npublic class ThirstHandler\n{\n    public static void onPlayerTick(Player player)\n    {\n        if (!ModConfig.thirst.enableThirst || player.level().isClientSide())\n            return;\n\n        IThirst thirst = ThirstHelper.getThirst(player);\n        Difficulty difficulty = player.level().getDifficulty();\n        double exhaustionThreshold = ModConfig.thirst.thirstExhaustionThreshold;\n\n        if (thirst.getExhaustion() > exhaustionThreshold)\n        {\n            thirst.addExhaustion((float)-exhaustionThreshold);\n\n            if (thirst.getHydration() > 0.0F)\n            {\n                // Deplete hydration\n                thirst.setHydration(Math.max(thirst.getHydration() - 1.0F, 0.0F));\n            }\n            else if (difficulty != Difficulty.PEACEFUL)\n            {\n                // Reduce thirst bar once hydration has been depleted\n                thirst.setThirst(Math.max(thirst.getThirst() - 1, 0));\n            }\n        }\n\n        if (thirst.getThirst() <= 0)\n        {\n            thirst.addTicks(1);\n\n            // Cause damage after 80 ticks of an empty thirst bar\n            if (thirst.getTickTimer() >= 80)\n            {\n                if (player.getHealth() > 10.0F || difficulty == Difficulty.HARD || player.getHealth() > 1.0F && difficulty == Difficulty.NORMAL)\n                {\n                    player.hurt(player.damageSources().source(TANDamageTypes.THIRST), 1.0F);\n                }\n\n                thirst.setTickTimer(0);\n            }\n        }\n        else\n        {\n            thirst.setTickTimer(0);\n        }\n\n        // Increment thirst if on peaceful mode\n        if (difficulty == Difficulty.PEACEFUL && ((ServerLevel)player.level()).getGameRules().get(GameRules.NATURAL_HEALTH_REGENERATION))\n        {\n            if (thirst.isThirsty() && player.tickCount % 10 == 0)\n            {\n                thirst.setThirst(thirst.getThirst() + 1);\n            }\n        }\n    }\n\n    public static void onChangeDimension(PlayerEvent.ChangeDimension event)\n    {\n        ITemperature temperature = TemperatureHelper.getTemperatureData(event.getPlayer());\n        temperature.setLastLevel(TemperatureData.DEFAULT_LEVEL);\n        temperature.setLastHyperthermiaTicks(0);\n    }\n\n    public static void syncThirst(ServerPlayer player)\n    {\n        IThirst thirst = ThirstHelper.getThirst(player);\n        ModPackets.HANDLER.sendToPlayer(new UpdateThirstPacket(thirst.getThirst(), thirst.getHydration()), player);\n        thirst.setLastThirst(thirst.getThirst());\n        thirst.setLastHydrationZero(thirst.getHydration() == 0.0F);\n    }\n\n    // Replenish thirst after drinking from items in the config file\n    public static void onItemUseFinish(LivingEntityUseItemEvent.Finish event)\n    {\n        if (!ModConfig.thirst.enableThirst || !(event.getEntity() instanceof Player) || event.getEntity().level().isClientSide())\n            return;\n\n        Player player = (Player)event.getEntity();\n        ItemStack drink = event.getItem();\n        IThirst thirst = ThirstHelper.getThirst(player);\n\n        if (drink.is(ModTags.Items.DRINKS))\n        {\n            int drink_thirst = ModTags.Items.getThirstRestored(drink);\n            float drink_hydration = 0.0F;\n            float drink_poison_chance = 0.0F;\n\n            ///////////////////\n\n            if (drink.is(ModTags.Items.TEN_HYDRATION_DRINKS)) { drink_hydration = 0.1F; }\n            if (drink.is(ModTags.Items.TWENTY_HYDRATION_DRINKS)) { drink_hydration = 0.2F; }\n            if (drink.is(ModTags.Items.THIRTY_HYDRATION_DRINKS)) { drink_hydration = 0.3F; }\n            if (drink.is(ModTags.Items.FOURTY_HYDRATION_DRINKS)) { drink_hydration = 0.4F; }\n            if (drink.is(ModTags.Items.FIFTY_HYDRATION_DRINKS)) { drink_hydration = 0.5F; }\n            if (drink.is(ModTags.Items.SIXTY_HYDRATION_DRINKS)) { drink_hydration = 0.6F; }\n            if (drink.is(ModTags.Items.SEVENTY_HYDRATION_DRINKS)) { drink_hydration = 0.7F; }\n            if (drink.is(ModTags.Items.EIGHTY_HYDRATION_DRINKS)) { drink_hydration = 0.8F; }\n            if (drink.is(ModTags.Items.NINETY_HYDRATION_DRINKS)) { drink_hydration = 0.9F; }\n            if (drink.is(ModTags.Items.ONE_HUNDRED_HYDRATION_DRINKS)) { drink_hydration = 1.0F; }\n\n            ///////////////////\n\n            if (drink.is(ModTags.Items.TWENTY_FIVE_POISON_CHANCE_DRINKS)) { drink_poison_chance = 0.25F; }\n            if (drink.is(ModTags.Items.FIFTY_POISON_CHANCE_DRINKS)) { drink_poison_chance = 0.5F; }\n            if (drink.is(ModTags.Items.SEVENTY_FIVE_POISON_CHANCE_DRINKS)) { drink_poison_chance = 0.75F; }\n            if (drink.is(ModTags.Items.ONE_HUNDRED_POISON_CHANCE_DRINKS)) { drink_poison_chance = 1.0F; }\n\n            ///////////////////\n\n            // Based on FoodData's eat\n            thirst.drink(drink_thirst, drink_hydration);\n\n            if (player.level().random.nextFloat() < drink_poison_chance)\n            {\n                player.addEffect(new MobEffectInstance(TANEffects.THIRST, 600));\n            }\n        }\n    }\n\n    // Fill bottles with dirty or purified water as appropriate\n    public static void onPlayerUseItem(PlayerInteractEvent.UseItem event)\n    {\n        Player player = event.getPlayer();\n        Level level = player.level();\n        InteractionHand hand = event.getHand();\n        ItemStack stack = player.getItemInHand(hand);\n        Item item = stack.getItem();\n\n        // We only care about the glass bottle\n        if (item != Items.GLASS_BOTTLE)\n            return;\n\n        HitResult rayTraceResult = Item.getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY);\n\n        // Defer to the default glass bottle use implementation\n        if (rayTraceResult.getType() != HitResult.Type.BLOCK)\n            return;\n\n        BlockPos pos = ((BlockHitResult)rayTraceResult).getBlockPos();\n\n        if (!level.mayInteract(player, pos) || !level.getFluidState(pos).is(FluidTags.WATER))\n            return;\n\n        // Play the filling sound\n        level.playSound(player, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_FILL, SoundSource.NEUTRAL, 1.0F, 1.0F);\n\n        Holder<Biome> biome = level.getBiome(pos);\n        ItemStack filledStack;\n\n        // Set the filled stack based on the biome's water type\n        if (biome.is(ModTags.Biomes.DIRTY_WATER_BIOMES))\n        {\n            filledStack = new ItemStack(TANItems.DIRTY_WATER_BOTTLE);\n        }\n        else if (biome.is(ModTags.Biomes.PURIFIED_WATER_BIOMES))\n        {\n            filledStack = new ItemStack(TANItems.PURIFIED_WATER_BOTTLE);\n        }\n        else\n        {\n            filledStack = PotionContents.createItemStack(Items.POTION, Potions.WATER);\n        }\n\n        player.awardStat(Stats.ITEM_USED.get(item));\n        ItemStack replacementStack = ItemUtils.createFilledResult(stack, player, filledStack);\n\n        // Cancel the event, we've taken responsibility for bottle filling\n        event.setCancelResult(InteractionResult.SUCCESS.heldItemTransformedTo(replacementStack));\n        event.setCancelled(true);\n    }\n\n    // Hand drinking\n    private static final int IN_WORLD_DRINK_COOLDOWN = 3 * 20;\n    private static int inWorldDrinkTimer = 0;\n\n    public static void onUseBlock(PlayerInteractEvent.UseBlock event)\n    {\n        if (canHandDrink() && canHandDrinkInWorld(event.getPlayer(), event.getHand()))\n            tryDrinkWaterInWorld(event.getPlayer());\n    }\n\n    public static void onUseEmpty(PlayerInteractEvent.UseEmpty event)\n    {\n        if (canHandDrink() && canHandDrinkInWorld(event.getPlayer(), event.getHand()))\n            tryDrinkWaterInWorld(event.getPlayer());\n    }\n\n    public static void onClientTick(TickEvent.Client event)\n    {\n        if (inWorldDrinkTimer > 0)\n            inWorldDrinkTimer--;\n    }\n\n    private static boolean canHandDrink()\n    {\n        return ModConfig.thirst.enableThirst && ModConfig.thirst.enableHandDrinking;\n    }\n\n    private static boolean canHandDrinkInWorld(Player player, InteractionHand hand)\n    {\n        return InteractionHand.MAIN_HAND == hand && player.getMainHandItem().isEmpty() && player.isCrouching() && ThirstHelper.getThirst(player).getThirst() < 20 && player.level().isClientSide() && inWorldDrinkTimer <= 0;\n    }\n\n    private static void tryDrinkWaterInWorld(Player player)\n    {\n        Level world = player.level();\n        BlockHitResult rayTraceResult = Item.getPlayerPOVHitResult(player.level(), player, ClipContext.Fluid.SOURCE_ONLY);\n\n        if (rayTraceResult.getType() == HitResult.Type.BLOCK)\n        {\n            BlockPos pos = ((BlockHitResult) rayTraceResult).getBlockPos();\n\n            if (ThirstHelper.canDrink(player, false) && world.mayInteract(player, pos) && world.getFluidState(pos).is(FluidTags.WATER))\n            {\n                inWorldDrinkTimer = IN_WORLD_DRINK_COOLDOWN;\n                ModPackets.HANDLER.sendToServer(new DrinkInWorldPacket(pos));\n                player.playSound(SoundEvents.GENERIC_DRINK.value(), 0.5f, 1.0f);\n                player.swing(InteractionHand.MAIN_HAND);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/thirst/ThirstHelperImpl.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.thirst;\n\nimport net.minecraft.world.entity.player.Player;\nimport toughasnails.api.player.ITANPlayer;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.init.ModConfig;\n\npublic class ThirstHelperImpl implements ThirstHelper.Impl.IThirstHelper\n{\n    private IThirst lastThirst;\n\n    @Override\n    public IThirst getThirst(Player player)\n    {\n        IThirst thirst = ((ITANPlayer)player).getThirstData();\n        lastThirst = thirst;\n        return thirst;\n    }\n\n    @Override\n    public boolean canDrink(Player player, boolean ignoreThirst)\n    {\n        IThirst thirst = getThirst(player);\n        return (player.getAbilities().invulnerable || ignoreThirst || thirst.isThirsty()) && isThirstEnabled();\n    }\n\n    @Override\n    public boolean isThirstEnabled()\n    {\n        return ModConfig.thirst.enableThirst;\n    }\n}\n\n"
  },
  {
    "path": "common/src/main/java/toughasnails/thirst/ThirstHooks.java",
    "content": "package toughasnails.thirst;\n\nimport net.minecraft.server.level.ServerPlayer;\nimport net.minecraft.world.Difficulty;\nimport net.minecraft.world.entity.player.Player;\nimport net.minecraft.world.food.FoodData;\nimport net.minecraft.world.level.gamerules.GameRules;\nimport toughasnails.api.damagesource.TANDamageTypes;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModConfig;\n\npublic class ThirstHooks\n{\n    /*\n     * Hooks called by ASM\n     */\n    public static void onCauseFoodExhaustion(Player player, float exhaustion)\n    {\n        if (ModConfig.thirst.enableThirst)\n        {\n            ThirstHelper.getThirst(player).addExhaustion(exhaustion);\n        }\n    }\n\n    public static void doFoodDataTick(FoodData data, ServerPlayer player)\n    {\n        Difficulty difficulty = player.level().getDifficulty();\n        IThirst thirst = ThirstHelper.getThirst(player);\n\n        if (data.exhaustionLevel > 4.0F)\n        {\n            data.exhaustionLevel -= 4.0F;\n\n            if (data.saturationLevel > 0.0F)\n            {\n                data.saturationLevel = Math.max(data.saturationLevel - 1.0F, 0.0F);\n            }\n            else if (difficulty != Difficulty.PEACEFUL)\n            {\n                data.foodLevel = Math.max(data.foodLevel - 1, 0);\n            }\n        }\n\n        boolean naturalRegen = player.level().getGameRules().get(GameRules.NATURAL_HEALTH_REGENERATION);\n\n        if (naturalRegen && data.saturationLevel > 0.0F && player.isHurt() && data.foodLevel >= 20 && (!ModConfig.thirst.thirstPreventHealthRegen || (thirst.getHydration() > 0.0F && thirst.getThirst() >= 20)))\n        {\n            ++data.tickTimer;\n\n            if (data.tickTimer >= 10)\n            {\n                // Derive the replenish amount only from hunger to cause less confusion\n                float replenishAmount = Math.min(data.saturationLevel, 6.0F);\n\n                player.heal(replenishAmount / 6.0F);\n\n                // Add exhaustion to thirst regardless of whether the thirst health regen option is enabled/disabled\n                data.addExhaustion(replenishAmount);\n                thirst.addExhaustion(replenishAmount);\n                data.tickTimer = 0;\n            }\n        }\n        else if (naturalRegen && data.foodLevel >= 18 && (!ModConfig.thirst.thirstPreventHealthRegen || thirst.getThirst() >= 18) && player.isHurt())\n        {\n            ++data.tickTimer;\n            if (data.tickTimer >= 80)\n            {\n                player.heal(1.0F);\n\n                // Add exhaustion to thirst regardless of whether the thirst health regen option is enabled/disabled\n                data.addExhaustion(6.0F);\n                thirst.addExhaustion(6.0F);\n                data.tickTimer = 0;\n            }\n        }\n        else if (data.foodLevel <= 0)\n        {\n            ++data.tickTimer;\n            if (data.tickTimer >= 80)\n            {\n                if (player.getHealth() > 10.0F || difficulty == Difficulty.HARD || player.getHealth() > 1.0F && difficulty == Difficulty.NORMAL)\n                {\n                    player.hurt(player.damageSources().source(TANDamageTypes.THIRST), 1.0F);\n                }\n\n                data.tickTimer = 0;\n            }\n        }\n        else\n        {\n            data.tickTimer = 0;\n        }\n    }\n\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/thirst/ThirstHooksClient.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.thirst;\n\nimport net.minecraft.client.player.LocalPlayer;\nimport net.minecraft.world.entity.player.Player;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.init.ModConfig;\n\npublic class ThirstHooksClient\n{\n    public static void onAiStepSetSprinting(LocalPlayer player, boolean sprinting)\n    {\n        // Don't allow sprinting if the player has insufficient thirst\n        if (sprinting && !canSprintWithThirst(player))\n            sprinting = false;\n\n        player.setSprinting(sprinting);\n    }\n\n    private static boolean canSprintWithThirst(LocalPlayer player)\n    {\n        return !ModConfig.thirst.thirstPreventSprint || ThirstHelper.getThirst(player).getThirst() > 6 || player.getAbilities().mayfly;\n    }\n}\n"
  },
  {
    "path": "common/src/main/java/toughasnails/thirst/ThirstOverlayRenderer.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.thirst;\n\nimport glitchcore.event.TickEvent;\nimport glitchcore.event.client.RenderGuiEvent;\nimport glitchcore.util.GuiUtils;\nimport net.minecraft.client.Minecraft;\nimport net.minecraft.client.gui.GuiGraphics;\nimport net.minecraft.client.renderer.RenderPipelines;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.entity.Entity;\nimport net.minecraft.world.entity.player.Player;\nimport toughasnails.api.potion.TANEffects;\nimport toughasnails.api.thirst.IThirst;\nimport toughasnails.api.thirst.ThirstHelper;\nimport toughasnails.init.ModConfig;\n\nimport java.util.Random;\n\npublic class ThirstOverlayRenderer\n{\n    private static final Random RANDOM = new Random();\n    public static final Identifier OVERLAY = Identifier.parse(\"toughasnails:textures/gui/icons.png\");\n\n    private static int updateCounter;\n\n    public static void onClientTick(TickEvent.Client event)\n    {\n        Minecraft minecraft = Minecraft.getInstance();\n\n        if (event.getPhase() == TickEvent.Phase.END && !minecraft.isPaused())\n        {\n            updateCounter++;\n        }\n    }\n\n    public static void onBeginRenderAir(RenderGuiEvent.Pre event)\n    {\n        if (event.getType() != RenderGuiEvent.Type.AIR || !ModConfig.thirst.enableThirst)\n            return;\n\n        Minecraft minecraft = Minecraft.getInstance();\n        Entity vehicle = minecraft.player.getVehicle();\n        boolean isMounted = vehicle != null && vehicle.showVehicleHealth();\n        if (!isMounted && !minecraft.options.hideGui && GuiUtils.shouldDrawSurvivalElements())\n        {\n            Player player = minecraft.player;\n            IThirst thirst = ThirstHelper.getThirst(player);\n\n            // When the update counter isn't incrementing, ensure the same numbers are produced (freezes moving gui elements)\n            RANDOM.setSeed(updateCounter * 312871L);\n\n            int rowTop = event.getRowTop();\n            drawThirst(event.getGuiGraphics(), event.getScreenWidth(), rowTop, thirst.getThirst(), thirst.getHydration());\n            event.setRowTop(rowTop - 10);\n        }\n    }\n\n    public static void drawThirst(GuiGraphics guiGraphics, int screenWidth, int rowTop, int thirstLevel, float thirstHydrationLevel)\n    {\n        Minecraft minecraft = Minecraft.getInstance();\n        Player player = minecraft.player;\n\n        int left = screenWidth / 2 + 91 + ModConfig.client.thirstLeftOffset;\n        int top = rowTop + ModConfig.client.thirstTopOffset;\n\n        for (int i = 0; i < 10; i++)\n        {\n            int dropletHalf = i * 2 + 1;\n            int iconIndex = 0;\n\n            int startX = left - i * 8 - 9;\n            int startY = top;\n\n            int backgroundU = 0;\n\n            if (player.hasEffect(TANEffects.THIRST))\n            {\n                iconIndex += 4;\n                backgroundU += 117;\n            }\n\n            if (thirstHydrationLevel <= 0.0F && updateCounter % (thirstLevel * 3 + 1) == 0)\n            {\n                startY = top + (RANDOM.nextInt(3) - 1);\n            }\n\n            // Draw the background of each thirst droplet\n            guiGraphics.blit(RenderPipelines.GUI_TEXTURED, OVERLAY, startX, startY, backgroundU, 32, 9, 9, 256, 256);\n\n            // Draw a full droplet\n            if (thirstLevel > dropletHalf)\n            {\n                guiGraphics.blit(RenderPipelines.GUI_TEXTURED, OVERLAY, startX, startY, (iconIndex + 4) * 9, 32, 9, 9, 256, 256);\n            }\n            else if (thirstLevel == dropletHalf) // Draw a half droplet\n            {\n                guiGraphics.blit(RenderPipelines.GUI_TEXTURED, OVERLAY, startX, startY, (iconIndex + 5) * 9, 32, 9, 9, 256, 256);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/atlases/gui.json",
    "content": "{\n    \"sources\": [\n        {\n            \"type\": \"directory\",\n            \"source\": \"gui/sprites\",\n            \"prefix\": \"\"\n        }\n    ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/blockstates/rain_collector.json",
    "content": "{\n    \"variants\": {\n        \"level=0\": { \"model\": \"toughasnails:block/rain_collector\" },\n        \"level=1\": { \"model\": \"toughasnails:block/rain_collector_level1\" },\n        \"level=2\": { \"model\": \"toughasnails:block/rain_collector_level2\" },\n        \"level=3\": { \"model\": \"toughasnails:block/rain_collector_level3\" }\n    }\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/blockstates/temperature_gauge.json",
    "content": "{\n  \"variants\": {\n    \"inverted=false\": {\n      \"model\": \"toughasnails:block/temperature_gauge\"\n    },\n    \"inverted=true\": {\n      \"model\": \"toughasnails:block/temperature_gauge_inverted\"\n    }\n  }\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/blockstates/thermoregulator.json",
    "content": "{\n  \"variants\": {\n    \"facing=east,cooling=false,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator\",\n      \"y\": 90\n    },\n    \"facing=east,cooling=true,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator_cooling_active\",\n      \"y\": 90\n    },\n    \"facing=east,cooling=false,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_heating_active\",\n      \"y\": 90\n    },\n    \"facing=east,cooling=true,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_active\",\n      \"y\": 90\n    },\n\t\"facing=north,cooling=false,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator\"\n    },\n    \"facing=north,cooling=true,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator_cooling_active\"\n    },\n    \"facing=north,cooling=false,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_heating_active\"\n    },\n    \"facing=north,cooling=true,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_active\"\n    },\n\t\"facing=south,cooling=false,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator\",\n      \"y\": 180\n    },\n    \"facing=south,cooling=true,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator_cooling_active\",\n      \"y\": 180\n    },\n    \"facing=south,cooling=false,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_heating_active\",\n      \"y\": 180\n    },\n    \"facing=south,cooling=true,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_active\",\n      \"y\": 180\n    },\n\t\"facing=west,cooling=false,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator\",\n      \"y\": 270\n    },\n    \"facing=west,cooling=true,heating=false\": {\n      \"model\": \"toughasnails:block/thermoregulator_cooling_active\",\n      \"y\": 270\n    },\n    \"facing=west,cooling=false,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_heating_active\",\n      \"y\": 270\n    },\n    \"facing=west,cooling=true,heating=true\": {\n      \"model\": \"toughasnails:block/thermoregulator_active\",\n      \"y\": 270\n    }\n  }\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/blockstates/water_purifier.json",
    "content": "{\n  \"variants\": {\n    \"facing=east,filtering=false\": {\n      \"model\": \"toughasnails:block/water_purifier\",\n      \"y\": 90\n    },\n    \"facing=east,filtering=true\": {\n      \"model\": \"toughasnails:block/water_purifier_filtering\",\n      \"y\": 90\n    },\n    \"facing=north,filtering=false\": {\n      \"model\": \"toughasnails:block/water_purifier\"\n    },\n    \"facing=north,filtering=true\": {\n      \"model\": \"toughasnails:block/water_purifier_filtering\"\n    },\n    \"facing=south,filtering=false\": {\n      \"model\": \"toughasnails:block/water_purifier\",\n      \"y\": 180\n    },\n    \"facing=south,filtering=true\": {\n      \"model\": \"toughasnails:block/water_purifier_filtering\",\n      \"y\": 180\n    },\n    \"facing=west,filtering=false\": {\n      \"model\": \"toughasnails:block/water_purifier\",\n      \"y\": 270\n    },\n    \"facing=west,filtering=true\": {\n      \"model\": \"toughasnails:block/water_purifier_filtering\",\n      \"y\": 270\n    }\n  }\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/cs_cz.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.water_purifier\": \"Vodní filtr\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s se přehřál k smrti\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s se přehřál k smrti, zatímco utíkal před %2$s\",\n  \n  \"effect.toughasnails.thirst\": \"Žízeň\",\n  \"effect.toughasnails.ice_resistance\": \"Leduvzdornost\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Tepelné vylepšení\",\n  \n  \"block.toughasnails.rain_collector\": \"Sběrač dešťové vody\",\n  \"block.toughasnails.water_purifier\": \"Vodní filtr\",\n  \n  \"item.toughasnails.tan_icon\": \"Ikona TAN\",\n  \"item.toughasnails.empty_canteen\": \"Prázdná polní láhev\",\n  \"item.toughasnails.water_canteen\": \"Polní láhev s vodou\",\n  \"item.toughasnails.dirty_water_canteen\": \"Polní láhev s nepřefiltrovanou vodou\",\n  \"item.toughasnails.purified_water_canteen\": \"Polní láhev s přefiltrovanou vodou\",\n  \"item.toughasnails.dirty_water_bottle\": \"Lahvička s nepřefiltrovanou vodou\",\n  \"item.toughasnails.purified_water_bottle\": \"Lahvička s přefiltrovanou vodou\",\n  \"item.toughasnails.wool_helmet\": \"Kápě z vlny\",\n  \"item.toughasnails.wool_chestplate\": \"Kabát z vlny\",\n  \"item.toughasnails.wool_leggings\": \"Kalhoty z vlny\",\n  \"item.toughasnails.wool_boots\": \"Boty z vlny\",\n  \"item.toughasnails.leaf_helmet\": \"Kápě z listí\",\n  \"item.toughasnails.leaf_chestplate\": \"Pončo z listí\",\n  \"item.toughasnails.leaf_leggings\": \"Kalhoty z listí\",\n  \"item.toughasnails.leaf_boots\": \"Boty z listí\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Doznívající lektvar leduvzdornosti\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Doznívající lektvar leduvzdornosti\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Lektvar leduvzdornosti\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Lektvar leduvzdornosti\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Vrhací lektvar leduvzdornosti\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Vrhací lektvar leduvzdornosti\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Šíp leduvzdornosti\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Šíp leduvzdornosti\"\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/de_de.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"Thermoregler\",\n  \"container.toughasnails.water_purifier\": \"Wasserreiniger\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s ist an der Hitze gestorben\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s ist, beim Versuch %2$s zu enkommen, an der Hitze gestorben\",\n  \"death.attack.toughasnails.thirst\": \"%1$s ist verdurstet\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s ist beim Kampf gegen %2$s verdurstet\",\n  \"desc.toughasnails.heating\": \"Aufwärmen\",\n  \"desc.toughasnails.cooling\": \"Kühlen\",\n  \"desc.toughasnails.heating_held\": \"Aufwärmen (Halten)\",\n  \"desc.toughasnails.cooling_held\": \"Kühlen (Halten)\",\n  \"desc.toughasnails.heating_consumed\": \"Aufwärmen (Verbrauchen)\",\n  \"desc.toughasnails.cooling_consumed\": \"Kühlen (Verbrauchen)\",\n  \"desc.toughasnails.heating_trim\": \"Aufwärmen (Rüstungsbesatz)\",\n  \"desc.toughasnails.cooling_trim\": \"Kühlen (Rüstungsbesatz)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Temperaturauswertung anzeigen\",\n  \"debug.temperature_fill.off\": \"Temperaturauswertung: versteckt\",\n  \"debug.temperature_fill.on\": \"Temperaturauswertung: sichtbar\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Klimaresistenz\",\n  \"effect.toughasnails.climate_clemency.description\": \"Neutralisiert die Körpertemperatur für die Dauer. Wird nur vorübergehend gewährt, wenn eine neue Welt erstellt wird (oder beim Respawnen, wenn in den Einstellungen aktiviert).\",\n  \"effect.toughasnails.ice_resistance\": \"Kälteresistenz\",\n  \"effect.toughasnails.ice_resistance.description\": \"Gewährt Immunität gegen Gefrierschäden.\",\n  \"effect.toughasnails.thirst\": \"Durst\",\n  \"effect.toughasnails.thirst.description\": \"Senkt den Durst schneller als normal.\",\n  \"effect.toughasnails.internal_warmth\": \"Innere Wärme\",\n  \"effect.toughasnails.internal_warmth.description\": \"Bietet eine leichte Erhöhung der Körpertemperatur für die Dauer. Verursacht keine Hyperthermie.\",\n  \"effect.toughasnails.internal_chill\": \"Innere Kälte\",\n  \"effect.toughasnails.internal_chill.description\": \"Sorgt für eine leichte Senkung der Körpertemperatur für die Dauer. Verursacht keine Hypothermie.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Thermische Regulierung\",\n  \"enchantment.toughasnails.water_cleansing\": \"Wasserreinigung\",\n  \n  \"block.toughasnails.rain_collector\": \"Regensammler\",\n  \"block.toughasnails.temperature_gauge\": \"Temperaturanzeige\",\n  \"block.toughasnails.thermoregulator\": \"Thermoregler\",\n  \"block.toughasnails.water_purifier\": \"Wasserreiniger\",\n  \n  \"item.toughasnails.apple_juice\": \"Apfelsaft\",\n  \"item.toughasnails.cactus_juice\": \"Kaktussaft\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Chorus-Fruchtsaft\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Kupferne Feldflasche mit schmutzigem Wasser\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Kupferne Feldflasche mit gereinigtem Wasser\",\n  \"item.toughasnails.copper_water_canteen\": \"Kupferne Feldflasche\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Diamant-Feldflasche mit schmutzigem Wasser\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Diamant-Feldflasche mit gereinigtem Wasser\",\n  \"item.toughasnails.diamond_water_canteen\": \"Diamant-Feldflasche\",\n  \"item.toughasnails.dirty_water_bottle\": \"Flasche mit schmutzigem Wasser\",\n  \"item.toughasnails.empty_copper_canteen\": \"Leere Kupfer-Feldflasche\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Leere Diamant-Feldflasche\",\n  \"item.toughasnails.empty_gold_canteen\": \"Leere Gold-Feldflasche\",\n  \"item.toughasnails.empty_iron_canteen\": \"Leere Eisen-Feldflasche\",\n  \"item.toughasnails.empty_leather_canteen\": \"Leere Leder-Feldflasche\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Leere Netherit-Feldflasche\",\n  \"item.toughasnails.glow_berry_juice\": \"Leuchtbeerensaft\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Goldene Feldflasche mit schmutzigem Wasser\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Goldene Feldflasche mit gereinigtem Wasser\",\n  \"item.toughasnails.gold_water_canteen\": \"Goldene Feldflasche\",\n  \"item.toughasnails.ice_cream\": \"Eiscreme\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Eiserne Feldflasche mit schmutzigem Wasser\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Eiserne Feldflasche mit gereinigtem Wasser\",\n  \"item.toughasnails.iron_water_canteen\": \"Eiserne Feldflasche\",\n  \"item.toughasnails.leaf_boots\": \"Blätter-Schuhe\",\n  \"item.toughasnails.leaf_chestplate\": \"Blätter-Poncho\",\n  \"item.toughasnails.leaf_helmet\": \"Blätter-Schleier\",\n  \"item.toughasnails.leaf_leggings\": \"Blätter-Beinschutz\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Leder Feldflasche mit schmutzigem Wasser\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Leder Feldflasche mit gereinigtem Wasser\",\n  \"item.toughasnails.leather_water_canteen\": \"Leder Feldflasche\",\n  \"item.toughasnails.melon_juice\": \"Melonensaft\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Netherite-Feldflasche mit schmutzigem Wasser\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Netherite-Feldflasche mit gereinigtem Wasser\",\n  \"item.toughasnails.netherite_water_canteen\": \"Netherite-Feldflasche\",\n  \"item.toughasnails.pumpkin_juice\": \"Kürbissaft\",\n  \"item.toughasnails.purified_water_bottle\": \"Flasche mit gereinigtem Wasser\",\n  \"item.toughasnails.sweet_berry_juice\": \"Süßbeerensaft\",\n  \"item.toughasnails.tan_icon\": \"TAN-Symbol\",\n  \"item.toughasnails.thermometer\": \"Thermometer\",\n  \"item.toughasnails.wool_boots\": \"Wollstiefel\",\n  \"item.toughasnails.wool_chestplate\": \"Wollhemd\",\n  \"item.toughasnails.wool_helmet\": \"Wollhelm\",\n  \"item.toughasnails.wool_leggings\": \"Wollhose\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Verweiltrank der Kälteresistenz\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Verweiltrank der Kälteresistenz\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Trank der Kälteresistenz\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Trank der Kälteresistenz\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Wurftrank der Kälteresistenz\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Wurftrank der Kälteresistenz\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Pfeil der Kälteresistenz\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Pfeil der Kälteresistenz\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Klimaforscher\",\n  \"entity.minecraft.villager.climatologist\": \"Klimaforscher\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/en_us.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"Thermoregulator\",\n  \"container.toughasnails.water_purifier\": \"Water Purifier\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s overheated to death\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s overheated to death while trying to escape %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s died of thirst\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s died of thirst while fighting %2$s\",\n  \"desc.toughasnails.heating\": \"Heating\",\n  \"desc.toughasnails.cooling\": \"Cooling\",\n  \"desc.toughasnails.heating_held\": \"Heating (Held)\",\n  \"desc.toughasnails.cooling_held\": \"Cooling (Held)\",\n  \"desc.toughasnails.heating_consumed\": \"Heating (Consumed)\",\n  \"desc.toughasnails.cooling_consumed\": \"Cooling (Consumed)\",\n  \"desc.toughasnails.heating_trim\": \"Heating (Trim)\",\n  \"desc.toughasnails.cooling_trim\": \"Cooling (Trim)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Show temperature fill\",\n  \"debug.temperature_fill.off\": \"Temperature fill: hidden\",\n  \"debug.temperature_fill.on\": \"Temperature fill: shown\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Climate Clemency\",\n  \"effect.toughasnails.climate_clemency.description\": \"Neutralizes body temperature for the duration. Only granted temporarily when creating a new world (Or when respawning if enabled in the config).\",\n  \"effect.toughasnails.ice_resistance\": \"Ice Resistance\",\n  \"effect.toughasnails.ice_resistance.description\": \"Grants immunity to freezing damage.\",\n  \"effect.toughasnails.thirst\": \"Thirst\",\n  \"effect.toughasnails.thirst.description\": \"Lowers thirst at a faster rate than normal.\",\n  \"effect.toughasnails.internal_warmth\": \"Internal Warmth\",\n  \"effect.toughasnails.internal_warmth.description\": \"Provides a slight increase in body temperature for the duration. Will not cause hyperthermia.\",\n  \"effect.toughasnails.internal_chill\": \"Internal Chill\",\n  \"effect.toughasnails.internal_chill.description\": \"Provides a slight decrease in body temperature for the duration. Will not cause hypothermia.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Thermal Tuning\",\n  \"enchantment.toughasnails.water_cleansing\": \"Water Cleansing\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"A Chestplate with Thermal Tuning will completely neutralize the player's body temperature, regardless of the current environmental temperature.\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"A Canteen with Water Cleansing will automatically purify any water put into it.\",\n  \n  \"block.toughasnails.rain_collector\": \"Rain Collector\",\n  \"block.toughasnails.temperature_gauge\": \"Temperature Gauge\",\n  \"block.toughasnails.thermoregulator\": \"Thermoregulator\",\n  \"block.toughasnails.water_purifier\": \"Water Purifier\",\n  \n  \"item.toughasnails.apple_juice\": \"Apple Juice\",\n  \"item.toughasnails.cactus_juice\": \"Cactus Juice\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Chorus Fruit Juice\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Copper Dirty Water Canteen\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Copper Purified Water Canteen\",\n  \"item.toughasnails.copper_water_canteen\": \"Copper Water Canteen\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Diamond Dirty Water Canteen\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Diamond Purified Water Canteen\",\n  \"item.toughasnails.diamond_water_canteen\": \"Diamond Water Canteen\",\n  \"item.toughasnails.dirty_water_bottle\": \"Dirty Water Bottle\",\n  \"item.toughasnails.empty_copper_canteen\": \"Empty Copper Canteen\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Empty Diamond Canteen\",\n  \"item.toughasnails.empty_gold_canteen\": \"Empty Gold Canteen\",\n  \"item.toughasnails.empty_iron_canteen\": \"Empty Iron Canteen\",\n  \"item.toughasnails.empty_leather_canteen\": \"Empty Leather Canteen\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Empty Netherite Canteen\",\n  \"item.toughasnails.glow_berry_juice\": \"Glow Berry Juice\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Gold Dirty Water Canteen\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Gold Purified Water Canteen\",\n  \"item.toughasnails.gold_water_canteen\": \"Gold Water Canteen\",\n  \"item.toughasnails.ice_cream\": \"Ice Cream\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Iron Dirty Water Canteen\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Iron Purified Water Canteen\",\n  \"item.toughasnails.iron_water_canteen\": \"Iron Water Canteen\",\n  \"item.toughasnails.leaf_boots\": \"Leaf Greaves\",\n  \"item.toughasnails.leaf_chestplate\": \"Leaf Poncho\",\n  \"item.toughasnails.leaf_helmet\": \"Leaf Veil\",\n  \"item.toughasnails.leaf_leggings\": \"Leaf Pants\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Leather Dirty Water Canteen\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Leather Purified Water Canteen\",\n  \"item.toughasnails.leather_water_canteen\": \"Leather Water Canteen\",\n  \"item.toughasnails.melon_juice\": \"Melon Juice\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Netherite Dirty Water Canteen\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Netherite Purified Water Canteen\",\n  \"item.toughasnails.netherite_water_canteen\": \"Netherite Water Canteen\",\n  \"item.toughasnails.pumpkin_juice\": \"Pumpkin Juice\",\n  \"item.toughasnails.purified_water_bottle\": \"Purified Water Bottle\",\n  \"item.toughasnails.sweet_berry_juice\": \"Sweet Berry Juice\",\n  \"item.toughasnails.tan_icon\": \"TAN Icon\",\n  \"item.toughasnails.thermometer\": \"Thermometer\",\n  \"item.toughasnails.wool_boots\": \"Wool Boots\",\n  \"item.toughasnails.wool_chestplate\": \"Wool Parka\",\n  \"item.toughasnails.wool_helmet\": \"Wool Hood\",\n  \"item.toughasnails.wool_leggings\": \"Wool Pants\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Lingering Potion of Ice Resistance\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Lingering Potion of Ice Resistance\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Potion of Ice Resistance\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Potion of Ice Resistance\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Splash Potion of Ice Resistance\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Splash Potion of Ice Resistance\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Arrow of Ice Resistance\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Arrow of Ice Resistance\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Climatologist\",\n  \"entity.minecraft.villager.climatologist\": \"Climatologist\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/es_es.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n\n  \"container.toughasnails.water_purifier\": \"Purificador de agua\",\n  \"effect.toughasnails.thirst\": \"Sed\",\n\n  \"item.toughasnails.tan_icon\": \"Icono TAN\",\n  \"item.toughasnails.empty_canteen\": \"Cantimplora vacía\",\n  \"item.toughasnails.water_canteen\": \"Cantimplora con agua\",\n  \"item.toughasnails.dirty_water_canteen\": \"Cantimplora con agua sucia\",\n  \"item.toughasnails.purified_water_canteen\": \"Cantimplora con agua purificada\",\n  \"item.toughasnails.dirty_water_bottle\": \"Botella con agua sucia\",\n  \"item.toughasnails.purified_water_bottle\": \"Botella con agua purificada\",\n\n  \"block.toughasnails.rain_collector\": \"Colector de lluvia\",\n  \"block.toughasnails.water_purifier\": \"Purificador de agua\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/fr_fr.json",
    "content": "{\n  \"block.toughasnails.rain_collector\": \"Collecteur de pluie\",\n  \"block.toughasnails.water_purifier\": \"Épurateur d'Eau\",\n  \"block.toughasnails.temperature_gauge\": \"Capteur de température\",\n  \"block.toughasnails.thermoregulator\": \"Thermorégulateur\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Potion persistante de résistance au gel\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Potion persistante de résistance au gel\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Potion de résistance au gel\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Potion de résistance au gel\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Potion jetable de résistance au gel\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Potion jetable de résistance au gel\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Flèche de résistance au gel\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Flèche de résistance au gel\",\n  \"item.toughasnails.tan_icon\": \"Icône de TAN\",\n  \"item.toughasnails.empty_canteen\": \"Gourde vide\",\n  \"item.toughasnails.water_canteen\": \"Gourde d'Eau\",\n  \"item.toughasnails.dirty_water_canteen\": \"Gourde d'Eau sale\",\n  \"item.toughasnails.purified_water_canteen\": \"Gourde d'Eau purifié\",\n  \"item.toughasnails.dirty_water_bottle\": \"Fiole d'Eau sale\",\n  \"item.toughasnails.purified_water_bottle\": \"Fiole d'Eau purifié\",\n  \"item.toughasnails.wool_helmet\": \"Capuche en laine\",\n  \"item.toughasnails.wool_chestplate\": \"Polaire en laine\",\n  \"item.toughasnails.wool_leggings\": \"Pantalon en laine\",\n  \"item.toughasnails.wool_boots\": \"Bottes en laine\",\n  \"item.toughasnails.apple_juice\": \"Jus de pomme\",\n  \"item.toughasnails.cactus_juice\": \"Jus de cactus\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Jus de chorus\",\n  \"item.toughasnails.glow_berry_juice\": \"Jus de baies lumineuses\",\n  \"item.toughasnails.leaf_boots\": \"Bottes feuilleté\",\n  \"item.toughasnails.leaf_chestplate\": \"Poncho feuilleté\",\n  \"item.toughasnails.leaf_helmet\": \"Voile feuilleté\",\n  \"item.toughasnails.leaf_leggings\": \"Pantalon feuilleté\",\n  \"item.toughasnails.melon_juice\": \"Jus de pasteque\",\n  \"item.toughasnails.pumpkin_juice\": \"Jus de citrouille\",\n  \"item.toughasnails.charc_os\": \"Soupe chauffante\",\n  \"item.toughasnails.sweet_berry_juice\": \"Jus de baies sucrées\",\n  \"item.toughasnails.ice_cream\": \"Crème glacée\",\n  \"item.toughasnails.empty_copper_canteen\": \"Gourde en cuivre vide\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Gourde d'Eau sale en cuivre\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Gourde d'Eau purifié en cuivre\",\n  \"item.toughasnails.copper_water_canteen\": \"Gourde d'Eau en cuivre\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Gourde en diamant vide\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Gourde d'Eau sale en diamant\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Gourde d'Eau purifié en diamant\",\n  \"item.toughasnails.diamond_water_canteen\": \"Gourde d'Eau en diamant\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Gourde en netherite vide\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Gourde d'Eau sale en netherite\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Gourde d'Eau purifié en netherite\",\n  \"item.toughasnails.netherite_water_canteen\": \"Gourde d'Eau en netherite\",\n  \"item.toughasnails.empty_gold_canteen\": \"Gourde en or vide\",  \n  \"item.toughasnails.gold_dirty_water_canteen\": \"Gourde d'Eau sale en or\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Gourde d'Eau purifié en or\",\n  \"item.toughasnails.gold_water_canteen\": \"Gourde d'Eau en or\",\n  \"item.toughasnails.empty_iron_canteen\": \"Gourde en fer vide\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Gourde d'Eau sale en fer\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Gourde d'Eau purifié en fer\",\n  \"item.toughasnails.iron_water_canteen\": \"Gourde d'Eau en fer\",\n  \"item.toughasnails.empty_leather_canteen\": \"Gourde en cuir vide\",  \n  \"item.toughasnails.leather_dirty_water_canteen\": \"Gourde d'Eau sale en cuir\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Gourde d'Eau purifié en cuir\",\n  \"item.toughasnails.leather_water_canteen\": \"Gourde d'Eau en cuir\",\n  \"item.toughasnails.thermometer\": \"Thermomètre\",\n  \n  \"container.toughasnails.water_purifier\": \"Épurateur d'Eau\",\n  \"container.toughasnails.thermoregulator\": \"Thermorégulateur\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s est mort d'hyperthermie\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s overheated to death while trying to escape %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s est mort de soif\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s est mort de soif en combattant un ou une %2$s\",\n\n  \"desc.toughasnails.heating\": \"Réchauffement\",\n  \"desc.toughasnails.cooling\": \"Refroidissement\",\n  \"desc.toughasnails.heating_held\": \"Réchauffement (Maintenu)\",\n  \"desc.toughasnails.cooling_held\": \"Refroidissement (Maintenu)\",\n  \"desc.toughasnails.heating_consumed\": \"Réchauffement (Consommé)\",\n  \"desc.toughasnails.cooling_consumed\": \"Refroidissement (Consommé)\",\n  \"desc.toughasnails.heating_trim\": \"Réchauffement (Garniture)\",\n  \"desc.toughasnails.cooling_trim\": \"Refroidissement (Garniture)\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Clémence climatique\",\n  \"effect.toughasnails.climate_clemency.description\": \"Neutralise la température du corps pour une durée déterminée. N'est accordé que temporairement lors de la création d'un nouveau monde (ou lors du respawning s'il est activé dans la configuration).\",\n  \"effect.toughasnails.ice_resistance\": \"Résistance au froid\",\n  \"effect.toughasnails.ice_resistance.description\": \"Confère une immunité aux dégâts de froid.\",\n  \"effect.toughasnails.thirst\": \"Soif\",\n  \"effect.toughasnails.thirst.description\": \"Réduit la soif plus rapidement que la normale.\",\n  \"effect.toughasnails.internal_warmth\": \"Chaleur interne\",\n  \"effect.toughasnails.internal_warmth.description\": \"Permet une légère augmentation de la température corporelle pendant la durée de l'effet. Ne provoque pas d'hyperthermie.\",\n  \"effect.toughasnails.internal_chill\": \"Refroidissement interne\",\n  \"effect.toughasnails.internal_chill.description\": \"Permet une légère baisse de la température corporelle pendant toute la durée de l'effet. Ne provoque pas d'hypothermie.\",\n  \n  \"enchantment.toughasnails.thermal_tuning\": \"Thermiglage\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"Régule automatiquement la température corporelle.\",\n  \"enchantment.toughasnails.water_cleansing\": \"Eau pure\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"Filtre automatiquement l'eau d'une gourde.\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Climatologue\",\n  \"entity.minecraft.villager.climatologist\": \"Climatologue\",\n\n  \"itemGroup.toughasnails\": \"Tough As Nails\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/it_it.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.water_purifier\": \"Purificatore d'acqua\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s si è surriscaldato a morte\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s si è surriscaldato a morte mentre cercava di scappare da %2$s\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Clemenza Climatica\",\n  \"effect.toughasnails.ice_resistance\": \"Resistenza al Freddo\",\n  \"effect.toughasnails.thirst\": \"Sete\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Sintonizzazione Termica\",\n  \n  \"block.toughasnails.rain_collector\": \"Collettore d'acqua\",\n  \"block.toughasnails.water_purifier\": \"Purificatore d'acqua\",\n  \n  \"item.toughasnails.apple_juice\": \"Succo di Mela\",\n  \"item.toughasnails.cactus_juice\": \"Succo di Cactus\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Succo di Chorus\",\n  \"item.toughasnails.dirty_water_bottle\": \"Bottiglia d'acqua sporca\",\n  \"item.toughasnails.dirty_water_canteen\": \"Borraccia d'acqua sporca\",\n  \"item.toughasnails.empty_canteen\": \"Borraccia Vuota\",\n  \"item.toughasnails.glow_berry_juice\": \"Succo di Bacca Luminosa\",\n  \"item.toughasnails.leaf_boots\": \"Stivali di Foglie\",\n  \"item.toughasnails.leaf_chestplate\": \"Mantello di Foglie\",\n  \"item.toughasnails.leaf_helmet\": \"Velo di Foglie\",\n  \"item.toughasnails.leaf_leggings\": \"Pantaloni di Foglie\",\n  \"item.toughasnails.melon_juice\": \"Succo di Melone\",\n  \"item.toughasnails.pumpkin_juice\": \"Succo di Zucca\",\n  \"item.toughasnails.purified_water_bottle\": \"Bottiglia d'acqua purificata\",\n  \"item.toughasnails.purified_water_canteen\": \"Borraccia d'acqua purificata\",\n  \"item.toughasnails.sweet_berry_juice\": \"Succo di Bacca Dolce\",\n  \"item.toughasnails.tan_icon\": \"Icona TAN\",\n  \"item.toughasnails.water_canteen\": \"Borraccia d'acqua\",\n  \"item.toughasnails.wool_boots\": \"Stivali di Lana\",\n  \"item.toughasnails.wool_chestplate\": \"Giubbotto di Lana\",\n  \"item.toughasnails.wool_helmet\": \"Cappuccio di Lana\",\n  \"item.toughasnails.wool_leggings\": \"Pantaloni di Lana\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Pozione di resistenza al freddo persistente\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Pozione di resistenza al freddo persistente\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Pozione di resistenza al freddo\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Pozione di resistenza al freddo\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Pozione da lancio di resistenza al freddo\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Pozione da lancio di resistenza al freddo\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Freccia di resistenza al freddo\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Freccia di resistenza al freddo\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/ja_jp.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.water_purifier\": \"浄水器\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$sは暑さに耐えられなくなった\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$sは%2$sから逃れようとして体温が上がりすぎた\",\n  \n  \"effect.toughasnails.climate_clemency\": \"気温緩和\",\n  \"effect.toughasnails.ice_resistance\": \"寒さ耐性\",\n  \"effect.toughasnails.thirst\": \"渇き\",\n  \"enchantment.toughasnails.thermal_tuning\": \"温度調整\",\n  \n  \"block.toughasnails.rain_collector\": \"雨水タンク\",\n  \"block.toughasnails.water_purifier\": \"浄水器\",\n  \n  \"item.toughasnails.apple_juice\": \"リンゴジュース\",\n  \"item.toughasnails.cactus_juice\": \"サボテンジュース\",\n  \"item.toughasnails.chorus_fruit_juice\": \"コーラスフルーツジュース\",\n  \"item.toughasnails.dirty_water_bottle\": \"汚れた水入り瓶\",\n  \"item.toughasnails.dirty_water_canteen\": \"汚れた水入り水筒\",\n  \"item.toughasnails.empty_canteen\": \"水筒\",\n  \"item.toughasnails.glow_berry_juice\": \"グロウベリージュース\",\n  \"item.toughasnails.leaf_boots\": \"葉のブーツ\",\n  \"item.toughasnails.leaf_chestplate\": \"葉のコート\",\n  \"item.toughasnails.leaf_helmet\": \"葉の帽子\",\n  \"item.toughasnails.leaf_leggings\": \"葉のズボン\",\n  \"item.toughasnails.melon_juice\": \"スイカジュース\",\n  \"item.toughasnails.pumpkin_juice\": \"カボチャジュース\",\n  \"item.toughasnails.purified_water_bottle\": \"浄水入り瓶\",\n  \"item.toughasnails.purified_water_canteen\": \"浄水入り水筒\",\n  \"item.toughasnails.sweet_berry_juice\": \"スイートベリージュース\",\n  \"item.toughasnails.tan_icon\": \"TANアイコン\",\n  \"item.toughasnails.water_canteen\": \"水入り水筒\",\n  \"item.toughasnails.wool_boots\": \"羊毛のブーツ\",\n  \"item.toughasnails.wool_chestplate\": \"羊毛のコート\",\n  \"item.toughasnails.wool_helmet\": \"羊毛の帽子\",\n  \"item.toughasnails.wool_leggings\": \"羊毛のズボン\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"耐寒の残留ポーション\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"耐寒の残留ポーション\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"耐寒のポーション\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"耐寒のポーション\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"耐寒のスプラッシュポーション\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"耐寒のスプラッシュポーション\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"耐寒の矢\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"耐寒の矢\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/ko_kr.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"온도 조절기\",\n  \"container.toughasnails.water_purifier\": \"정수기\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s이(가) 열사병으로 죽었습니다\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%2$s를 탈출하려고 시도하는 동안 %1$s이(가) 열사병으로 죽었습니다\",\n  \"death.attack.toughasnails.thirst\": \"%1$s이(가) 탈수로 죽었습니다\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s이(가) %2$s과(와) 싸우는 도중 탈수로 죽었습니다\",\n  \"desc.toughasnails.heating\": \"따뜻함\",\n  \"desc.toughasnails.cooling\": \"시원함\",\n  \"desc.toughasnails.heating_held\": \"따뜻함 (손에 들때)\",\n  \"desc.toughasnails.cooling_held\": \"시원함 (손에 들때)\",\n  \"desc.toughasnails.heating_consumed\": \"따뜻함 (섭취 시)\",\n  \"desc.toughasnails.cooling_consumed\": \"시원함 (섭취 시)\",\n  \"desc.toughasnails.heating_trim\": \"따뜻함 (장식 시)\",\n  \"desc.toughasnails.cooling_trim\": \"시원함 (장식 시)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = 온도 채우기 표시\",\n  \"debug.temperature_fill.off\": \"온도 채우기: 숨김\",\n  \"debug.temperature_fill.on\": \"온도 채우기: 표시\",\n  \n  \"effect.toughasnails.climate_clemency\": \"기후 온화\",\n  \"effect.toughasnails.climate_clemency.description\": \"지속 시간 동안 체온을 중화합니다. 새로운 세계를 만들 때(또는 config에서 활성화된 경우 리스폰할 때) 일시적으로만 부여됩니다.\",\n  \"effect.toughasnails.ice_resistance\": \"얼음 저항\",\n  \"effect.toughasnails.ice_resistance.description\": \"동결 피해에 대한 면역성을 부여합니다.\",\n  \"effect.toughasnails.thirst\": \"탈수\",\n  \"effect.toughasnails.thirst.description\": \"평소보다 빠른 속도로 수분을 소모합니다.\",\n  \"effect.toughasnails.internal_warmth\": \"체내 따뜻함\",\n  \"effect.toughasnails.internal_warmth.description\": \"지속 시간 동안 체온을 약간 상승시킵니다. 열사병을 일으키지 않습니다.\",\n  \"effect.toughasnails.internal_chill\": \"체내 시원함\",\n  \"effect.toughasnails.internal_chill.description\": \"지속 시간 동안 체온을 낮춥니다. 동결 피해를 일으키지 않습니다.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"온도 조절\",\n  \"enchantment.toughasnails.water_cleansing\": \"물 정화\",\n  \n  \"block.toughasnails.rain_collector\": \"빗물받이\",\n  \"block.toughasnails.temperature_gauge\": \"온도 측정기\",\n  \"block.toughasnails.thermoregulator\": \"온도 조절기\",\n  \"block.toughasnails.water_purifier\": \"정수기\",\n  \n  \"item.toughasnails.apple_juice\": \"사과 주스\",\n  \"item.toughasnails.cactus_juice\": \"선인장 주스\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"후렴과 주스\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"구리 오염된 물통\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"구리 정제된 물통\",\n  \"item.toughasnails.copper_water_canteen\": \"구리 물통\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"다이아몬드 오염된 물통\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"다이아몬드 정제된 물통\",\n  \"item.toughasnails.diamond_water_canteen\": \"다이아몬드 물통\",\n  \"item.toughasnails.dirty_water_bottle\": \"오염된 물병\",\n  \"item.toughasnails.empty_copper_canteen\": \"빈 구리 물통\",\n  \"item.toughasnails.empty_diamond_canteen\": \"빈 다이아몬드 물통\",\n  \"item.toughasnails.empty_gold_canteen\": \"빈 금 물통\",\n  \"item.toughasnails.empty_iron_canteen\": \"빈 철 물통\",\n  \"item.toughasnails.empty_leather_canteen\": \"빈 가죽 물통\",\n  \"item.toughasnails.empty_netherite_canteen\": \"빈 네더라이트 물통\",\n  \"item.toughasnails.glow_berry_juice\": \"발광 열매 주스\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"금 오염된 물통\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"금 정제된 물통\",\n  \"item.toughasnails.gold_water_canteen\": \"금 물통\",\n  \"item.toughasnails.ice_cream\": \"아이스크림\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"철 오염된 물통\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"철 정제된 물통\",\n  \"item.toughasnails.iron_water_canteen\": \"철 물통\",\n  \"item.toughasnails.leaf_helmet\": \"잎사귀 베일\",\n  \"item.toughasnails.leaf_chestplate\": \"잎사귀 판초\",\n  \"item.toughasnails.leaf_leggings\": \"잎사귀 바지\",\n  \"item.toughasnails.leaf_boots\": \"잎사귀 그리브\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"가죽 오염된 물통\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"가죽 정제된 물통\",\n  \"item.toughasnails.leather_water_canteen\": \"가죽 물통\",\n  \"item.toughasnails.melon_juice\": \"멜론 주스\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"네더라이트 오염된 물통\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"네더라이트 정제된 물통\",\n  \"item.toughasnails.netherite_water_canteen\": \"네더라이트 물통\",\n  \"item.toughasnails.pumpkin_juice\": \"호박 주스\",\n  \"item.toughasnails.purified_water_bottle\": \"정제된 물병\",\n  \"item.toughasnails.sweet_berry_juice\": \"달콤한 열매 주스\",\n  \"item.toughasnails.tan_icon\": \"TAN 아이콘\",\n  \"item.toughasnails.thermometer\": \"온도계\",\n  \"item.toughasnails.wool_helmet\": \"양털 모자\",\n  \"item.toughasnails.wool_chestplate\": \"양털 파카\",\n  \"item.toughasnails.wool_leggings\": \"양털 바지\",\n  \"item.toughasnails.wool_boots\": \"양털 부츠\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"잔류형 얼음 저항의 물약\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"잔류형 얼음 저항의 물약 II\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"얼음 저항의 물약\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"얼음 저항의 물약 II\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"투척용 얼음 저항의 물약\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"투척용 얼음 저항의 물약 II\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"얼음 저항의 화살\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"얼음 저항의 화살 II\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"기후학자\",\n  \"entity.minecraft.villager.climatologist\": \"기후학자\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/lol_us.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tof as nayls\",\n  \n  \"container.toughasnails.water_purifier\": \"Watr cleanr\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s got 2 hot\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s got 2 hot wile runin from %2$s\",\n  \n  \"effect.toughasnails.thirst\": \"Thirst\",\n  \"effect.toughasnails.ice_resistance\": \"Ice resistanse\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Not hot or cold\",\n  \n  \"block.toughasnails.rain_collector\": \"Watr from sky colectr\",\n  \"block.toughasnails.water_purifier\": \"Watr cleanr\",\n  \n  \"item.toughasnails.tan_icon\": \"TAN Icon\",\n  \"item.toughasnails.empty_canteen\": \"Watr holdr wif nofin innit\",\n  \"item.toughasnails.water_canteen\": \"Watr holdr wif watr innit\",\n  \"item.toughasnails.dirty_water_canteen\": \"Dirty watr holdr\",\n  \"item.toughasnails.purified_water_canteen\": \"Cleen watr holdr\",\n  \"item.toughasnails.dirty_water_bottle\": \"Dirty watr botle\",\n  \"item.toughasnails.purified_water_bottle\": \"Cleen watr botle\",\n  \"item.toughasnails.wool_helmet\": \"Fluffy hood\",\n  \"item.toughasnails.wool_chestplate\": \"Fluffy coat\",\n  \"item.toughasnails.wool_leggings\": \"Fluffy pantz\",\n  \"item.toughasnails.wool_boots\": \"Fluffy pawz\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Lastin ice resistanse poshun\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Lastin ice resistanse poshun\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Ice resistanse poshun\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Ice resistanse poshun\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Splash ice resistanse poshun\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Splash ice resistanse poshun\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Pointy thing of ice resistanse\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Pointy thing of ice resistanse\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/nn_no.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"Termoregulator\",\n  \"container.toughasnails.water_purifier\": \"Vassrensar\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s overoppheita til daude\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s overoppheita til daude i forsøket i å røme frå %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s døydde av tørst\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s døydde av tørst i kampen mot %2$s\",\n  \"desc.toughasnails.heating\": \"Oppvarming\",\n  \"desc.toughasnails.cooling\": \"Avkjøling\",\n  \"desc.toughasnails.heating_held\": \"Oppvarming (heldt)\",\n  \"desc.toughasnails.cooling_held\": \"Avkjøling (heldt)\",\n  \"desc.toughasnails.heating_consumed\": \"Oppvarming (oppbrukt)\",\n  \"desc.toughasnails.cooling_consumed\": \"Avkjøling (oppbrukt)\",\n  \"desc.toughasnails.heating_trim\": \"Oppvarming (trim)\",\n  \"desc.toughasnails.cooling_trim\": \"Avkjøling (trim)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Vis temperaturfylling\",\n  \"debug.temperature_fill.off\": \"Temperaturfylling: skjult\",\n  \"debug.temperature_fill.on\": \"Temperaturfylling: synleg\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Klimanåde\",\n  \"effect.toughasnails.climate_clemency.description\": \"Nøytraliserer kroppstemperaturen for lengda. Berre gjeve mellombels når du skaper ei ny verd (eller viss attoppståing er slått på i konfigurasjonen).\",\n  \"effect.toughasnails.ice_resistance\": \"Ismotstand\",\n  \"effect.toughasnails.ice_resistance.description\": \"Gjev immunitet mot fryseskadar.\",\n  \"effect.toughasnails.thirst\": \"Tørst\",\n  \"effect.toughasnails.thirst.description\": \"Senkar tørsten raskare enn normalt.\",\n  \"effect.toughasnails.internal_warmth\": \"Indre varme\",\n  \"effect.toughasnails.internal_warmth.description\": \"Gjev ei lita auke av kroppstemperatur for lengda. Vil ikkje gje hypertermi\",\n  \"effect.toughasnails.internal_chill\": \"Indre kulde\",\n  \"effect.toughasnails.internal_chill.description\": \"Gjev ein liten reduksjon i kroppstemperaturen for lengda. Vil ikkje gje hypotermi.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Termisk tuning\",\n  \"enchantment.toughasnails.water_cleansing\": \"Vassrensing\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"Ei brystplate med termisk tuning vil nøytralisere spelaren sin kroppstemperatur, uansett noverande miljøtemperatur.\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"Ei vassflaske med vassreinsing vil automatisk reinse vatn som vert fylt opp i den.\",\n  \n  \"block.toughasnails.rain_collector\": \"Regnsamlar\",\n  \"block.toughasnails.temperature_gauge\": \"Temperaturmålar\",\n  \"block.toughasnails.thermoregulator\": \"Termisk regulator\",\n  \"block.toughasnails.water_purifier\": \"Vassreinsar\",\n  \n  \"item.toughasnails.apple_juice\": \"Eplejus\",\n  \"item.toughasnails.cactus_juice\": \"Kaktusjus\",\n  \"item.toughasnails.charc_os\": \"Kjark-O-ar\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Korfruktjus\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Skiten kopparvassflaske\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Reinsa kopparvassflaske\",\n  \"item.toughasnails.copper_water_canteen\": \"Koparvassflaske\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Skiten diamantvassflaske\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Reinsa diamantvassflaske\",\n  \"item.toughasnails.diamond_water_canteen\": \"Diamantvassflaske\",\n  \"item.toughasnails.dirty_water_bottle\": \"Skiten vassflaske\",\n  \"item.toughasnails.empty_copper_canteen\": \"Tom koparvassflaske\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Tom diamantvassflaske\",\n  \"item.toughasnails.empty_gold_canteen\": \"Tom gullvassflaske\",\n  \"item.toughasnails.empty_iron_canteen\": \"Tom jarnvassflaske\",\n  \"item.toughasnails.empty_leather_canteen\": \"Tom lêrvassflaske\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Tom netherittvassflaske\",\n  \"item.toughasnails.glow_berry_juice\": \"Glødebærjus\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Skiten gullvassflaske\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Reinsa gullvassflaske\",\n  \"item.toughasnails.gold_water_canteen\": \"Gullvassflaske\",\n  \"item.toughasnails.ice_cream\": \"Iskrem\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Skiten jarnvassflaske\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Reinsa jarnvassflaske\",\n  \"item.toughasnails.iron_water_canteen\": \"Jarnvassflaske\",\n  \"item.toughasnails.leaf_boots\": \"Lauvstøvlar\",\n  \"item.toughasnails.leaf_chestplate\": \"Lauvponcho\",\n  \"item.toughasnails.leaf_helmet\": \"Lauvhette\",\n  \"item.toughasnails.leaf_leggings\": \"Lauvbrok\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Skiten lêrvassflaske\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Reinsa lêrvassflaske\",\n  \"item.toughasnails.leather_water_canteen\": \"Lêrvassflaske\",\n  \"item.toughasnails.melon_juice\": \"Melonjus\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Skiten netherittvassflaske\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Reinsa netherittvassflaske\",\n  \"item.toughasnails.netherite_water_canteen\": \"Netherittvassflaske\",\n  \"item.toughasnails.pumpkin_juice\": \"Graskarjus\",\n  \"item.toughasnails.purified_water_bottle\": \"Reinsa vassflaske\",\n  \"item.toughasnails.sweet_berry_juice\": \"Søt bærjus\",\n  \"item.toughasnails.tan_icon\": \"TAN-ikon\",\n  \"item.toughasnails.thermometer\": \"Termometer\",\n  \"item.toughasnails.wool_boots\": \"Ullstøvlar\",\n  \"item.toughasnails.wool_chestplate\": \"Ulltrøye\",\n  \"item.toughasnails.wool_helmet\": \"Ullhette\",\n  \"item.toughasnails.wool_leggings\": \"Ullbrok\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Dvelande ismotstandsbrygg\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Dvelande ismotstandsbrygg\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Ismotstandsbrygg\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Ismotstandsbrygg\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Kasteleg ismotstandsbrygg\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Kasteleg ismotstandsbrygg\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Ismotstandspil\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Ismotstandspil\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Klimatolog\",\n  \"entity.minecraft.villager.climatologist\": \"Klimatolog\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/pl_pl.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"Termoregulator\",\n  \"container.toughasnails.water_purifier\": \"Oczyszczacz wody\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s przegrzał się na śmierć\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s rozgrzał się do śmierci podczas próby ucieczki od %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s zmarł z pragnienia\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s zmarł z pragnienia podczas walki z %2$s\",\n  \"desc.toughasnails.heating\": \"Ogrzewanie\",\n  \"desc.toughasnails.cooling\": \"Chłodzenie\",\n  \"desc.toughasnails.heating_held\": \"Ogrzewanie (Trzymane)\",\n  \"desc.toughasnails.cooling_held\": \"Chłodzenie (Trzymane)\",\n  \"desc.toughasnails.heating_consumed\": \"Ogrzewanie (Zużyte)\",\n  \"desc.toughasnails.cooling_consumed\": \"Chłodzenie (Zużyte)\",\n  \"desc.toughasnails.heating_trim\": \"Ogrzewanie (Wykończenie)\",\n  \"desc.toughasnails.cooling_trim\": \"Chłodzenie (Wykończenie)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Pokaż wypełnienie temperatury\",\n  \"debug.temperature_fill.off\": \"Wypełnienie temperatury: ukryte\",\n  \"debug.temperature_fill.on\": \"Wypełnienie temperatury: pokazane\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Łaskawość klimatyczna\",\n  \"effect.toughasnails.climate_clemency.description\": \"Neutralizuje temperaturę ciała na czas. Przyznawane tylko tymczasowo podczas tworzenia nowego świata (lub podczas odradzania się, jeśli jest to włączone w konfiguracji).\",\n  \"effect.toughasnails.ice_resistance\": \"Odporność na lód\",\n  \"effect.toughasnails.ice_resistance.description\": \"Zapewnia odporność na obrażenia związane z zamarzaniem.\",\n  \"effect.toughasnails.thirst\": \"Pragnienie\",\n  \"effect.toughasnails.thirst.description\": \"Zmniejsza pragnienie w szybszym tempie niż zwykle.\",\n  \"effect.toughasnails.internal_warmth\": \"Wewnętrzne ciepło\",\n  \"effect.toughasnails.internal_warmth.description\": \"Zapewnia nieznaczny wzrost temperatury ciała na czas. Nie powoduje hipertermii.\",\n  \"effect.toughasnails.internal_chill\": \"Wewnętrzny chłód\",\n  \"effect.toughasnails.internal_chill.description\": \"Zapewnia nieznaczny spadek temperatury ciała na czas. Nie powoduje hipotermii.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Ulepszenie termiczne\",\n  \"enchantment.toughasnails.water_cleansing\": \"Oczyszczanie wodne\",\n  \n  \"block.toughasnails.rain_collector\": \"Zbieracz deszczu\",\n  \"block.toughasnails.temperature_gauge\": \"Wskaźnik temperatury\",\n  \"block.toughasnails.thermoregulator\": \"Termoregulator\",\n  \"block.toughasnails.water_purifier\": \"Oczyszczacz wody\",\n  \n  \"item.toughasnails.apple_juice\": \"Sok jabłkowy\",\n  \"item.toughasnails.cactus_juice\": \"Sok z kaktusa\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Sok z refrenusu\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Miedziana manierka z brudną wodą\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Miedziana manierka z oczyszczoną wodą\",\n  \"item.toughasnails.copper_water_canteen\": \"Miedziana manierka z wodą\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Diamentowa manierka z brudną wodą\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Diamentowa manierka z oczyszczoną wodą\",\n  \"item.toughasnails.diamond_water_canteen\": \"Diamentowa manierka z wodą\",\n  \"item.toughasnails.dirty_water_bottle\": \"Brudna butelka z wodą\",\n  \"item.toughasnails.empty_copper_canteen\": \"Pusta miedziana manierka\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Pusta diamentowa manierka\",\n  \"item.toughasnails.empty_gold_canteen\": \"Pusta złota manierka\",\n  \"item.toughasnails.empty_iron_canteen\": \"Pustka żelazna manierka\",\n  \"item.toughasnails.empty_leather_canteen\": \"Pusta skórzana manierka\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Pusta netherytowa manierka\",\n  \"item.toughasnails.glow_berry_juice\": \"Sok ze świecącej jagody\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Złota manierka z brudną wodą\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Złota manierka z oczyszczoną wodą\",\n  \"item.toughasnails.gold_water_canteen\": \"Złota manierka z wodą\",\n  \"item.toughasnails.ice_cream\": \"Lody\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Żelazna manierka z brudną wodą\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Żelazna manierka z oczyszczoną wodą\",\n  \"item.toughasnails.iron_water_canteen\": \"Żelazna manierka z wodą\",\n  \"item.toughasnails.leaf_boots\": \"Liściaste nagolenniki\",\n  \"item.toughasnails.leaf_chestplate\": \"Liściaste ponczo\",\n  \"item.toughasnails.leaf_helmet\": \"Liściasty welon\",\n  \"item.toughasnails.leaf_leggings\": \"Liściaste spodnie\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Skórzana manierka z brudną wodą\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Skórzana manierka z oczyszczoną wodą\",\n  \"item.toughasnails.leather_water_canteen\": \"Skórzana manierka z wodą\",\n  \"item.toughasnails.melon_juice\": \"Sok z Melona\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Netherytowa manierka z brudną wodą\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Netherytowa manierka z oczyszczoną wodą\",\n  \"item.toughasnails.netherite_water_canteen\": \"Netherytowa manierka z wodą\",\n  \"item.toughasnails.pumpkin_juice\": \"Sok z dyni\",\n  \"item.toughasnails.purified_water_bottle\": \"Butelka z oczyszczoną wodą\",\n  \"item.toughasnails.sweet_berry_juice\": \"Słodki Sok Jagodowy\",\n  \"item.toughasnails.tan_icon\": \"TAN Icon\",\n  \"item.toughasnails.thermometer\": \"Termometr\",\n  \"item.toughasnails.wool_boots\": \"Wełniane buty\",\n  \"item.toughasnails.wool_chestplate\": \"Wełniana parka\",\n  \"item.toughasnails.wool_helmet\": \"Wełniany kaptur\",\n  \"item.toughasnails.wool_leggings\": \"Wełniane spodnie\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Trwała Mikstura odporności na lód\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Trwała Mikstura odporności na lód\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Mikstura odporności na lód\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Mikstura odporności na lód\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Miotana mikstura odporności na lód\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Miotana mikstura odporności na lód\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Strzała odporności na lód\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Strzała odporności na lód\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Klimatolog\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/pt_br.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"Termorregulador\",\n  \"container.toughasnails.water_purifier\": \"Purificador de Água\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s morreu de superaquecimento\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s morreu de superaquecimento enquanto tentava escapar de %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s morreu de sede\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s morreu de sede enquanto lutava contra %2$s\",\n  \"desc.toughasnails.heating\": \"Aquecimento\",\n  \"desc.toughasnails.cooling\": \"Resfriamento\",\n  \"desc.toughasnails.heating_held\": \"Aquecimento (Segurado)\",\n  \"desc.toughasnails.cooling_held\": \"Resfriamento (Segurado)\",\n  \"desc.toughasnails.heating_consumed\": \"Aquecimento (Consumido)\",\n  \"desc.toughasnails.cooling_consumed\": \"Resfriamento (Consumido)\",\n  \"desc.toughasnails.heating_trim\": \"Aquecimento (Aparar)\",\n  \"desc.toughasnails.cooling_trim\": \"Resfriamento (Aparar)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Mostrar preenchimento de temperatura\",\n  \"debug.temperature_fill.off\": \"Preenchimento de temperatura: oculto\",\n  \"debug.temperature_fill.on\": \"Preenchimento de temperatura: mostrado\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Clemência Climática\",\n  \"effect.toughasnails.climate_clemency.description\": \"Neutraliza a temperatura corporal durante a duração. Concedido temporariamente ao criar um novo mundo (ou ao reaparecer, se habilitado na configuração).\",\n  \"effect.toughasnails.ice_resistance\": \"Resistência ao Gelo\",\n  \"effect.toughasnails.ice_resistance.description\": \"Concede imunidade a danos por congelamento.\",\n  \"effect.toughasnails.thirst\": \"Sede\",\n  \"effect.toughasnails.thirst.description\": \"Reduz a sede mais rápido que o normal.\",\n  \"effect.toughasnails.internal_warmth\": \"Calor Interno\",\n  \"effect.toughasnails.internal_warmth.description\": \"Fornece um leve aumento na temperatura corporal durante a duração. Não causa hipertermia.\",\n  \"effect.toughasnails.internal_chill\": \"Frio Interno\",\n  \"effect.toughasnails.internal_chill.description\": \"Fornece uma leve diminuição na temperatura corporal durante a duração. Não causa hipotermia.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Ajuste Térmico\",\n  \"enchantment.toughasnails.water_cleansing\": \"Purificação de Água\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"Uma couraça com Ajuste Térmico neutralizará completamente a temperatura corporal do jogador, independentemente da temperatura ambiental atual.\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"Um cantil com Purificação de Água purificará automaticamente qualquer água colocada nele.\",\n  \n  \"block.toughasnails.rain_collector\": \"Coletor de Chuva\",\n  \"block.toughasnails.temperature_gauge\": \"Medidor de Temperatura\",\n  \"block.toughasnails.thermoregulator\": \"Termorregulador\",\n  \"block.toughasnails.water_purifier\": \"Purificador de Água\",\n  \n  \"item.toughasnails.apple_juice\": \"Suco de Maçã\",\n  \"item.toughasnails.cactus_juice\": \"Suco de Cacto\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Suco de Fruta do Coro\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Cantil de Cobre com Água Suja\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Cantil de Cobre com Água Purificada\",\n  \"item.toughasnails.copper_water_canteen\": \"Cantil de Cobre com Água\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Cantil de Diamante com Água Suja\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Cantil de Diamante com Água Purificada\",\n  \"item.toughasnails.diamond_water_canteen\": \"Cantil de Diamante com Água\",\n  \"item.toughasnails.dirty_water_bottle\": \"Garrafa de Água Suja\",\n  \"item.toughasnails.empty_copper_canteen\": \"Cantil de Cobre Vazio\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Cantil de Diamante Vazio\",\n  \"item.toughasnails.empty_gold_canteen\": \"Cantil de Ouro Vazio\",\n  \"item.toughasnails.empty_iron_canteen\": \"Cantil de Ferro Vazio\",\n  \"item.toughasnails.empty_leather_canteen\": \"Cantil de Couro Vazio\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Cantil de Netherita Vazio\",\n  \"item.toughasnails.glow_berry_juice\": \"Suco de Baga Brilhante\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Cantil de Ouro com Água Suja\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Cantil de Ouro com Água Purificada\",\n  \"item.toughasnails.gold_water_canteen\": \"Cantil de Ouro com Água\",\n  \"item.toughasnails.ice_cream\": \"Sorvete\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Cantil de Ferro com Água Suja\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Cantil de Ferro com Água Purificada\",\n  \"item.toughasnails.iron_water_canteen\": \"Cantil de Ferro com Água\",\n  \"item.toughasnails.leaf_boots\": \"Grevas de Folhas\",\n  \"item.toughasnails.leaf_chestplate\": \"Poncho de Folhas\",\n  \"item.toughasnails.leaf_helmet\": \"Véu de Folhas\",\n  \"item.toughasnails.leaf_leggings\": \"Calças de Folhas\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Cantil de Couro com Água Suja\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Cantil de Couro com Água Purificada\",\n  \"item.toughasnails.leather_water_canteen\": \"Cantil de Couro com Água\",\n  \"item.toughasnails.melon_juice\": \"Suco de Melancia\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Cantil de Netherita com Água Suja\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Cantil de Netherita com Água Purificada\",\n  \"item.toughasnails.netherite_water_canteen\": \"Cantil de Netherita com Água\",\n  \"item.toughasnails.pumpkin_juice\": \"Suco de Abóbora\",\n  \"item.toughasnails.purified_water_bottle\": \"Garrafa de Água Purificada\",\n  \"item.toughasnails.sweet_berry_juice\": \"Suco de Baga Doce\",\n  \"item.toughasnails.tan_icon\": \"Ícone TAN\",\n  \"item.toughasnails.thermometer\": \"Termômetro\",\n  \"item.toughasnails.wool_boots\": \"Botas de Lã\",\n  \"item.toughasnails.wool_chestplate\": \"Parka de Lã\",\n  \"item.toughasnails.wool_helmet\": \"Capuz de Lã\",\n  \"item.toughasnails.wool_leggings\": \"Calças de Lã\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Poção Persistente de Resistência ao Gelo\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Poção Persistente de Resistência ao Gelo\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Poção de Resistência ao Gelo\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Poção de Resistência ao Gelo\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Poção Explosiva de Resistência ao Gelo\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Poção Explosiva de Resistência ao Gelo\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Flecha de Resistência ao Gelo\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Flecha de Resistência ao Gelo\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Climatologista\",\n  \"entity.minecraft.villager.climatologist\": \"Climatologista\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/ru_ru.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Крепкие Как Гвозди\",\n  \n  \"container.toughasnails.thermoregulator\": \"Терморегулятор\",\n  \"container.toughasnails.water_purifier\": \"Водоочиститель\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s перегрелся до смерти\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s перегрелся до смерти пока убегал от %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s умер от жажды\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s умер от жажды пока боролся с %2$s\",  \n  \"desc.toughasnails.heating\": \"Нагрев\",\n  \"desc.toughasnails.cooling\": \"Охлаждение\",\n  \"desc.toughasnails.heating_held\": \"Нагрев (при держании)\",\n  \"desc.toughasnails.cooling_held\": \"Охлаждение (при держании)\",\n  \"desc.toughasnails.heating_consumed\": \"Нагрев (при употреблении)\",\n  \"desc.toughasnails.cooling_consumed\": \"Охлаждение (при употреблении)\",\n  \"desc.toughasnails.heating_trim\": \"Нагрев (отделка)\",\n  \"desc.toughasnails.cooling_trim\": \"Охлаждение (отделка)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Показывать температуру наполнения\",\n  \"debug.temperature_fill.off\": \"Температура наполнения: скрыта\",\n  \"debug.temperature_fill.on\": \"Температура наполнения: показана\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Смягчение климата\",\n  \"effect.toughasnails.climate_clemency.description\": \"Нейтрализует температуру тела на время. Предоставляется только временно при создании нового мира (или при возрождении, если включено в конфигурации).\",\n  \"effect.toughasnails.ice_resistance\": \"Ледостойкость\",\n  \"effect.toughasnails.ice_resistance.description\": \"Дает иммунитет к урону от замораживания.\",\n  \"effect.toughasnails.thirst\": \"Жажда\",\n  \"effect.toughasnails.thirst.description\": \"Снижает жажду быстрее, чем обычно.\",\n  \"effect.toughasnails.internal_warmth\": \"Внутреннее тепло\",\n  \"effect.toughasnails.internal_warmth.description\": \"Обеспечивает небольшое повышение температуры тела на время. Не вызывает перегрева.\",\n  \"effect.toughasnails.internal_chill\": \"Внутренний холод\",\n  \"effect.toughasnails.internal_chill.description\": \"Обеспечивает небольшое снижение температуры тела на время. Не вызывает переохлаждения.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Терморегуляция\",\n  \"enchantment.toughasnails.water_cleansing\": \"Водоочистка\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"Полностью нейтрализует температуру тела игрока, независимо от текущей температуры окружающей среды. Применяется к нагруднику.\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"Автоматически очищает любую воду, налитую во флягу. Применяется к флягам.\",\n  \n  \n  \"block.toughasnails.rain_collector\": \"Дождесборник\",\n  \"block.toughasnails.temperature_gauge\": \"Датчик температуры\",\n  \"block.toughasnails.thermoregulator\": \"Терморегулятор\",\n  \"block.toughasnails.water_purifier\": \"Водоочиститель\",\n  \n  \"item.toughasnails.apple_juice\": \"Яблочный сок\",\n  \"item.toughasnails.cactus_juice\": \"Кактусовый сок\",\n  \"item.toughasnails.charc_os\": \"Угольки\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Хорусовый сок\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Медная фляга с грязной водой\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Медная фляга с чистой водой\",\n  \"item.toughasnails.copper_water_canteen\": \"Медная фляга с водой\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Алмазная фляга с грязной водой\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Алмазная фляга с чистой водой\",\n  \"item.toughasnails.diamond_water_canteen\": \"Алмазная фляга с водой\",\n  \"item.toughasnails.dirty_water_bottle\": \"Бутылка с грязной водой\",\n  \"item.toughasnails.empty_copper_canteen\": \"Пустая медная фляга\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Пустая алмазная фляга\",\n  \"item.toughasnails.empty_gold_canteen\": \"Пустая золотая фляга\",\n  \"item.toughasnails.empty_iron_canteen\": \"Пустая железная фляга\",\n  \"item.toughasnails.empty_leather_canteen\": \"Пустая кожаная фляга\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Пустая незеритовая фляга\",\n  \"item.toughasnails.glow_berry_juice\": \"Светящийся ягодный сок\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Золотая фляга с грязной водой\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Золотая фляга с чистой водой\",\n  \"item.toughasnails.gold_water_canteen\": \"Золотая фляга с водой\",\n  \"item.toughasnails.ice_cream\": \"Мороженое\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Железная фляга с грязной водой\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Железная фляга с чистой водой\",\n  \"item.toughasnails.iron_water_canteen\": \"Железная фляга с водой\",\n  \"item.toughasnails.leaf_boots\": \"Сапоги из листьев\",\n  \"item.toughasnails.leaf_chestplate\": \"Пончо из листьев\",\n  \"item.toughasnails.leaf_helmet\": \"Вуаль из листьев\",\n  \"item.toughasnails.leaf_leggings\": \"Штаны из листьев\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Кожаная фляга с грязной водой\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Кожаная фляга с чистой водой\",\n  \"item.toughasnails.leather_water_canteen\": \"Кожаная фляга с водой\",\n  \"item.toughasnails.melon_juice\": \"Арбузный сок\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Незеритовая фляга с грязной водой\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Незеритовая фляга с чистой водой\",\n  \"item.toughasnails.netherite_water_canteen\": \"Незеритовая фляга с водой\",\n  \"item.toughasnails.pumpkin_juice\": \"Тыквенный сок\",\n  \"item.toughasnails.purified_water_bottle\": \"Бутылка чистой воды\",\n  \"item.toughasnails.sweet_berry_juice\": \"Сок из сладких ягод\",\n  \"item.toughasnails.tan_icon\": \"Иконка «Крепкие Как Квозди»\",\n  \"item.toughasnails.thermometer\": \"Термометр\",\n  \"item.toughasnails.wool_boots\": \"Шерстяные ботинки\",\n  \"item.toughasnails.wool_chestplate\": \"Шерстяная куртка\",\n  \"item.toughasnails.wool_helmet\": \"Шерстяной капюшон\",\n  \"item.toughasnails.wool_leggings\": \"Шерстяные штаны\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Туманное зелье лёдостойкости\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Туманное зелье лёдостойкости\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Зелье лёдостойкости\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Зелье лёдостойкости\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Взрывное зелье лёдостойкости\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Взрывное зелье лёдостойкости\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Стрела лёдостойкости\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Стрела лёдостойкости\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Климатолог\",\n  \"entity.minecraft.villager.climatologist\": \"Климатолог\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/tr_tr.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Çivi Kadar Sağlam\",\n  \n  \"container.toughasnails.thermoregulator\": \"Termo Regulatör\",\n  \"container.toughasnails.water_purifier\": \"Su Arıtıcısı\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s ölümüne ısındı\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s,  %2$s'ten kaçmaya çalışırken ölümüne ısındı\",\n  \"death.attack.toughasnails.thirst\": \"%1$s susuzluktan öldü\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s, %2$s ile savaşırken susuzluktan öldü\",\n  \"desc.toughasnails.heating\": \"Isıtan\",\n  \"desc.toughasnails.cooling\": \"Soğutan\",\n  \"desc.toughasnails.heating_held\": \"Isıtan (Tutarken)\",\n  \"desc.toughasnails.cooling_held\": \"Soğutan (Tutarken)\",\n  \"desc.toughasnails.heating_consumed\": \"Isıtan (Tüketince)\",\n  \"desc.toughasnails.cooling_consumed\": \"Soğutan (Tüketince)\",\n  \"desc.toughasnails.heating_trim\": \"HeatIsıtaning (Trim)\",\n  \"desc.toughasnails.cooling_trim\": \"Soğutan (Trim)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Sıcaklık Arayüzünü Göster\",\n  \"debug.temperature_fill.off\": \"Sıcaklık arayüzü: gizli\",\n  \"debug.temperature_fill.on\": \"Sıcaklık arayüzü: aktif\",\n  \n  \"effect.toughasnails.climate_clemency\": \"İklim Hoşgörüsü\",\n  \"effect.toughasnails.climate_clemency.description\": \"Vücut sıcaklığını belli bir süre boyunca dengede tutar. Sadece yeni bir dünya oluşturulduğunda verilir (Ya da eğer ayarlanmışsa yeniden doğulduğunda).\",\n  \"effect.toughasnails.ice_resistance\": \"Donma Dayanıklılığı\",\n  \"effect.toughasnails.ice_resistance.description\": \"Donma hasarına karşı bağışıklık kazandırır.\",\n  \"effect.toughasnails.thirst\": \"Susuzluk\",\n  \"effect.toughasnails.thirst.description\": \"Susuzluk normalden daha hızlı artar.\",\n  \"effect.toughasnails.internal_warmth\": \"İç Sıcaklık\",\n  \"effect.toughasnails.internal_warmth.description\": \"Belli bir süreliğine vücut ısısında hafif bir artış sağlar. Hipertermiye neden olmaz.\",\n  \"effect.toughasnails.internal_chill\": \"İç Soğukluk\",\n  \"effect.toughasnails.internal_chill.description\": \"Belli bir süreliğine vücut ısısında hafif bir düşüş sağlar. Hipotermiye neden olmaz.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Isı Ayarı\",\n  \"enchantment.toughasnails.water_cleansing\": \"Su Temizleme\",\n  \n  \"block.toughasnails.rain_collector\": \"Yağmur Toplayıcısı\",\n  \"block.toughasnails.temperature_gauge\": \"Sıcaklık Göstergesi\",\n  \"block.toughasnails.thermoregulator\": \"Termoregülatör\",\n  \"block.toughasnails.water_purifier\": \"Su Arıtıcısı\",\n  \n  \"item.toughasnails.apple_juice\": \"Elma Suyu\",\n  \"item.toughasnails.cactus_juice\": \"Kaktüs Suyu\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Nakarat Meyvesi Suyu\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Bakır Kirli Su Matarası\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Bakır Arıtılmış Su Matarası\",\n  \"item.toughasnails.copper_water_canteen\": \"Bakır Su Matarası\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Elmas Kirli Su Matarası\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Elmas Arıtılmış Su Matarası\",\n  \"item.toughasnails.diamond_water_canteen\": \"Elmas Su Matarası\",\n  \"item.toughasnails.dirty_water_bottle\": \"Kirli Su Şişesi\",\n  \"item.toughasnails.empty_copper_canteen\": \"Boş Bakır Su Matarası\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Boş Elmas Su Matarası\",\n  \"item.toughasnails.empty_gold_canteen\": \"Boş Altın Su Matarası\",\n  \"item.toughasnails.empty_iron_canteen\": \"Boş Demir Su Matarası\",\n  \"item.toughasnails.empty_leather_canteen\": \"Boş Deri Su Matarası\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Boş Netherit Su Matarası\",\n  \"item.toughasnails.glow_berry_juice\": \"Parlayan Meyve Suyu\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Altın Kirli Su Matarası\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Altın Arıtılmış Su Matarası\",\n  \"item.toughasnails.gold_water_canteen\": \"Altın Su Matarası\",\n  \"item.toughasnails.ice_cream\": \"Dondurma\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Demir Kirli Su Matarası\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Demir Arıtılmış Su Matarası\",\n  \"item.toughasnails.iron_water_canteen\": \"Demir Su Matarası\",\n  \"item.toughasnails.leaf_boots\": \"Yaprak Çizme\",\n  \"item.toughasnails.leaf_chestplate\": \"Yaprak Panço\",\n  \"item.toughasnails.leaf_helmet\": \"Yaprak Duvak\",\n  \"item.toughasnails.leaf_leggings\": \"Yaprak Pantolon\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Deri Kirli Su Matarası\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Deri Arıtılmış Su Matarası\",\n  \"item.toughasnails.leather_water_canteen\": \"Deri Su Matarası\",\n  \"item.toughasnails.melon_juice\": \"Karpuz Suyu\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Netherit Kirli Su Matarası\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Netherit Arıtılmış Su Matarası\",\n  \"item.toughasnails.netherite_water_canteen\": \"Netherit Su Matarası\",\n  \"item.toughasnails.pumpkin_juice\": \"Bal Kabağı Suyu\",\n  \"item.toughasnails.purified_water_bottle\": \"Arıtılmış Su Şişesi\",\n  \"item.toughasnails.sweet_berry_juice\": \"Tatlı Orman Meyvesi Suyu\",\n  \"item.toughasnails.tan_icon\": \"TAN Simgesi\",\n  \"item.toughasnails.thermometer\": \"Termometre\",\n  \"item.toughasnails.wool_boots\": \"Yün Çizme\",\n  \"item.toughasnails.wool_chestplate\": \"Yün Kaban\",\n  \"item.toughasnails.wool_helmet\": \"Yün Kapüşon\",\n  \"item.toughasnails.wool_leggings\": \"Yün Pantolon\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Kalıcı Buz Direnci İksiri\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Kalıcı Buz Direnci İksiri\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Buz Direnci İksiri\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Buz Direnci İksiri\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Patlayıcı Buz Direnci İksiri\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Patlayıcı Buz Direnci İksiri\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Buz Direnci Oku\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Buz Direnci Oku\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"İklim Bilimci\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/uk_ua.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n  \n  \"container.toughasnails.thermoregulator\": \"Терморегулятор\",\n  \"container.toughasnails.water_purifier\": \"Водоочисник\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s зазнав смертельного перегріву\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s зазнав смертельного перегріву під час спроби втекти від %2$s\",\n  \"death.attack.toughasnails.thirst\": \"%1$s помер від спраги\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s помер від справи під час бою з %2$s\",\n  \"desc.toughasnails.heating\": \"Нагрівання\",\n  \"desc.toughasnails.cooling\": \"Охолодження\",\n  \"desc.toughasnails.heating_held\": \"Нагрівання (при триманні)\",\n  \"desc.toughasnails.cooling_held\": \"Охолодження (при триманні)\",\n  \"desc.toughasnails.heating_consumed\": \"Нагрівання (при споживанні)\",\n  \"desc.toughasnails.cooling_consumed\": \"Охолодження (при споживанні)\",\n  \"desc.toughasnails.heating_trim\": \"Нагрівання (орнамент)\",\n  \"desc.toughasnails.cooling_trim\": \"Охолодження (орнамент)\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = Показати температурне заповнення\",\n  \"debug.temperature_fill.off\": \"Температурне заповнення: Приховано\",\n  \"debug.temperature_fill.on\": \"Температурне заповнення: Показано\",\n  \n  \"effect.toughasnails.climate_clemency\": \"Кліматостійкість\",\n  \"effect.toughasnails.climate_clemency.description\": \"Нейтралізує температуру тіла протягом часу. Отримується лише тимчасово при створенні нового світу (або при відродженні, якщо ввімкнено в налаштуваннях).\",\n  \"effect.toughasnails.ice_resistance\": \"Льодостійкість\",\n  \"effect.toughasnails.ice_resistance.description\": \"Надає імунітет до шкоди від холоду.\",\n  \"effect.toughasnails.thirst\": \"Спрага\",\n  \"effect.toughasnails.thirst.description\": \"Знижує спрагу швидше, ніж зазвичай.\",\n  \"effect.toughasnails.internal_warmth\": \"Унутрішнє тепло\",\n  \"effect.toughasnails.internal_warmth.description\": \"Забезпечує невелике підвищення температури тіла протягом тривалого часу. Не викликає перегріву.\",\n  \"effect.toughasnails.internal_chill\": \"Унутрішній холод\",\n  \"effect.toughasnails.internal_chill.description\": \"Забезпечує незначне зниження температури тіла на час. Не викликає переохолодження.\",\n  \"enchantment.toughasnails.thermal_tuning\": \"Теплоутримання\",\n  \"enchantment.toughasnails.water_cleansing\": \"Водоочищення\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"Нагрудник із терморегулюванням повністю нейтралізує температуру тіла гравця, незалежно від поточної температури навколишнього середовища.\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"Фляга з функцією очищення води автоматично очищатиме будь-яку воду, яка в неї подається.\",\n  \n  \"block.toughasnails.rain_collector\": \"Дощоприймач\",\n  \"block.toughasnails.temperature_gauge\": \"Термодатчик\",\n  \"block.toughasnails.thermoregulator\": \"Терморегулятор\",\n  \"block.toughasnails.water_purifier\": \"Водоочисник\",\n  \n  \"item.toughasnails.apple_juice\": \"Яблучний сік\",\n  \"item.toughasnails.cactus_juice\": \"Кактусовий сік\",\n  \"item.toughasnails.charc_os\": \"Вугільня\",\n  \"item.toughasnails.chorus_fruit_juice\": \"Сік із фрукта хорусу\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"Мідна фляга брудної води\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"Мідна фляга очищеної води\",\n  \"item.toughasnails.copper_water_canteen\": \"Мідна фляга води\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"Діамантова фляга брудної води\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"Діамантова фляга очищеної води\",\n  \"item.toughasnails.diamond_water_canteen\": \"Діамантова фляга води\",\n  \"item.toughasnails.dirty_water_bottle\": \"Пляшка брудної води\",\n  \"item.toughasnails.empty_copper_canteen\": \"Порожня мідна фляга\",\n  \"item.toughasnails.empty_diamond_canteen\": \"Порожня діамантова фляга\",\n  \"item.toughasnails.empty_gold_canteen\": \"Порожня золота фляга\",\n  \"item.toughasnails.empty_iron_canteen\": \"Порожня залізна фляга\",\n  \"item.toughasnails.empty_leather_canteen\": \"Порожня шкіряна фляга\",\n  \"item.toughasnails.empty_netherite_canteen\": \"Порожня незеритова фляга\",\n  \"item.toughasnails.glow_berry_juice\": \"Сяйно-ягідний сік\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"Золота фляга брудної води\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"Золота фляга очищеної води\",\n  \"item.toughasnails.gold_water_canteen\": \"Золота фляга води\",\n  \"item.toughasnails.ice_cream\": \"Морозиво\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"Залізна фляга брудної води\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"Залізна фляга очищеної води\",\n  \"item.toughasnails.iron_water_canteen\": \"Залізна фляга води\",\n  \"item.toughasnails.leaf_boots\": \"Листяні чоботи\",\n  \"item.toughasnails.leaf_chestplate\": \"Листяне пончо\",\n  \"item.toughasnails.leaf_helmet\": \"Листяна вуаль\",\n  \"item.toughasnails.leaf_leggings\": \"Листяні штани\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"Шкіряна фляга брудної води\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"Шкіряна фляга очищеної води\",\n  \"item.toughasnails.leather_water_canteen\": \"Шкіряна фляга води\",\n  \"item.toughasnails.melon_juice\": \"Кавуновий сік\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"Незеритова фляга брудної води\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"Незеритова фляга очищеної води\",\n  \"item.toughasnails.netherite_water_canteen\": \"Незеритова фляга води\",\n  \"item.toughasnails.pumpkin_juice\": \"Гарбузовий сік\",\n  \"item.toughasnails.purified_water_bottle\": \"Пляшка очищеної води\",\n  \"item.toughasnails.sweet_berry_juice\": \"Солодко-ягідний сік\",\n  \"item.toughasnails.tan_icon\": \"Значок TAN\",\n  \"item.toughasnails.thermometer\": \"Термометр\",\n  \"item.toughasnails.wool_boots\": \"Вовняні чоботи\",\n  \"item.toughasnails.wool_chestplate\": \"Вовняна парка\",\n  \"item.toughasnails.wool_helmet\": \"Вовняний каптур\",\n  \"item.toughasnails.wool_leggings\": \"Вовняні штани\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Осідальне зілля льодостікости\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Осідальне зілля льодостікости\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Зілля льодостікости\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Зілля льодостікости\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Вибухове зілля льодостікости\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Вибухове зілля льодостікости\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Стріла льодостікости\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Стріла льодостікости\",\n  \n  \"entity.minecraft.villager.toughasnails.climatologist\": \"Кліматолог\",\n  \"entity.minecraft.villager.climatologist\": \"Кліматолог\",\n\n  \"modmenu.descriptionTranslation.toughasnails\": \"Додає функції для покращення режиму виживання та підвищення складности гри.\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/vi_vn.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails \",\n  \n  \"container.toughasnails.water_purifier\": \"Máy lọc nước \",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s quá nóng đến chết \",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s quá nóng đến chết trong khi cố gắng thoát khỏi %2$s \",\n  \"desc.toughasnails.heating\": \"Sưởi ấm \",\n  \"desc.toughasnails.cooling\": \"Làm mát \",\n  \n  \"effect.toughasnails.climate_clemency\": \" Khí hậu mát mẻ \",\n  \"effect.toughasnails.ice_resistance\": \"Kháng lạnh \",\n  \"effect.toughasnails.thirst\": \"Khát \",\n  \"enchantment.toughasnails.thermal_tuning\": \"Điều chỉnh nhiệt \",\n  \n  \"block.toughasnails.rain_collector\": \"Bộ thu mưa \",\n  \"block.toughasnails.water_purifier\": \"Máy lọc nước \",\n  \n  \"item.toughasnails.apple_juice\": \"Nước ép táo \",\n  \"item.toughasnails.cactus_juice\": \"Nước ép xương rồng \",\n  \"item.toughasnails.chorus_fruit_juice\": \"Nước ép trái cây hợp xướng \",\n  \"item.toughasnails.dirty_water_bottle\": \"Chai nước bẩn \",\n  \"item.toughasnails.dirty_water_canteen\": \"Túi nước bẩn\",\n  \"item.toughasnails.empty_canteen\": \"Túi nước rỗng\",\n  \"item.toughasnails.glow_berry_juice\": \"Nước ép quả mọng \",\n  \"item.toughasnails.leaf_boots\": \"Giày lá\",\n  \"item.toughasnails.leaf_chestplate\": \"Áo lá \",\n  \"item.toughasnails.leaf_helmet\": \"Mũ lá\",\n  \"item.toughasnails.leaf_leggings\": \"Quần lá \",\n  \"item.toughasnails.melon_juice\": \"Nước dưa \",\n  \"item.toughasnails.pumpkin_juice\": \"Nước ép bí ngô \",\n  \"item.toughasnails.purified_water_bottle\": \"Chai nước sạch\",\n  \"item.toughasnails.purified_water_canteen\": \"Túi nước sạch\",\n  \"item.toughasnails.sweet_berry_juice\": \"Nước ép quả mọng ngọt \",\n  \"item.toughasnails.tan_icon\": \"Biểu tượng TAN \",\n  \"item.toughasnails.water_canteen\": \"Túi nước\",\n  \"item.toughasnails.wool_boots\": \"Giày len \",\n  \"item.toughasnails.wool_chestplate\": \"Áo len \",\n  \"item.toughasnails.wool_helmet\": \"Mũ len \",\n  \"item.toughasnails.wool_leggings\": \"Quần len \",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"Thuốc kháng băng kéo dài \",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"Thuốc kháng băng kéo dài \",\n  \"item.minecraft.potion.effect.ice_resistance\": \"Thuốc kháng băng \",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"Thuốc kháng băng \",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"Thuốc kháng băng ném được\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"Thuốc kháng băng ném được\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"Mũi tên kháng băng \",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"Mũi tên kháng băng\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/zh_cn.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"意志坚定\",\n  \n  \"container.toughasnails.water_purifier\": \"净水器\",\n  \n  \"death.attack.toughasnails.hyperthermia\": \"%1$s 中暑而死。\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s 在试图逃离 %2$s 时中暑而死\",\n  \n  \"effect.toughasnails.climate_clemency\": \"温和气候\",\n  \"effect.toughasnails.ice_resistance\": \"寒冷抗性\",\n  \"effect.toughasnails.thirst\": \"口渴\",\n  \"enchantment.toughasnails.thermal_tuning\": \"自动调温\",\n  \n  \"block.toughasnails.rain_collector\": \"雨水收集器\",\n  \"block.toughasnails.water_purifier\": \"净水器\",\n  \n  \"item.toughasnails.apple_juice\": \"苹果汁\",\n  \"item.toughasnails.cactus_juice\": \"仙人掌汁\",\n  \"item.toughasnails.chorus_fruit_juice\": \"紫松果汁\",\n  \"item.toughasnails.dirty_water_bottle\": \"脏水瓶\",\n  \"item.toughasnails.dirty_water_canteen\": \"脏水壶\",\n  \"item.toughasnails.empty_canteen\": \"空水壶\",\n  \"item.toughasnails.glow_berry_juice\": \"发光浆果汁\",\n  \"item.toughasnails.leaf_boots\": \"树叶靴\",\n  \"item.toughasnails.leaf_chestplate\": \"树叶斗篷\",\n  \"item.toughasnails.leaf_helmet\": \"树叶面纱\",\n  \"item.toughasnails.leaf_leggings\": \"树叶护腿\",\n  \"item.toughasnails.melon_juice\": \"西瓜汁\",\n  \"item.toughasnails.pumpkin_juice\": \"南瓜汁\",\n  \"item.toughasnails.purified_water_bottle\": \"净水瓶\",\n  \"item.toughasnails.purified_water_canteen\": \"净水壶\",\n  \"item.toughasnails.sweet_berry_juice\": \"甜浆果汁\",\n  \"item.toughasnails.tan_icon\": \"TAN 图标\",\n  \"item.toughasnails.water_canteen\": \"水壶\",\n  \"item.toughasnails.wool_boots\": \"羊毛靴\",\n  \"item.toughasnails.wool_chestplate\": \"羊毛大衣\",\n  \"item.toughasnails.wool_helmet\": \"羊毛连帽\",\n  \"item.toughasnails.wool_leggings\": \"羊毛裤\",\n  \n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"滞留型 抗寒药水\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"滞留型 抗寒药水\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"抗寒药水\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"抗寒药水\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"喷溅型 抗寒药水\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"喷溅型 抗寒药水\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"抗寒之箭\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"抗寒之箭\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/lang/zh_tw.json",
    "content": "{\n  \"itemGroup.toughasnails\": \"Tough As Nails\",\n\n  \"container.toughasnails.thermoregulator\": \"溫度調節器\",\n  \"container.toughasnails.water_purifier\": \"淨水器\",\n\n  \"death.attack.toughasnails.hyperthermia\": \"%1$s 因高熱而死\",\n  \"death.attack.toughasnails.hyperthermia.player\": \"%1$s 在試圖逃離 %2$s 時因高熱而死\",\n  \"death.attack.toughasnails.thirst\": \"%1$s 因口渴而死\",\n  \"death.attack.toughasnails.thirst.player\": \"%1$s 在與 %2$s 戰鬥時因口渴而死\",\n  \"desc.toughasnails.heating\": \"升溫\",\n  \"desc.toughasnails.cooling\": \"降溫\",\n  \"desc.toughasnails.heating_held\": \"升溫（手持）\",\n  \"desc.toughasnails.cooling_held\": \"降溫（手持）\",\n  \"desc.toughasnails.heating_consumed\": \"升溫（食用）\",\n  \"desc.toughasnails.cooling_consumed\": \"降溫（食用）\",\n  \"desc.toughasnails.heating_trim\": \"升溫（裝飾）\",\n  \"desc.toughasnails.cooling_trim\": \"降溫（裝飾）\",\n  \"debug.temperature_fill.help\": \"F3 + 7 = 顯示溫度填充\",\n  \"debug.temperature_fill.off\": \"溫度填充：隱藏\",\n  \"debug.temperature_fill.on\": \"溫度填充：顯示\",\n\n  \"effect.toughasnails.climate_clemency\": \"氣候恩賜\",\n  \"effect.toughasnails.climate_clemency.description\": \"在持續時間內使體溫維持中性。僅在建立新世界時暫時給予（如果在設定中啟用，則在重生時也會給予）。\",\n  \"effect.toughasnails.ice_resistance\": \"耐寒\",\n  \"effect.toughasnails.ice_resistance.description\": \"免疫冰凍傷害。\",\n  \"effect.toughasnails.thirst\": \"口渴\",\n  \"effect.toughasnails.thirst.description\": \"以比正常更快的速度降低口渴值。\",\n  \"effect.toughasnails.internal_warmth\": \"內在溫暖\",\n  \"effect.toughasnails.internal_warmth.description\": \"在持續時間內略微提高體溫。不會導致高熱。\",\n  \"effect.toughasnails.internal_chill\": \"內在寒冷\",\n  \"effect.toughasnails.internal_chill.description\": \"在持續時間內略微降低體溫。不會導致失溫。\",\n  \"enchantment.toughasnails.thermal_tuning\": \"調溫\",\n  \"enchantment.toughasnails.water_cleansing\": \"淨水\",\n  \"enchantment.toughasnails.thermal_tuning.desc\": \"附有調溫的盔甲將完全中和玩家的體溫，不受當前環境溫度的影響。\",\n  \"enchantment.toughasnails.water_cleansing.desc\": \"附有淨水的水壺會自動淨化放入其中的任何水。\",\n\n  \"block.toughasnails.rain_collector\": \"雨水收集器\",\n  \"block.toughasnails.temperature_gauge\": \"溫度計\",\n  \"block.toughasnails.thermoregulator\": \"溫度調節器\",\n  \"block.toughasnails.water_purifier\": \"淨水器\",\n\n  \"item.toughasnails.apple_juice\": \"蘋果汁\",\n  \"item.toughasnails.cactus_juice\": \"仙人掌汁\",\n  \"item.toughasnails.charc_os\": \"Charc-O's\",\n  \"item.toughasnails.chorus_fruit_juice\": \"歌萊果汁\",\n  \"item.toughasnails.copper_dirty_water_canteen\": \"銅汙水壺\",\n  \"item.toughasnails.copper_purified_water_canteen\": \"銅淨水壺\",\n  \"item.toughasnails.copper_water_canteen\": \"銅水壺\",\n  \"item.toughasnails.diamond_dirty_water_canteen\": \"鑽石汙水壺\",\n  \"item.toughasnails.diamond_purified_water_canteen\": \"鑽石淨水壺\",\n  \"item.toughasnails.diamond_water_canteen\": \"鑽石水壺\",\n  \"item.toughasnails.dirty_water_bottle\": \"汙水瓶\",\n  \"item.toughasnails.empty_copper_canteen\": \"空的銅水壺\",\n  \"item.toughasnails.empty_diamond_canteen\": \"空的鑽石水壺\",\n  \"item.toughasnails.empty_gold_canteen\": \"空的黃金水壺\",\n  \"item.toughasnails.empty_iron_canteen\": \"空的鐵水壺\",\n  \"item.toughasnails.empty_leather_canteen\": \"空的皮革水壺\",\n  \"item.toughasnails.empty_netherite_canteen\": \"空的獄髓水壺\",\n  \"item.toughasnails.glow_berry_juice\": \"螢光莓汁\",\n  \"item.toughasnails.gold_dirty_water_canteen\": \"黃金汙水壺\",\n  \"item.toughasnails.gold_purified_water_canteen\": \"黃金淨水壺\",\n  \"item.toughasnails.gold_water_canteen\": \"黃金水壺\",\n  \"item.toughasnails.ice_cream\": \"冰淇淋\",\n  \"item.toughasnails.iron_dirty_water_canteen\": \"鐵汙水壺\",\n  \"item.toughasnails.iron_purified_water_canteen\": \"鐵淨水壺\",\n  \"item.toughasnails.iron_water_canteen\": \"鐵水壺\",\n  \"item.toughasnails.leaf_boots\": \"樹葉護脛\",\n  \"item.toughasnails.leaf_chestplate\": \"樹葉斗篷\",\n  \"item.toughasnails.leaf_helmet\": \"樹葉面紗\",\n  \"item.toughasnails.leaf_leggings\": \"樹葉褲子\",\n  \"item.toughasnails.leather_dirty_water_canteen\": \"皮革汙水壺\",\n  \"item.toughasnails.leather_purified_water_canteen\": \"皮革淨水壺\",\n  \"item.toughasnails.leather_water_canteen\": \"皮革水壺\",\n  \"item.toughasnails.melon_juice\": \"西瓜汁\",\n  \"item.toughasnails.netherite_dirty_water_canteen\": \"獄髓汙水壺\",\n  \"item.toughasnails.netherite_purified_water_canteen\": \"獄髓淨水壺\",\n  \"item.toughasnails.netherite_water_canteen\": \"獄髓水壺\",\n  \"item.toughasnails.pumpkin_juice\": \"南瓜汁\",\n  \"item.toughasnails.purified_water_bottle\": \"淨水瓶\",\n  \"item.toughasnails.sweet_berry_juice\": \"甜莓汁\",\n  \"item.toughasnails.tan_icon\": \"TAN 圖示\",\n  \"item.toughasnails.thermometer\": \"溫度計\",\n  \"item.toughasnails.wool_boots\": \"羊毛靴子\",\n  \"item.toughasnails.wool_chestplate\": \"羊毛大衣\",\n  \"item.toughasnails.wool_helmet\": \"羊毛兜帽\",\n  \"item.toughasnails.wool_leggings\": \"羊毛褲子\",\n\n  \"item.minecraft.lingering_potion.effect.ice_resistance\": \"滯留 耐寒藥水\",\n  \"item.minecraft.lingering_potion.effect.long_ice_resistance\": \"滯留 耐寒藥水\",\n  \"item.minecraft.potion.effect.ice_resistance\": \"耐寒藥水\",\n  \"item.minecraft.potion.effect.long_ice_resistance\": \"耐寒藥水\",\n  \"item.minecraft.splash_potion.effect.ice_resistance\": \"飛濺 耐寒藥水\",\n  \"item.minecraft.splash_potion.effect.long_ice_resistance\": \"飛濺 耐寒藥水\",\n  \"item.minecraft.tipped_arrow.effect.ice_resistance\": \"耐寒之箭\",\n  \"item.minecraft.tipped_arrow.effect.long_ice_resistance\": \"耐寒之箭\",\n\n  \"entity.minecraft.villager.toughasnails.climatologist\": \"氣候學家\",\n  \"entity.minecraft.villager.climatologist\": \"氣候學家\"\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/rain_collector.json",
    "content": "{\n\t\"parent\": \"block/block\",\n    \"ambientocclusion\": false,\n\t\"textures\": {\n        \"particle\": \"toughasnails:block/rain_collector_side\",\n        \"top\": \"toughasnails:block/rain_collector_top\",\n        \"bottom\": \"toughasnails:block/rain_collector_bottom\",\n        \"side\": \"toughasnails:block/rain_collector_side\",\n\t\t\"side_inner\": \"toughasnails:block/rain_collector_side_inner\",\n        \"inside\": \"toughasnails:block/rain_collector_inner\",\n\t\t\"water\": \"minecraft:block/water_still\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [0, 0, 0],\n\t\t\t\"to\": [2, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 2],\n\t\t\t\"to\": [14, 4, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#inside\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [14, 0, 0],\n\t\t\t\"to\": [16, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"up\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 0],\n\t\t\t\"to\": [14, 16, 2],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 14],\n\t\t\t\"to\": [14, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 15, 2],\n\t\t\t\"to\": [14, 15, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#top\", \"cullface\": \"up\"}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/rain_collector_level1.json",
    "content": "{\n\t\"parent\": \"block/block\",\n    \"ambientocclusion\": false,\n\t\"textures\": {\n        \"particle\": \"toughasnails:block/rain_collector_side\",\n        \"top\": \"toughasnails:block/rain_collector_top\",\n        \"bottom\": \"toughasnails:block/rain_collector_bottom\",\n        \"side\": \"toughasnails:block/rain_collector_side\",\n\t\t\"side_inner\": \"toughasnails:block/rain_collector_side_inner\",\n        \"inside\": \"toughasnails:block/rain_collector_inner\",\n\t\t\"water\": \"minecraft:block/water_still\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [0, 0, 0],\n\t\t\t\"to\": [2, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 2],\n\t\t\t\"to\": [14, 4, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#inside\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [14, 0, 0],\n\t\t\t\"to\": [16, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"up\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 0],\n\t\t\t\"to\": [14, 16, 2],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 14],\n\t\t\t\"to\": [14, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 15, 2],\n\t\t\t\"to\": [14, 15, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#top\", \"cullface\": \"up\"}\n\t\t\t}\n\t\t},\n        {   \n\t\t\t\"from\": [ 2, 8, 2 ],\n            \"to\": [ 14, 8, 14 ],\n            \"faces\": {\n                \"up\": { \"texture\": \"#water\", \"tintindex\": 0}\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/rain_collector_level2.json",
    "content": "{\n\t\"parent\": \"block/block\",\n    \"ambientocclusion\": false,\n\t\"textures\": {\n        \"particle\": \"toughasnails:block/rain_collector_side\",\n        \"top\": \"toughasnails:block/rain_collector_top\",\n        \"bottom\": \"toughasnails:block/rain_collector_bottom\",\n        \"side\": \"toughasnails:block/rain_collector_side\",\n\t\t\"side_inner\": \"toughasnails:block/rain_collector_side_inner\",\n        \"inside\": \"toughasnails:block/rain_collector_inner\",\n\t\t\"water\": \"minecraft:block/water_still\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [0, 0, 0],\n\t\t\t\"to\": [2, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 2],\n\t\t\t\"to\": [14, 4, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#inside\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [14, 0, 0],\n\t\t\t\"to\": [16, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"up\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 0],\n\t\t\t\"to\": [14, 16, 2],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 14],\n\t\t\t\"to\": [14, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 15, 2],\n\t\t\t\"to\": [14, 15, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#top\", \"cullface\": \"up\"}\n\t\t\t}\n\t\t},\n        {   \n\t\t\t\"from\": [ 2, 11, 2 ],\n            \"to\": [ 14, 11, 14 ],\n            \"faces\": {\n                \"up\": { \"texture\": \"#water\", \"tintindex\": 0}\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/rain_collector_level3.json",
    "content": "{\n\t\"parent\": \"block/block\",\n    \"ambientocclusion\": false,\n\t\"textures\": {\n        \"particle\": \"toughasnails:block/rain_collector_side\",\n        \"top\": \"toughasnails:block/rain_collector_top\",\n        \"bottom\": \"toughasnails:block/rain_collector_bottom\",\n        \"side\": \"toughasnails:block/rain_collector_side\",\n\t\t\"side_inner\": \"toughasnails:block/rain_collector_side_inner\",\n        \"inside\": \"toughasnails:block/rain_collector_inner\",\n\t\t\"water\": \"minecraft:block/water_still\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [0, 0, 0],\n\t\t\t\"to\": [2, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 2],\n\t\t\t\"to\": [14, 4, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [2, 12, 14, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#inside\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [14, 0, 0],\n\t\t\t\"to\": [16, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"up\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 0],\n\t\t\t\"to\": [14, 16, 2],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"north\"},\n\t\t\t\t\"east\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 0, 14],\n\t\t\t\"to\": [14, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side_inner\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 2, 16], \"texture\": \"#side\", \"cullface\": \"east\"},\n\t\t\t\t\"south\": {\"uv\": [2, 0, 14, 16], \"texture\": \"#side\", \"cullface\": \"south\"},\n\t\t\t\t\"west\": {\"uv\": [14, 0, 16, 16], \"texture\": \"#side\", \"cullface\": \"west\"},\n\t\t\t\t\"up\": {\"uv\": [2, 14, 14, 16], \"texture\": \"#top\", \"cullface\": \"up\"},\n\t\t\t\t\"down\": {\"uv\": [2, 0, 14, 2], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 15, 2],\n\t\t\t\"to\": [14, 15, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#top\", \"cullface\": \"up\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [2, 14, 2],\n\t\t\t\"to\": [14, 14, 14],\n\t\t\t\"faces\": {\n\t\t\t\t\"up\": {\"uv\": [2, 2, 14, 14], \"texture\": \"#water\", \"tintindex\": 0}\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/temperature_gauge.json",
    "content": "{\n  \"parent\": \"minecraft:block/template_daylight_detector\",\n  \"textures\": {\n    \"side\": \"toughasnails:block/temperature_gauge_side\",\n    \"top\": \"toughasnails:block/temperature_gauge_top\"\n  }\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/temperature_gauge_inverted.json",
    "content": "{\n  \"parent\": \"minecraft:block/template_daylight_detector\",\n  \"textures\": {\n    \"side\": \"toughasnails:block/temperature_gauge_side\",\n    \"top\": \"toughasnails:block/temperature_gauge_inverted_top\"\n  }\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/thermoregulator.json",
    "content": "{\n  \"parent\": \"block/block\",\n  \"textures\": {\n    \"bottom\": \"minecraft:block/blast_furnace_top\",\n    \"top\": \"toughasnails:block/thermoregulator_top\",\n    \"north\": \"toughasnails:block/thermoregulator_front\",\n    \"south\": \"toughasnails:block/thermoregulator_back\",\n    \"west\": \"toughasnails:block/thermoregulator_side\",\n    \"east\": \"toughasnails:block/thermoregulator_side\",\n    \"particle\": \"#north\"\n  },\n  \"elements\": [\n    {\n      \"from\": [ 0, 0, 0 ],\n      \"to\": [ 16, 16, 16 ],\n      \"faces\": {\n        \"down\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#bottom\", \"cullface\": \"down\" },\n        \"up\":    { \"uv\": [ 16, 16, 0, 0 ], \"texture\": \"#top\", \"cullface\": \"up\" },\n        \"north\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#north\", \"cullface\": \"north\" },\n        \"south\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#south\", \"cullface\": \"south\" },\n        \"west\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#west\", \"cullface\": \"west\" },\n        \"east\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#east\", \"cullface\": \"east\" }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/thermoregulator_active.json",
    "content": "{\n  \"parent\": \"block/block\",\n  \"textures\": {\n    \"bottom\": \"minecraft:block/blast_furnace_top\",\n    \"top\": \"toughasnails:block/thermoregulator_top\",\n    \"north\": \"toughasnails:block/thermoregulator_front_active\",\n    \"south\": \"toughasnails:block/thermoregulator_back\",\n    \"west\": \"toughasnails:block/thermoregulator_side_heating\",\n    \"east\": \"toughasnails:block/thermoregulator_side_cooling\",\n    \"particle\": \"#north\"\n  },\n  \"elements\": [\n    {\n      \"from\": [ 0, 0, 0 ],\n      \"to\": [ 16, 16, 16 ],\n      \"faces\": {\n        \"down\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#bottom\", \"cullface\": \"down\" },\n        \"up\":    { \"uv\": [ 16, 16, 0, 0 ], \"texture\": \"#top\", \"cullface\": \"up\" },\n        \"north\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#north\", \"cullface\": \"north\" },\n        \"south\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#south\", \"cullface\": \"south\" },\n        \"west\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#west\", \"cullface\": \"west\" },\n        \"east\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#east\", \"cullface\": \"east\" }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/thermoregulator_cooling_active.json",
    "content": "{\n  \"parent\": \"block/block\",\n  \"textures\": {\n    \"bottom\": \"minecraft:block/blast_furnace_top\",\n    \"top\": \"toughasnails:block/thermoregulator_top\",\n    \"north\": \"toughasnails:block/thermoregulator_front_active\",\n    \"south\": \"toughasnails:block/thermoregulator_back\",\n    \"west\": \"toughasnails:block/thermoregulator_side\",\n    \"east\": \"toughasnails:block/thermoregulator_side_cooling\",\n    \"particle\": \"#north\"\n  },\n  \"elements\": [\n    {\n      \"from\": [ 0, 0, 0 ],\n      \"to\": [ 16, 16, 16 ],\n      \"faces\": {\n        \"down\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#bottom\", \"cullface\": \"down\" },\n        \"up\":    { \"uv\": [ 16, 16, 0, 0 ], \"texture\": \"#top\", \"cullface\": \"up\" },\n        \"north\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#north\", \"cullface\": \"north\" },\n        \"south\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#south\", \"cullface\": \"south\" },\n        \"west\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#west\", \"cullface\": \"west\" },\n        \"east\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#east\", \"cullface\": \"east\" }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/thermoregulator_heating_active.json",
    "content": "{\n  \"parent\": \"block/block\",\n  \"textures\": {\n    \"bottom\": \"minecraft:block/blast_furnace_top\",\n    \"top\": \"toughasnails:block/thermoregulator_top\",\n    \"north\": \"toughasnails:block/thermoregulator_front_active\",\n    \"south\": \"toughasnails:block/thermoregulator_back\",\n    \"west\": \"toughasnails:block/thermoregulator_side_heating\",\n    \"east\": \"toughasnails:block/thermoregulator_side\",\n    \"particle\": \"#north\"\n  },\n  \"elements\": [\n    {\n      \"from\": [ 0, 0, 0 ],\n      \"to\": [ 16, 16, 16 ],\n      \"faces\": {\n        \"down\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#bottom\", \"cullface\": \"down\" },\n        \"up\":    { \"uv\": [ 16, 16, 0, 0 ], \"texture\": \"#top\", \"cullface\": \"up\" },\n        \"north\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#north\", \"cullface\": \"north\" },\n        \"south\": { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#south\", \"cullface\": \"south\" },\n        \"west\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#west\", \"cullface\": \"west\" },\n        \"east\":  { \"uv\": [ 0, 0, 16, 16 ], \"texture\": \"#east\", \"cullface\": \"east\" }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/water_purifier.json",
    "content": "{\n\t\"parent\": \"block/block\",\n\t\"textures\": {\n\t\t\"particle\": \"toughasnails:block/water_purifier_front\",\n\t\t\"top\": \"toughasnails:block/water_purifier_top\",\n\t\t\"inner\": \"toughasnails:block/water_purifier_inner\",\n\t\t\"front\": \"toughasnails:block/water_purifier_front\",\n\t\t\"side\": \"toughasnails:block/water_purifier_side\",\n\t\t\"bottom\": \"toughasnails:block/water_purifier_bottom\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [0, 0, 0],\n\t\t\t\"to\": [16, 10, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#front\"},\n\t\t\t\t\"east\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#side\"},\n\t\t\t\t\"south\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#side\"},\n\t\t\t\t\"west\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#side\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#inner\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [0, 10, 0],\n\t\t\t\"to\": [16, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#front\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#side\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#side\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#side\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"}\n\t\t\t}\n\t\t}\n\t]\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/block/water_purifier_filtering.json",
    "content": "{\n\t\"parent\": \"block/block\",\n\t\"textures\": {\n\t\t\"particle\": \"toughasnails:block/water_purifier_front\",\n\t\t\"top\": \"toughasnails:block/water_purifier_top\",\n\t\t\"inner\": \"toughasnails:block/water_purifier_inner\",\n\t\t\"front\": \"toughasnails:block/water_purifier_front\",\n\t\t\"side\": \"toughasnails:block/water_purifier_side\",\n\t\t\"bottom\": \"toughasnails:block/water_purifier_bottom\",\n\t\t\"water\": \"minecraft:block/water_still\"\n\t},\n\t\"elements\": [\n\t\t{\n\t\t\t\"from\": [0, 0, 0],\n\t\t\t\"to\": [16, 10, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#front\"},\n\t\t\t\t\"east\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#side\"},\n\t\t\t\t\"south\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#side\"},\n\t\t\t\t\"west\": {\"uv\": [0, 6, 16, 16], \"texture\": \"#side\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#inner\"},\n\t\t\t\t\"down\": {\"uv\": [0, 0, 16, 16], \"texture\": \"#bottom\", \"cullface\": \"down\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [0, 10, 0],\n\t\t\t\"to\": [16, 16, 16],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#front\"},\n\t\t\t\t\"east\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#side\"},\n\t\t\t\t\"south\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#side\"},\n\t\t\t\t\"west\": {\"uv\": [0, 0, 16, 6], \"texture\": \"#side\"},\n\t\t\t\t\"up\": {\"uv\": [0, 0, 16, 16], \"rotation\": 180, \"texture\": \"#top\", \"cullface\": \"up\"}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"from\": [1, 10, 1],\n\t\t\t\"to\": [15, 15, 15],\n\t\t\t\"faces\": {\n\t\t\t\t\"north\": {\"uv\": [1, 1, 15, 6], \"texture\": \"#water\", \"tintindex\": 0},\n\t\t\t\t\"east\": {\"uv\": [1, 1, 15, 6], \"texture\": \"#water\", \"tintindex\": 0},\n\t\t\t\t\"south\": {\"uv\": [1, 1, 15, 6], \"texture\": \"#water\", \"tintindex\": 0},\n\t\t\t\t\"west\": {\"uv\": [1, 1, 15, 6], \"texture\": \"#water\", \"tintindex\": 0},\n\t\t\t\t\"up\": {\"uv\": [1, 1, 15, 15], \"texture\": \"#water\", \"tintindex\": 0}\n\t\t\t}\n\t\t}\n\t]\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/item/rain_collector.json",
    "content": "{\n    \"parent\": \"toughasnails:block/rain_collector\"\n}\n\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/item/temperature_gauge.json",
    "content": "{\n  \"parent\": \"toughasnails:block/temperature_gauge\"\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/item/thermoregulator.json",
    "content": "{\n  \"parent\": \"toughasnails:block/thermoregulator\"\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/models/item/water_purifier.json",
    "content": "{\n  \"parent\": \"toughasnails:block/water_purifier\"\n}"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/particles/thermoregulator_cool.json",
    "content": "{\n  \"textures\": [\n    \"toughasnails:thermoregulator_cool_0\",\n    \"toughasnails:thermoregulator_cool_1\",\n    \"toughasnails:thermoregulator_cool_2\",\n\t\"toughasnails:thermoregulator_cool_3\"\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/particles/thermoregulator_neutral.json",
    "content": "{\n  \"textures\": [\n    \"toughasnails:thermoregulator_neutral_0\",\n    \"toughasnails:thermoregulator_neutral_1\",\n\t\"toughasnails:thermoregulator_neutral_2\",\n\t\"toughasnails:thermoregulator_neutral_3\"\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/particles/thermoregulator_warm.json",
    "content": "{\n  \"textures\": [\n    \"toughasnails:thermoregulator_warm_0\",\n    \"toughasnails:thermoregulator_warm_1\",\n    \"toughasnails:thermoregulator_warm_2\",\n\t\"toughasnails:thermoregulator_warm_3\"\n  ]\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/textures/block/temperature_gauge_inverted_top.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 30,\n    \"interpolate\": true,\n    \"frames\": [\n      0,\n      1,\n\t  2,\n\t  1\n\t]\n  }\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/textures/block/temperature_gauge_top.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 30,\n    \"interpolate\": true,\n    \"frames\": [\n      0,\n      1,\n\t  2,\n\t  1\n\t]\n  }\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/textures/block/thermoregulator_front_active.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 1\n  }\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/textures/block/thermoregulator_side_cooling.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 15,\n    \"interpolate\": true,\n    \"frames\": [\n      0,\n      1,\n\t  2,\n\t  2,\n\t  2,\n\t  1\n\t]\n  }\n}\n"
  },
  {
    "path": "common/src/main/resources/assets/toughasnails/textures/block/thermoregulator_side_heating.png.mcmeta",
    "content": "{\n  \"animation\": {\n    \"frametime\": 15,\n    \"interpolate\": true,\n    \"frames\": [\n      0,\n      1,\n\t  2,\n\t  2,\n\t  2,\n\t  1\n\t]\n  }\n}\n"
  },
  {
    "path": "common/src/main/resources/data/toughasnails/loot_table/chests/village/village_climatologist.json",
    "content": "{\n  \"type\": \"minecraft:chest\",\n  \"pools\": [\n    {\n      \"bonus_rolls\": 0.0,\n      \"entries\": [\n        {\n          \"type\": \"minecraft:item\",\n          \"name\": \"minecraft:emerald\"\n        },\n\t\t{\n          \"type\": \"minecraft:item\",\n          \"functions\": [\n            {\n              \"add\": false,\n              \"count\": {\n                \"type\": \"minecraft:uniform\",\n                \"max\": 4.0,\n                \"min\": 1.0\n              },\n              \"function\": \"minecraft:set_count\"\n            }\n          ],\n          \"name\": \"minecraft:charcoal\",\n          \"weight\": 5\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"functions\": [\n            {\n              \"add\": false,\n              \"count\": {\n                \"type\": \"minecraft:uniform\",\n                \"max\": 4.0,\n                \"min\": 1.0\n              },\n              \"function\": \"minecraft:set_count\"\n            }\n          ],\n          \"name\": \"minecraft:snowball\",\n          \"weight\": 5\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"functions\": [\n            {\n              \"add\": false,\n              \"count\": {\n                \"type\": \"minecraft:uniform\",\n                \"max\": 2.0,\n                \"min\": 1.0\n              },\n              \"function\": \"minecraft:set_count\"\n            }\n          ],\n          \"name\": \"minecraft:packed_ice\",\n          \"weight\": 2\n        },\n        {\n          \"type\": \"minecraft:item\",\n          \"functions\": [\n            {\n              \"add\": false,\n              \"count\": {\n                \"type\": \"minecraft:uniform\",\n                \"max\": 2.0,\n                \"min\": 1.0\n              },\n              \"function\": \"minecraft:set_count\"\n            }\n          ],\n          \"name\": \"minecraft:magma_block\",\n          \"weight\": 2\n        }\n      ],\n      \"rolls\": {\n        \"type\": \"minecraft:uniform\",\n        \"max\": 5.0,\n        \"min\": 1.0\n      }\n    }\n  ],\n  \"random_sequence\": \"toughasnails:chests/village/village_climatologist\"\n}"
  },
  {
    "path": "common/src/main/resources/pack.mcmeta",
    "content": "{\n  \"pack\": {\n    \"description\": \"Resources used for Tough As Nails\",\n    \"pack_format\": 13\n  }\n}\n"
  },
  {
    "path": "common/src/main/resources/toughasnails.accesswidener",
    "content": "accessWidener v1 named\n\n# MenuType registration\naccessible class net/minecraft/world/inventory/MenuType$MenuSupplier\naccessible class net/minecraft/client/gui/screens/MenuScreens$ScreenConstructor\naccessible method net/minecraft/client/gui/screens/MenuScreens register (Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/client/gui/screens/MenuScreens$ScreenConstructor;)V\naccessible method net/minecraft/world/inventory/MenuType <init> (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;Lnet/minecraft/world/flag/FeatureFlagSet;)V\n\n# Mob effect registration\naccessible method net/minecraft/world/effect/MobEffect <init> (Lnet/minecraft/world/effect/MobEffectCategory;I)V\n\n# Block entity registration\naccessible class net/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier\n\n# Item property registration\naccessible method net/minecraft/client/renderer/item/ItemProperties register (Lnet/minecraft/world/item/Item;Lnet/minecraft/resources/Identifier;Lnet/minecraft/client/renderer/item/ClampedItemPropertyFunction;)V\n\n# Particle registration\naccessible class net/minecraft/client/particle/ParticleEngine$SpriteParticleRegistration\naccessible method net/minecraft/core/particles/SimpleParticleType <init> (Z)V\n\n# Thirst\naccessible field net/minecraft/world/food/FoodData foodLevel I\naccessible field net/minecraft/world/food/FoodData saturationLevel F\naccessible field net/minecraft/world/food/FoodData exhaustionLevel F\naccessible field net/minecraft/world/food/FoodData tickTimer I\naccessible method net/minecraft/world/item/Item getPlayerPOVHitResult (Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/ClipContext$Fluid;)Lnet/minecraft/world/phys/BlockHitResult;\n\n# Gui\naccessible class net/minecraft/client/gui/Gui$HeartType\naccessible method net/minecraft/client/gui/Gui renderTextureOverlay (Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/resources/Identifier;F)V\n\n# Damage source\naccessible method net/minecraft/world/damagesource/DamageSources source (Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/world/damagesource/DamageSource;\n\n# Villages\naccessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool rawTemplates Ljava/util/List;\nmutable field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool rawTemplates Ljava/util/List;\naccessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool templates Lit/unimi/dsi/fastutil/objects/ObjectArrayList;\naccessible method net/minecraft/world/entity/ai/village/poi/PoiTypes registerBlockStates (Lnet/minecraft/core/Holder;Ljava/util/Set;)V\n\n# Particles\naccessible class net/minecraft/client/particle/ParticleResources$SpriteParticleRegistration\n\naccessible method net/minecraft/world/level/block/entity/BlockEntityType <init> (Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V\n\nmutable field net/minecraft/world/item/crafting/RecipeManager RECIPE_PROPERTY_SETS Ljava/util/Map;"
  },
  {
    "path": "common/src/main/resources/toughasnails.mixins.json",
    "content": "{\n  \"required\": true,\n  \"package\": \"toughasnails.mixin\",\n  \"compatibilityLevel\": \"JAVA_17\",\n  \"refmap\": \"toughasnails.refmap.json\",\n  \"mixins\": [\n    \"MixinFoodData\",\n    \"MixinLivingEntity\",\n    \"MixinPlayer\",\n    \"MixinPotionBrewing\",\n    \"MixinRecipeManager\",\n    \"MixinServerLevel\",\n    \"MixinServerPlayer\"\n  ],\n  \"client\": [\n    \"client.MixinGui\",\n    \"client.MixinItemStack\",\n    \"client.MixinLocalPlayer\",\n    \"client.MixinRangeSelectItemModelProperties\"\n  ],\n  \"injectors\": {\n    \"defaultRequire\": 1\n  },\n  \"minVersion\": \"0.8.4\"\n}"
  },
  {
    "path": "fabric/build.gradle",
    "content": "plugins {\n    id \"fabric-loom\" version \"1.13-SNAPSHOT\"\n    id \"com.matthewprenger.cursegradle\" version \"1.4.0\"\n}\n\nbase.archivesName.set(\"${mod_name}-fabric\")\n\ndependencies {\n    minecraft \"com.mojang:minecraft:${minecraft_version}\"\n    mappings loom.officialMojangMappings()\n    compileOnly project(\":Common\")\n    modImplementation \"net.fabricmc:fabric-loader:${fabric_loader_version}\"\n    modImplementation \"net.fabricmc.fabric-api:fabric-api:${fabric_version}\"\n    modImplementation \"com.github.glitchfiend:GlitchCore-fabric:${minecraft_version}-${glitchcore_version}\"\n    modImplementation \"com.github.glitchfiend:SereneSeasons-fabric:${minecraft_version}-${serene_seasons_version}\"\n    implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'\n\n    // Dependencies embedded in final jar\n    include implementation(\"com.electronwill.night-config:toml:${nightconfig_version}\")\n    include implementation(\"com.electronwill.night-config:core:${nightconfig_version}\")\n    include implementation(\"net.jodah:typetools:0.6.3\")\n}\n\nloom {\n    accessWidenerPath = project(\":Common\").file(\"src/main/resources/${mod_id}.accesswidener\")\n    mixin {\n        defaultRefmapName.set(\"${mod_id}.refmap.json\")\n    }\n    runs {\n        client {\n            client()\n            setConfigName(\"Fabric Client\")\n            ideConfigGenerated(true)\n            runDir(\"run\")\n        }\n        server {\n            server()\n            setConfigName(\"Fabric Server\")\n            ideConfigGenerated(true)\n            runDir(\"run\")\n        }\n    }\n}\n\nprocessResources {\n    from project(\":Common\").sourceSets.main.resources\n}\n\ntasks.withType(JavaCompile) {\n    source(project(\":Common\").sourceSets.main.allSource)\n}\n\ncurseforge {\n    apiKey = project.findProperty('curseApiKey') ?: 'unset'\n    project {\n        id = mod_curseforge_id\n\n        if (changelog_file.exists()) {\n            changelog = changelog_file\n        }\n\n        releaseType = release_channel\n        addGameVersion minecraft_version\n        addGameVersion name\n\n        mainArtifact(remapJar) {\n            displayName = \"${mod_display_name} ${name} ${version}\"\n        }\n\n        relations {\n            requiredDependency 'fabric-api'\n            requiredDependency 'glitchcore'\n        }\n    }\n}"
  },
  {
    "path": "fabric/src/main/java/toughasnails/fabric/core/ToughAsNailsFabric.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.fabric.core;\n\nimport glitchcore.fabric.GlitchCoreInitializer;\nimport net.fabricmc.fabric.api.event.lifecycle.v1.CommonLifecycleEvents;\nimport net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;\nimport toughasnails.core.ToughAsNails;\n\npublic class ToughAsNailsFabric implements GlitchCoreInitializer\n{\n    @Override\n    public void onInitialize()\n    {\n        ToughAsNails.init();\n\n        ServerLifecycleEvents.SERVER_STARTING.register(ToughAsNails::onServerAboutToStart);\n    }\n\n    @Override\n    public void onInitializeClient()\n    {\n        ToughAsNails.setupClient();\n    }\n}\n"
  },
  {
    "path": "fabric/src/main/java/toughasnails/fabric/mixin/client/MixinGui.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.fabric.mixin.client;\n\nimport net.minecraft.client.gui.Gui;\nimport net.minecraft.client.gui.GuiGraphics;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.temperature.TemperatureHooksClient;\n\n@Mixin(Gui.class)\npublic class MixinGui\n{\n    @Inject(method=\"renderSelectedItemName\", at=@At(value=\"HEAD\"))\n    public void onRenderSelectedItemNameBegin(GuiGraphics guiGraphics, CallbackInfo ci)\n    {\n        guiGraphics.pose().pushMatrix();\n        TemperatureHooksClient.adjustSelectedItemText(guiGraphics);\n    }\n\n    @Inject(method=\"renderSelectedItemName\", at=@At(value=\"TAIL\"))\n    public void onRenderSelectedItemNameEnd(GuiGraphics guiGraphics, CallbackInfo ci)\n    {\n        guiGraphics.pose().popMatrix();\n    }\n}\n"
  },
  {
    "path": "fabric/src/main/resources/fabric.mod.json",
    "content": "{\n  \"schemaVersion\": 1,\n  \"id\": \"${mod_id}\",\n  \"version\": \"${mod_version}\",\n  \"name\": \"${mod_name}\",\n  \"description\": \"${mod_description}\",\n  \"authors\": [\n    \"Adubbz\",\n    \"Forstride\"\n  ],\n  \"contact\": {\n    \"homepage\": \"${mod_page_url}\",\n    \"sources\": \"${mod_git_url}\"\n  },\n  \"license\": \"${mod_license}\",\n  \"icon\": \"assets/toughasnails/textures/item/tan_icon.png\",\n  \"environment\": \"*\",\n  \"entrypoints\": {\n    \"glitchcore\": [\n      \"toughasnails.fabric.core.ToughAsNailsFabric\"\n    ]\n  },\n  \"mixins\": [\n    \"${mod_id}.mixins.json\",\n    \"${mod_id}.fabric.mixins.json\"\n  ],\n  \"depends\": {\n    \"fabricloader\": \"*\",\n    \"fabric\": \"*\",\n    \"minecraft\": \"${minecraft_version}\",\n    \"java\": \">=17\",\n    \"glitchcore\": \">=${glitchcore_version}\"\n  },\n  \"accessWidener\": \"${mod_id}.accesswidener\",\n  \"custom\": {\n    \"modmenu\": {\n      \"links\": {\n        \"modmenu.discord\": \"${mod_discord_url}\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "fabric/src/main/resources/toughasnails.fabric.mixins.json",
    "content": "{\n  \"required\": true,\n  \"package\": \"toughasnails.fabric.mixin\",\n  \"compatibilityLevel\": \"JAVA_17\",\n  \"refmap\": \"toughasnails.refmap.json\",\n  \"mixins\": [\n  ],\n  \"client\": [\n    \"client.MixinGui\"\n  ],\n  \"injectors\": {\n    \"defaultRequire\": 1\n  },\n  \"minVersion\": \"0.8.4\"\n}"
  },
  {
    "path": "forge/build.gradle",
    "content": "plugins {\n    id \"net.minecraftforge.gradle\" version \"6.+\"\n    id \"org.spongepowered.mixin\" version \"0.7-SNAPSHOT\"\n    id \"com.matthewprenger.cursegradle\" version \"1.4.0\"\n}\n\nbase.archivesName.set(\"${mod_name}-forge\")\n\nmixin {\n    config(\"${mod_id}.mixins.json\")\n    config(\"${mod_id}.forge.mixins.json\")\n}\n\n// As of 1.20.6 Forge no longer has reobf tasks. This has broken mixins adding configs correctly into the manifest file\n// See: https://github.com/SpongePowered/MixinGradle/blob/f800b26d2b180d98d9aa9355e5b3086d71218508/src/main/groovy/org/spongepowered/asm/gradle/plugins/MixinExtension.groovy#L184\n// Instead, we will do it ourselves.\njar {\n    manifest {\n        attributes([\n                'MixinConfigs': \"${mod_id}.mixins.json\" + \",\" + \"${mod_id}.forge.mixins.json\",\n        ])\n    }\n}\n\nminecraft {\n    mappings channel: 'official', version: minecraft_version\n    copyIdeResources = true //Calls processResources when in dev\n\n    if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) {\n        accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')\n    }\n\n    reobf = false\n\n    runs {\n        client {\n            workingDirectory project.file('run')\n            ideaModule \"${rootProject.name}.${project.name}.main\"\n            taskName 'Client'\n            mods {\n                modClientRun {\n                    source sourceSets.main\n                }\n            }\n        }\n\n        server {\n            workingDirectory project.file('run')\n            ideaModule \"${rootProject.name}.${project.name}.main\"\n            taskName 'Server'\n            mods {\n                modServerRun {\n                    source sourceSets.main\n                }\n            }\n        }\n    }\n}\n\ndependencies {\n    minecraft \"net.minecraftforge:forge:${minecraft_version}-${forge_version}\"\n    compileOnly project(\":Common\")\n    implementation 'com.github.glitchfiend:GlitchCore-forge:' + minecraft_version + '-' + glitchcore_version\n    implementation \"com.github.glitchfiend:SereneSeasons-forge:${minecraft_version}-${serene_seasons_version}\"\n    annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'\n\n    // Hack fix for now, force jopt-simple to be exactly 5.0.4 because Mojang ships that version, but some transtive dependencies request 6.0+\n    implementation('net.sf.jopt-simple:jopt-simple:5.0.4') { version { strictly '5.0.4' } }\n}\n\ntasks.withType(JavaCompile).configureEach {\n    source(project(\":Common\").sourceSets.main.allSource)\n}\n\ntasks.withType(Javadoc).configureEach {\n    source(project(\":Common\").sourceSets.main.allJava)\n}\n\ntasks.named(\"sourcesJar\", Jar) {\n    from(project(\":Common\").sourceSets.main.allSource)\n}\n\nprocessResources {\n    from project(\":Common\").sourceSets.main.resources\n}\n\n// Merge the resources and classes into the same directory.\n// This is done because java expects modules to be in a single directory.\n// And if we have it in multiple we have to do performance intensive hacks like having the UnionFileSystem\n// This will eventually be migrated to ForgeGradle so modders don't need to manually do it. But that is later.\nsourceSets.each {\n    def dir = layout.buildDirectory.dir(\"sourcesSets/$it.name\")\n    it.output.resourcesDir = dir\n    it.java.destinationDirectory = dir\n}\n\ncurseforge {\n    apiKey = project.findProperty('curseApiKey') ?: 'unset'\n    project {\n        id = mod_curseforge_id\n\n        if (changelog_file.exists()) {\n            changelog = changelog_file\n        }\n\n        releaseType = release_channel\n        addGameVersion minecraft_version\n        addGameVersion name\n\n        mainArtifact(jar) {\n            displayName = \"${mod_display_name} ${name} ${version}\"\n        }\n\n        relations {\n            requiredDependency 'glitchcore'\n        }\n    }\n}"
  },
  {
    "path": "forge/src/main/java/toughasnails/forge/core/ToughAsNailsForge.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.forge.core;\n\nimport net.minecraftforge.event.server.ServerStartingEvent;\nimport net.minecraftforge.fml.common.Mod;\nimport net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;\nimport toughasnails.core.ToughAsNails;\n\n@Mod(value = ToughAsNails.MOD_ID)\npublic class ToughAsNailsForge\n{\n    public ToughAsNailsForge()\n    {\n        ServerStartingEvent.BUS.addListener(this::serverAboutToStart);\n        ToughAsNails.init();\n    }\n\n    private void clientSetup(final FMLClientSetupEvent event)\n    {\n        event.enqueueWork(ToughAsNails::setupClient);\n    }\n\n    private void serverAboutToStart(final ServerStartingEvent event)\n    {\n        ToughAsNails.onServerAboutToStart(event.getServer());\n    }\n}\n"
  },
  {
    "path": "forge/src/main/java/toughasnails/forge/mixin/MixinTemperatureHelperImpl.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.forge.mixin;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Holder;\nimport net.minecraft.world.level.Level;\nimport net.minecraft.world.level.biome.Biome;\nimport net.minecraftforge.fml.ModList;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Overwrite;\nimport toughasnails.init.ModCompatibility;\nimport toughasnails.temperature.TemperatureHelperImpl;\n\n@Mixin(value = TemperatureHelperImpl.class, remap = false)\npublic abstract class MixinTemperatureHelperImpl\n{\n    @Overwrite\n    private static boolean coldEnoughToSnow(Level level, Holder<Biome> biome, BlockPos pos)\n    {\n        if (ModList.get().isLoaded(\"sereneseasons\"))\n        {\n            return ModCompatibility.coldEnoughToSnowSeasonal(level, biome, pos);\n        }\n        else\n        {\n            return biome.value().coldEnoughToSnow(pos, level.getSeaLevel());\n        }\n    }\n}\n"
  },
  {
    "path": "forge/src/main/java/toughasnails/forge/mixin/MixinThermoregulatorBlockEntity.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.forge.mixin;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.world.WorldlyContainer;\nimport net.minecraft.world.level.block.entity.BaseContainerBlockEntity;\nimport net.minecraft.world.level.block.entity.BlockEntityType;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraftforge.common.capabilities.Capability;\nimport net.minecraftforge.common.capabilities.ForgeCapabilities;\nimport net.minecraftforge.common.util.LazyOptional;\nimport net.minecraftforge.items.IItemHandler;\nimport net.minecraftforge.items.wrapper.SidedInvWrapper;\nimport org.jetbrains.annotations.Nullable;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Unique;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.block.entity.ThermoregulatorBlockEntity;\nimport toughasnails.block.entity.WaterPurifierBlockEntity;\n\n@Mixin(value = ThermoregulatorBlockEntity.class)\npublic abstract class MixinThermoregulatorBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer {\n    protected MixinThermoregulatorBlockEntity(BlockEntityType<?> p_155076_, BlockPos p_155077_, BlockState p_155078_) {\n        super(p_155076_, p_155077_, p_155078_);\n    }\n\n    @Unique\n    LazyOptional<? extends IItemHandler>[] handlers;\n\n    @Inject(method=\"<init>\", at=@At(\"RETURN\"))\n    public void onConstructed(BlockPos pos, BlockState state, CallbackInfo ci)\n    {\n        this.handlers = SidedInvWrapper.create(this, Direction.UP, Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST);\n    }\n\n    @Override\n    public <T> LazyOptional<T> getCapability(Capability<T> capability, @Nullable Direction facing)\n    {\n        if (!this.remove && facing != null && capability == ForgeCapabilities.ITEM_HANDLER) {\n            if (facing == Direction.UP)\n                return handlers[0].cast();\n            else if (facing == Direction.DOWN)\n                return handlers[1].cast();\n            else\n                return handlers[2].cast();\n        }\n        return super.getCapability(capability, facing);\n    }\n\n    @Override\n    public void invalidateCaps()\n    {\n        super.invalidateCaps();\n        for (int x = 0; x < handlers.length; x++)\n            handlers[x].invalidate();\n    }\n\n    @Override\n    public void reviveCaps()\n    {\n        super.reviveCaps();\n        this.handlers = SidedInvWrapper.create(this, Direction.UP, Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST);\n    }\n}\n"
  },
  {
    "path": "forge/src/main/java/toughasnails/forge/mixin/MixinWaterPurifierBlockEntity.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.forge.mixin;\n\nimport net.minecraft.core.BlockPos;\nimport net.minecraft.core.Direction;\nimport net.minecraft.world.WorldlyContainer;\nimport net.minecraft.world.level.block.entity.BaseContainerBlockEntity;\nimport net.minecraft.world.level.block.entity.BlockEntityType;\nimport net.minecraft.world.level.block.state.BlockState;\nimport net.minecraftforge.common.capabilities.Capability;\nimport net.minecraftforge.common.capabilities.ForgeCapabilities;\nimport net.minecraftforge.common.util.LazyOptional;\nimport net.minecraftforge.items.IItemHandler;\nimport net.minecraftforge.items.wrapper.SidedInvWrapper;\nimport org.jetbrains.annotations.Nullable;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.Unique;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.block.entity.WaterPurifierBlockEntity;\n\n@Mixin(value = WaterPurifierBlockEntity.class)\npublic abstract class MixinWaterPurifierBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer {\n    protected MixinWaterPurifierBlockEntity(BlockEntityType<?> p_155076_, BlockPos p_155077_, BlockState p_155078_) {\n        super(p_155076_, p_155077_, p_155078_);\n    }\n\n    @Unique\n    LazyOptional<? extends IItemHandler>[] handlers;\n\n    @Inject(method=\"<init>\", at=@At(\"RETURN\"))\n    public void onConstructed(BlockPos pos, BlockState state, CallbackInfo ci)\n    {\n        this.handlers = SidedInvWrapper.create(this, Direction.UP, Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST);\n    }\n\n    @Override\n    public <T> LazyOptional<T> getCapability(Capability<T> capability, @Nullable Direction facing)\n    {\n        if (!this.remove && facing != null && capability == ForgeCapabilities.ITEM_HANDLER) {\n            if (facing == Direction.UP)\n                return handlers[0].cast();\n            else if (facing == Direction.DOWN)\n                return handlers[1].cast();\n            else\n                return handlers[2].cast();\n        }\n        return super.getCapability(capability, facing);\n    }\n\n    @Override\n    public void invalidateCaps()\n    {\n        super.invalidateCaps();\n        for (int x = 0; x < handlers.length; x++)\n            handlers[x].invalidate();\n    }\n\n    @Override\n    public void reviveCaps()\n    {\n        super.reviveCaps();\n        this.handlers = SidedInvWrapper.create(this, Direction.UP, Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST);\n    }\n}\n"
  },
  {
    "path": "forge/src/main/java/toughasnails/forge/mixin/client/MixinGui.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.forge.mixin.client;\n\nimport net.minecraft.client.gui.Gui;\nimport net.minecraft.client.gui.GuiGraphics;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.temperature.TemperatureHooksClient;\n\n@Mixin(Gui.class)\npublic class MixinGui\n{\n    @Inject(method=\"renderSelectedItemName(Lnet/minecraft/client/gui/GuiGraphics;I)V\", at=@At(value=\"HEAD\"), remap = false)\n    public void onRenderSelectedItemNameBegin(GuiGraphics guiGraphics, int yShift, CallbackInfo ci)\n    {\n        guiGraphics.pose().pushMatrix();\n        TemperatureHooksClient.adjustSelectedItemText(guiGraphics);\n    }\n\n    @Inject(method=\"renderSelectedItemName(Lnet/minecraft/client/gui/GuiGraphics;I)V\", at=@At(value=\"TAIL\"), remap = false)\n    public void onRenderSelectedItemNameEnd(GuiGraphics guiGraphics, int yShift, CallbackInfo ci)\n    {\n        guiGraphics.pose().popMatrix();\n    }\n}\n"
  },
  {
    "path": "forge/src/main/resources/META-INF/accesstransformer.cfg",
    "content": "public net.minecraft.world.effect.MobEffect <init>(Lnet/minecraft/world/effect/MobEffectCategory;I)V\n\n# Thirst transformers\npublic net.minecraft.world.item.Item m_41435_(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/ClipContext$Fluid;)Lnet/minecraft/world/phys/BlockHitResult; #getPlayerPOVHitResult\npublic net.minecraft.world.food.FoodData *\n\n#Temperature transformers\npublic net.minecraft.client.gui.Gui f_168666_ #POWDER_SNOW_OUTLINE_LOCATION\npublic net.minecraft.client.gui.Gui m_280155_(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/resources/Identifier;F)V #renderTextureOverlay\n\n# DamageSources\npublic net.minecraft.world.damagesource.DamageSources *()\n\n# Gui\npublic net.minecraft.client.gui.Gui$HeartType\npublic net.minecraft.client.gui.Gui f_279580_ #GUI_ICONS_LOCATION\n\n# Villages\npublic-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210559_ #rawTemplates\npublic net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool f_210560_ #templates\npublic net.minecraft.world.entity.ai.village.poi.PoiTypes m_246216_(Lnet/minecraft/core/Holder;Ljava/util/Set;)V #registerBlockStates\n\npublic net.minecraft.world.level.block.entity.BlockEntityType <init>(Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V\n\npublic-f net.minecraft.world.item.crafting.RecipeManager f_347382_ #RECIPE_PROPERTY_SETS"
  },
  {
    "path": "forge/src/main/resources/META-INF/mods.toml",
    "content": "modLoader=\"javafml\"\nlicense=\"${mod_license}\"\nloaderVersion=\"${forge_loader_version_range}\"\nissueTrackerURL=\"${mod_issues_url}\"\ndisplayURL=\"${mod_page_url}\"\nlogoFile=\"${mod_id}_logo.png\"\n\n[[mods]]\n    modId=\"${mod_id}\"\n    version=\"${mod_version}\"\n    displayName=\"${mod_display_name}\"\n\tauthors=\"${mod_authors}\"\n    description=\"${mod_description}\"\n\n[[dependencies.${mod_id}]]\n    modId=\"forge\"\n    mandatory=true\n    versionRange=\"${forge_version_range}\"\n    ordering=\"NONE\"\n    side=\"BOTH\"\n\n[[dependencies.${mod_id}]]\n    modId=\"glitchcore\"\n    mandatory=true\n    versionRange=\"[${glitchcore_version},)\"\n    ordering=\"AFTER\"\n    side=\"BOTH\"\n\n[[dependencies.${mod_id}]]\n    modId=\"sereneseasons\"\n    mandatory=false\n    versionRange=\"[${serene_seasons_version},)\"\n    ordering=\"AFTER\"\n    side=\"BOTH\""
  },
  {
    "path": "forge/src/main/resources/toughasnails.forge.mixins.json",
    "content": "{\n  \"required\": true,\n  \"package\": \"toughasnails.forge.mixin\",\n  \"compatibilityLevel\": \"JAVA_17\",\n  \"refmap\": \"toughasnails.refmap.json\",\n  \"mixins\": [\n    \"MixinTemperatureHelperImpl\",\n    \"MixinThermoregulatorBlockEntity\",\n    \"MixinWaterPurifierBlockEntity\"\n  ],\n  \"client\": [\n    \"client.MixinGui\"\n  ],\n  \"injectors\": {\n    \"defaultRequire\": 1\n  },\n  \"minVersion\": \"0.8.4\"\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project\ngroup=com.github.glitchfiend\nrelease_channel=beta\n\n# Common\nminecraft_version=1.21.11\n\n# Forge\nforge_version=61.0.2\nforge_version_range=[61.0.2,)\nforge_loader_version_range=[61,)\n\n# NeoForge\nneoforge_version=21.11.6-beta\nneoforge_version_range=[21.11,)\nneoforge_loader_version_range=[1,)\n\n# Fabric\nfabric_version=0.139.5+1.21.11\nfabric_loader_version=0.18.2\n\n\n# Mod options\nmod_id=toughasnails\nmod_name=ToughAsNails\nmod_display_name=Tough As Nails\nmod_authors=Adubbz, Forstride\nmod_description=Adds features to enhance survival mode and increase the game's difficulty.\nmod_license=All Rights Reserved\nmod_page_url=https://www.curseforge.com/minecraft/mc-mods/tough-as-nails\nmod_issues_url=https://github.com/Glitchfiend/ToughAsNails/issues\nmod_git_url=https://github.com/Glitchfiend/ToughAsNails\nmod_scm_url=scm:git:git@github.com:Glitchfiend/ToughAsNails.git\nmod_discord_url=https://discord.gg/GyyzU6T\nmod_curseforge_id=246391\nmod_modrinth_id=tough-as-nails\n\n# Gradle\norg.gradle.jvmargs=-Xmx3G\norg.gradle.daemon=false\n\n# Dependencies\nnightconfig_version=3.6.7\nglitchcore_version=21.11.0.1\nserene_seasons_version=21.11.0.0\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd \"${APP_HOME:-./}\" > /dev/null && pwd -P ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\"==\"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\n@rem This is normally unused\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif %ERRORLEVEL% equ 0 goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif %ERRORLEVEL% equ 0 goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nset EXIT_CODE=%ERRORLEVEL%\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\nexit /b %EXIT_CODE%\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "neoforge/build.gradle",
    "content": "plugins {\n    id 'net.neoforged.moddev' version '2.0.124'\n    id \"com.matthewprenger.cursegradle\" version \"1.4.0\"\n}\n\nbase.archivesName.set(\"${mod_name}-neoforge\")\n\nneoForge {\n    version = neoforge_version\n    // Automatically enable neoforge AccessTransformers if the file exists\n    def at = project(':Common').file('src/main/resources/META-INF/accesstransformer.cfg')\n    if (at.exists()) {\n        accessTransformers.from(at.absolutePath)\n    }\n    def resources = project(':Common').file('src/generated/resources/').getAbsolutePath()\n    runs {\n        configureEach {\n            systemProperty('neoforge.enabledGameTestNamespaces', mod_id)\n            ideName = \"NeoForge ${it.name.capitalize()} (${project.path})\" // Unify the run config names with fabric\n        }\n        client {\n            client()\n        }\n        data {\n            clientData()\n            programArguments.addAll '--mod', project.mod_id, '--all', '--output', resources, '--existing', resources\n        }\n        server {\n            server()\n        }\n    }\n    mods {\n        \"${mod_id}\" {\n            sourceSet sourceSets.main\n        }\n    }\n}\n\ndependencies {\n    implementation \"net.neoforged:neoforge:${neoforge_version}\"\n    compileOnly project(\":Common\")\n    implementation 'com.github.glitchfiend:GlitchCore-neoforge:' + minecraft_version + '-' + glitchcore_version\n    implementation \"com.github.glitchfiend:SereneSeasons-neoforge:${minecraft_version}-${serene_seasons_version}\"\n}\n\n// NeoGradle compiles the game, but we don't want to add our common code to the game's code\nTaskCollection.metaClass.excludingNeoTasks = { ->\n    delegate.matching { !it.name.startsWith(\"neo\") }\n}\n\ntasks.withType(JavaCompile).excludingNeoTasks().configureEach {\n    source(project(\":Common\").sourceSets.main.allSource)\n}\n\ntasks.withType(Javadoc).excludingNeoTasks().configureEach {\n    source(project(\":Common\").sourceSets.main.allJava)\n}\n\ntasks.named(\"sourcesJar\", Jar) {\n    from(project(\":Common\").sourceSets.main.allSource)\n}\n\ntasks.withType(ProcessResources).excludingNeoTasks().configureEach {\n    from project(\":Common\").sourceSets.main.resources\n    filesMatching(\"${mod_id}.mixins.json\") {\n        expand \"refmap_target\": \"${mod_id}.\"\n    }\n}\n\ncurseforge {\n    apiKey = project.findProperty('curseApiKey') ?: 'unset'\n    project {\n        id = mod_curseforge_id\n\n        if (changelog_file.exists()) {\n            changelog = changelog_file\n        }\n\n        releaseType = release_channel\n        addGameVersion minecraft_version\n        addGameVersion name\n\n        mainArtifact(jar) {\n            displayName = \"${mod_display_name} ${name} ${version}\"\n        }\n\n        relations {\n            requiredDependency 'glitchcore'\n            requiredDependency 'terrablender-neoforge'\n        }\n    }\n}"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/core/ToughAsNailsNeoForge.java",
    "content": "/*******************************************************************************\n * Copyright 2021, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.core;\n\nimport glitchcore.neoforge.GlitchCoreNeoForge;\nimport net.neoforged.bus.api.IEventBus;\nimport net.neoforged.fml.common.Mod;\nimport net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;\nimport net.neoforged.neoforge.common.NeoForge;\nimport net.neoforged.neoforge.event.server.ServerStartingEvent;\nimport toughasnails.core.ToughAsNails;\n\n@Mod(value = ToughAsNails.MOD_ID)\npublic class ToughAsNailsNeoForge\n{\n    public ToughAsNailsNeoForge(IEventBus bus)\n    {\n        bus.addListener(this::clientSetup);\n        NeoForge.EVENT_BUS.addListener(this::serverAboutToStart);\n\n        ToughAsNails.init();\n        GlitchCoreNeoForge.prepareModEventHandlers(bus);\n    }\n\n    private void clientSetup(final FMLClientSetupEvent event)\n    {\n        event.enqueueWork(ToughAsNails::setupClient);\n    }\n\n    private void serverAboutToStart(final ServerStartingEvent event)\n    {\n        ToughAsNails.onServerAboutToStart(event.getServer());\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/DataGenerationHandler.java",
    "content": "/************************************************************************even*******\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.RegistrySetBuilder;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.DataGenerator;\nimport net.minecraft.data.PackOutput;\nimport net.neoforged.bus.api.SubscribeEvent;\nimport net.neoforged.fml.common.EventBusSubscriber;\nimport net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider;\nimport net.neoforged.neoforge.data.event.GatherDataEvent;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModEnchantments;\nimport toughasnails.neoforge.datagen.loot.TANLootTableProvider;\nimport toughasnails.neoforge.datagen.model.TANEquipmentAssetProvider;\nimport toughasnails.neoforge.datagen.model.TANModelProvider;\nimport toughasnails.neoforge.datagen.provider.*;\n\nimport java.util.Set;\nimport java.util.concurrent.CompletableFuture;\n\n@EventBusSubscriber(modid = ToughAsNails.MOD_ID)\npublic class DataGenerationHandler\n{\n    private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()\n        .add(Registries.DAMAGE_TYPE, ModDamageTypes::bootstrap)\n        .add(Registries.ENCHANTMENT, ModEnchantments::bootstrap);\n\n    @SubscribeEvent\n    public static void onGatherData(GatherDataEvent.Client event)\n    {\n        DataGenerator generator = event.getGenerator();\n        PackOutput output = generator.getPackOutput();\n        CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();\n\n        var datapackProvider = generator.addProvider(true, new DatapackBuiltinEntriesProvider(output, lookupProvider, BUILDER, Set.of(ToughAsNails.MOD_ID)));\n\n        // Recipes\n        generator.addProvider(true, new TANRecipeProvider.Runner(output, event.getLookupProvider()));\n\n        // Loot\n        generator.addProvider(true, TANLootTableProvider.create(output, event.getLookupProvider()));\n\n        // Tags\n        var blocksTagProvider = generator.addProvider(true, new TANBlockTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANItemTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANBiomeTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANDamageTypeTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANTrimMaterialTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANPoiTypesTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANEnchantmentTagsProvider(output, datapackProvider.getRegistryProvider()));\n        generator.addProvider(true, new TANEntityTypeTagsProvider(output, datapackProvider.getRegistryProvider()));\n\n        // Client\n        generator.addProvider(true, new TANEquipmentAssetProvider(output));\n        generator.addProvider(true, new TANModelProvider(output));\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/ModDamageTypes.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen;\n\nimport net.minecraft.data.worldgen.BootstrapContext;\nimport net.minecraft.world.damagesource.DamageType;\nimport toughasnails.api.damagesource.TANDamageTypes;\n\npublic class ModDamageTypes\n{\n    protected static void bootstrap(BootstrapContext<DamageType> context)\n    {\n        context.register(TANDamageTypes.HYPERTHERMIA, new DamageType(\"toughasnails.hyperthermia\", 0.1F));\n        context.register(TANDamageTypes.THIRST, new DamageType(\"toughasnails.thirst\", 0.0F));\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/loot/TANBlockLoot.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.loot;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.registries.BuiltInRegistries;\nimport net.minecraft.data.loot.BlockLootSubProvider;\nimport net.minecraft.world.flag.FeatureFlags;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.level.block.Block;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.Map;\nimport java.util.Set;\n\npublic class TANBlockLoot extends BlockLootSubProvider\n{\n    private static final Set<Item> EXPLOSION_RESISTANT = Set.of();\n\n    public TANBlockLoot(HolderLookup.Provider provider)\n    {\n        super(EXPLOSION_RESISTANT, FeatureFlags.REGISTRY.allFlags(), provider);\n    }\n\n    @Override\n    protected void generate()\n    {\n        this.dropSelf(TANBlocks.THERMOREGULATOR);\n        this.dropSelf(TANBlocks.TEMPERATURE_GAUGE);\n        this.dropSelf(TANBlocks.RAIN_COLLECTOR);\n        this.dropSelf(TANBlocks.WATER_PURIFIER);\n    }\n\n    @Override\n    protected Iterable<Block> getKnownBlocks()\n    {\n        return BuiltInRegistries.BLOCK.entrySet().stream().filter(e -> e.getKey().identifier().getNamespace().equals(ToughAsNails.MOD_ID)).map(Map.Entry::getValue).toList();\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/loot/TANLootTableProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.loot;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.loot.LootTableProvider;\nimport net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;\n\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANLootTableProvider\n{\n    public static LootTableProvider create(PackOutput output, CompletableFuture<HolderLookup.Provider> lookup)\n    {\n        return new LootTableProvider(output, Set.of(), List.of(new LootTableProvider.SubProviderEntry(TANBlockLoot::new, LootContextParamSets.BLOCK)), lookup);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/model/TANEquipmentAssetProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.model;\n\nimport net.minecraft.client.resources.model.EquipmentClientInfo;\nimport net.minecraft.data.CachedOutput;\nimport net.minecraft.data.DataProvider;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.equipment.EquipmentAsset;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModEquipmentAssets;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.function.BiConsumer;\n\npublic class TANEquipmentAssetProvider implements DataProvider\n{\n    private final PackOutput.PathProvider pathProvider;\n\n    public TANEquipmentAssetProvider(PackOutput output)\n    {\n        this.pathProvider = output.createPathProvider(PackOutput.Target.RESOURCE_PACK, \"equipment\");\n    }\n\n    private static void bootstrap(BiConsumer<ResourceKey<EquipmentAsset>, EquipmentClientInfo> output)\n    {\n        output.accept(\n                ModEquipmentAssets.LEAF,\n                EquipmentClientInfo.builder()\n                        .addHumanoidLayers(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, \"leaf\"), true)\n                        .addHumanoidLayers(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, \"leaf_overlay\"), true)\n                        .build()\n        );\n        output.accept(\n                ModEquipmentAssets.WOOL,\n                EquipmentClientInfo.builder()\n                        .addHumanoidLayers(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, \"wool\"), true)\n                        .addHumanoidLayers(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, \"wool_overlay\"), false)\n                        .build()\n        );\n    }\n\n    @Override\n    public CompletableFuture<?> run(CachedOutput output)\n    {\n        Map<ResourceKey<EquipmentAsset>, EquipmentClientInfo> map = new HashMap<>();\n        bootstrap((key, info) -> {\n            if (map.putIfAbsent(key, info) != null) {\n                throw new IllegalStateException(\"Tried to register equipment asset twice for id: \" + key);\n            }\n        });\n        return DataProvider.saveAll(output, EquipmentClientInfo.CODEC, this.pathProvider::json, map);\n    }\n\n    @Override\n    public String getName() {\n        return \"Equipment Asset Definitions\";\n    }\n}"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/model/TANItemModelGenerators.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.model;\n\nimport net.minecraft.client.color.item.Dye;\nimport net.minecraft.client.data.models.ItemModelGenerators;\nimport net.minecraft.client.data.models.ItemModelOutput;\nimport net.minecraft.client.data.models.model.*;\nimport net.minecraft.client.renderer.item.ItemModel;\nimport net.minecraft.client.renderer.item.RangeSelectItemModel;\nimport net.minecraft.client.renderer.item.SelectItemModel;\nimport net.minecraft.client.renderer.item.properties.select.TrimMaterialProperty;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.equipment.EquipmentAsset;\nimport net.minecraft.world.item.equipment.trim.TrimMaterial;\nimport net.minecraft.world.level.FoliageColor;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.client.item.TemperatureProperty;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModEquipmentAssets;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.BiConsumer;\n\npublic class TANItemModelGenerators extends ItemModelGenerators\n{\n    public static final Identifier TRIM_PREFIX_HELMET = prefixForSlotTrim(\"helmet\");\n    public static final Identifier TRIM_PREFIX_CHESTPLATE = prefixForSlotTrim(\"chestplate\");\n    public static final Identifier TRIM_PREFIX_LEGGINGS = prefixForSlotTrim(\"leggings\");\n    public static final Identifier TRIM_PREFIX_BOOTS = prefixForSlotTrim(\"boots\");\n\n    public final ItemModelOutput itemModelOutput;\n    public final BiConsumer<Identifier, ModelInstance> modelOutput;\n\n    public TANItemModelGenerators(ItemModelOutput itemModelOutput, BiConsumer<Identifier, ModelInstance> modelOutput)\n    {\n        super(itemModelOutput, modelOutput);\n        this.itemModelOutput = itemModelOutput;\n        this.modelOutput = modelOutput;\n    }\n\n    @Override\n    public void run()\n    {\n        this.generateFlatItem(TANItems.ICE_CREAM, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.CHARC_0S, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.EMPTY_LEATHER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.LEATHER_DIRTY_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.LEATHER_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.LEATHER_PURIFIED_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.EMPTY_COPPER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.COPPER_DIRTY_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.COPPER_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.COPPER_PURIFIED_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.EMPTY_IRON_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.IRON_DIRTY_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.IRON_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.IRON_PURIFIED_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.EMPTY_GOLD_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.GOLD_DIRTY_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.GOLD_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.GOLD_PURIFIED_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.EMPTY_DIAMOND_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.DIAMOND_DIRTY_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.DIAMOND_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.DIAMOND_PURIFIED_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.EMPTY_NETHERITE_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.NETHERITE_DIRTY_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.NETHERITE_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.NETHERITE_PURIFIED_WATER_CANTEEN, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.DIRTY_WATER_BOTTLE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.PURIFIED_WATER_BOTTLE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.APPLE_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.CACTUS_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.CHORUS_FRUIT_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.GLOW_BERRY_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.MELON_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.PUMPKIN_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.SWEET_BERRY_JUICE, ModelTemplates.FLAT_ITEM);\n        this.generateFlatItem(TANItems.TAN_ICON, ModelTemplates.FLAT_ITEM);\n\n        this.generateTrimmableItemWithDefaultColor(TANItems.LEAF_HELMET, ModEquipmentAssets.LEAF, TRIM_PREFIX_HELMET, FoliageColor.FOLIAGE_DEFAULT);\n        this.generateTrimmableItemWithDefaultColor(TANItems.LEAF_CHESTPLATE, ModEquipmentAssets.LEAF, TRIM_PREFIX_CHESTPLATE, FoliageColor.FOLIAGE_DEFAULT);\n        this.generateTrimmableItemWithDefaultColor(TANItems.LEAF_LEGGINGS, ModEquipmentAssets.LEAF, TRIM_PREFIX_LEGGINGS, FoliageColor.FOLIAGE_DEFAULT);\n        this.generateTrimmableItemWithDefaultColor(TANItems.LEAF_BOOTS, ModEquipmentAssets.LEAF, TRIM_PREFIX_BOOTS, FoliageColor.FOLIAGE_DEFAULT);\n        this.generateTrimmableItem(TANItems.WOOL_HELMET, ModEquipmentAssets.WOOL, TRIM_PREFIX_HELMET, true);\n        this.generateTrimmableItem(TANItems.WOOL_CHESTPLATE, ModEquipmentAssets.WOOL, TRIM_PREFIX_CHESTPLATE, true);\n        this.generateTrimmableItem(TANItems.WOOL_LEGGINGS, ModEquipmentAssets.WOOL, TRIM_PREFIX_LEGGINGS, true);\n        this.generateTrimmableItem(TANItems.WOOL_BOOTS, ModEquipmentAssets.WOOL, TRIM_PREFIX_BOOTS, true);\n\n        this.generateThermometerItem(TANItems.THERMOMETER);\n    }\n\n    public void generateTrimmableItemWithDefaultColor(Item item, ResourceKey<EquipmentAsset> key, Identifier prefix, int defaultColor)\n    {\n        Identifier modelLocation = ModelLocationUtils.getModelLocation(item);\n        Identifier textureLocation = TextureMapping.getItemTexture(item);\n        Identifier overlayTextureLocation = TextureMapping.getItemTexture(item, \"_overlay\");\n        List<SelectItemModel.SwitchCase<ResourceKey<TrimMaterial>>> list = new ArrayList<>(TRIM_MATERIAL_MODELS.size());\n\n        for (ItemModelGenerators.TrimMaterialData itemmodelgenerators$trimmaterialdata : TRIM_MATERIAL_MODELS) {\n            Identifier Identifier3 = modelLocation.withSuffix(\"_\" + itemmodelgenerators$trimmaterialdata.assets().base().suffix() + \"_trim\");\n            Identifier Identifier4 = prefix.withSuffix(\"_\" + itemmodelgenerators$trimmaterialdata.assets().assetId(key).suffix());\n            ItemModel.Unbaked itemmodel$unbaked;\n            this.generateLayeredItem(Identifier3, textureLocation, overlayTextureLocation, Identifier4);\n            itemmodel$unbaked = ItemModelUtils.tintedModel(Identifier3, new Dye(defaultColor));\n\n            list.add(ItemModelUtils.when(itemmodelgenerators$trimmaterialdata.materialKey(), itemmodel$unbaked));\n        }\n\n        ItemModel.Unbaked itemmodel$unbaked1;\n        ModelTemplates.TWO_LAYERED_ITEM.create(modelLocation, TextureMapping.layered(textureLocation, overlayTextureLocation), this.modelOutput);\n        itemmodel$unbaked1 = ItemModelUtils.tintedModel(modelLocation, new Dye(defaultColor));\n\n        this.itemModelOutput.accept(item, ItemModelUtils.select(new TrimMaterialProperty(), itemmodel$unbaked1, list));\n    }\n\n    private static final int NUM_THERMOMETER_MODELS = 21;\n\n    public void generateThermometerItem(Item item)\n    {\n        List<RangeSelectItemModel.Entry> entries = new ArrayList<>();\n\n        for (int i = 0; i < NUM_THERMOMETER_MODELS; i++)\n        {\n            entries.add(ItemModelUtils.override(ItemModelUtils.plainModel(this.createFlatItemModel(item, String.format(\"_%02d\", i), ModelTemplates.FLAT_ITEM)), (float)i / (float)(NUM_THERMOMETER_MODELS - 1)));\n        }\n\n        this.itemModelOutput\n                .accept(\n                        item,\n                        ItemModelUtils.rangeSelect(new TemperatureProperty(), 1.0F, entries)\n                );\n    }\n\n    public static Identifier prefixForSlotTrim(String p_399619_) {\n        return Identifier.withDefaultNamespace(\"trims/items/\" + p_399619_ + \"_trim\");\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/model/TANModelProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.model;\n\nimport glitchcore.data.ModelProviderBase;\nimport net.minecraft.client.data.models.BlockModelGenerators;\nimport net.minecraft.client.data.models.ItemModelGenerators;\nimport net.minecraft.client.data.models.ItemModelOutput;\nimport net.minecraft.client.data.models.blockstates.BlockModelDefinitionGenerator;\nimport net.minecraft.client.data.models.model.ModelInstance;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.resources.Identifier;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.function.BiConsumer;\nimport java.util.function.Consumer;\n\npublic class TANModelProvider extends ModelProviderBase\n{\n    public TANModelProvider(PackOutput output)\n    {\n        super(output, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected BlockModelGenerators createBlockModelGenerators(Consumer<BlockModelDefinitionGenerator> consumer, ItemModelOutput itemModelOutput, BiConsumer<Identifier, ModelInstance> biConsumer) {\n        return null;\n    }\n\n    @Override\n    protected ItemModelGenerators createItemModelGenerators(ItemModelOutput itemModelOutput, BiConsumer<Identifier, ModelInstance> modelOutput) {\n        return new TANItemModelGenerators(itemModelOutput, modelOutput);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANBiomeTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.BiomeTagsProvider;\nimport net.minecraft.world.level.biome.Biomes;\nimport org.jetbrains.annotations.Nullable;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModTags;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANBiomeTagsProvider extends BiomeTagsProvider\n{\n    public TANBiomeTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, lookupProvider, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        // Temperature tags\n        this.tag(ModTags.Biomes.ICY_BIOMES).add(Biomes.ICE_SPIKES, Biomes.SNOWY_TAIGA, Biomes.SNOWY_PLAINS, Biomes.SNOWY_SLOPES, Biomes.GROVE, Biomes.JAGGED_PEAKS, Biomes.FROZEN_PEAKS, Biomes.SNOWY_BEACH, Biomes.FROZEN_RIVER, Biomes.FROZEN_OCEAN, Biomes.DEEP_FROZEN_OCEAN);\n        this.tag(ModTags.Biomes.COLD_BIOMES).add(Biomes.THE_END, Biomes.SMALL_END_ISLANDS, Biomes.END_MIDLANDS, Biomes.END_HIGHLANDS, Biomes.END_BARRENS, Biomes.DEEP_DARK, Biomes.TAIGA, Biomes.OLD_GROWTH_SPRUCE_TAIGA, Biomes.OLD_GROWTH_PINE_TAIGA, Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, Biomes.WINDSWEPT_GRAVELLY_HILLS, Biomes.COLD_OCEAN, Biomes.DEEP_COLD_OCEAN);\n        this.tag(ModTags.Biomes.NEUTRAL_BIOMES).add(Biomes.THE_VOID, Biomes.DRIPSTONE_CAVES, Biomes.SWAMP, Biomes.PLAINS, Biomes.SUNFLOWER_PLAINS, Biomes.DARK_FOREST, Biomes.BIRCH_FOREST, Biomes.OLD_GROWTH_BIRCH_FOREST, Biomes.FOREST, Biomes.FLOWER_FOREST, Biomes.MEADOW, Biomes.CHERRY_GROVE, Biomes.STONY_PEAKS, Biomes.STONY_SHORE, Biomes.BEACH, Biomes.RIVER, Biomes.OCEAN, Biomes.DEEP_OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN);\n        this.tag(ModTags.Biomes.WARM_BIOMES).add(Biomes.SOUL_SAND_VALLEY, Biomes.LUSH_CAVES, Biomes.MANGROVE_SWAMP, Biomes.JUNGLE, Biomes.SPARSE_JUNGLE, Biomes.BAMBOO_JUNGLE, Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.WINDSWEPT_SAVANNA, Biomes.WARM_OCEAN, Biomes.MUSHROOM_FIELDS);\n        this.tag(ModTags.Biomes.HOT_BIOMES).add(Biomes.NETHER_WASTES, Biomes.CRIMSON_FOREST, Biomes.WARPED_FOREST, Biomes.BASALT_DELTAS, Biomes.DESERT, Biomes.BADLANDS, Biomes.WOODED_BADLANDS, Biomes.ERODED_BADLANDS);\n\n        // Water purity tags\n        this.tag(ModTags.Biomes.DIRTY_WATER_BIOMES).add(Biomes.MANGROVE_SWAMP, Biomes.MUSHROOM_FIELDS, Biomes.SWAMP);\n        this.tag(ModTags.Biomes.PURIFIED_WATER_BIOMES);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANBlockTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.tags.BlockTags;\nimport net.minecraft.world.level.block.Blocks;\nimport net.neoforged.neoforge.common.data.BlockTagsProvider;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModTags;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANBlockTagsProvider extends BlockTagsProvider\n{\n    public TANBlockTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, lookupProvider, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        // Vanilla tags\n        this.tag(BlockTags.MINEABLE_WITH_AXE).add(TANBlocks.RAIN_COLLECTOR, TANBlocks.WATER_PURIFIER);\n        this.tag(BlockTags.MINEABLE_WITH_PICKAXE).add(TANBlocks.THERMOREGULATOR, TANBlocks.TEMPERATURE_GAUGE);\n\n        // TAN tags\n        this.tag(ModTags.Blocks.COOLING_BLOCKS).add(Blocks.SOUL_FIRE, Blocks.SOUL_CAMPFIRE, Blocks.SOUL_LANTERN, Blocks.PACKED_ICE, Blocks.BLUE_ICE, Blocks.POWDER_SNOW_CAULDRON);\n        this.tag(ModTags.Blocks.HEATING_BLOCKS).add(Blocks.FIRE, Blocks.CAMPFIRE, Blocks.LANTERN, Blocks.LAVA, Blocks.MAGMA_BLOCK, Blocks.LAVA_CAULDRON);\n        this.tag(ModTags.Blocks.PASSABLE_BLOCKS).addTags(BlockTags.DOORS, BlockTags.TRAPDOORS).add(Blocks.SCAFFOLDING);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANDamageTypeTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.KeyTagProvider;\nimport net.minecraft.data.tags.TagsProvider;\nimport net.minecraft.tags.DamageTypeTags;\nimport net.minecraft.world.damagesource.DamageType;\nimport toughasnails.api.damagesource.TANDamageTypes;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANDamageTypeTagsProvider extends KeyTagProvider<DamageType>\n{\n    public TANDamageTypeTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, Registries.DAMAGE_TYPE, lookupProvider, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        this.tag(DamageTypeTags.BYPASSES_ARMOR).add(TANDamageTypes.HYPERTHERMIA, TANDamageTypes.THIRST);\n        this.tag(DamageTypeTags.BYPASSES_EFFECTS).add(TANDamageTypes.THIRST);\n    }\n}"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANEnchantmentTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2022, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.EnchantmentTagsProvider;\nimport net.minecraft.tags.EnchantmentTags;\nimport org.jetbrains.annotations.Nullable;\nimport toughasnails.api.enchantment.TANEnchantments;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANEnchantmentTagsProvider extends EnchantmentTagsProvider\n{\n    public TANEnchantmentTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, lookupProvider);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        // TAN tags\n        this.tag(EnchantmentTags.TREASURE).add(TANEnchantments.THERMAL_TUNING).add(TANEnchantments.WATER_CLEANSING);\n        this.tag(EnchantmentTags.TRADEABLE).add(TANEnchantments.THERMAL_TUNING).add(TANEnchantments.WATER_CLEANSING);\n        this.tag(EnchantmentTags.ON_RANDOM_LOOT).add(TANEnchantments.THERMAL_TUNING).add(TANEnchantments.WATER_CLEANSING);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANEntityTypeTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.EntityTypeTagsProvider;\nimport net.minecraft.data.tags.IntrinsicHolderTagsProvider;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.tags.EntityTypeTags;\nimport net.minecraft.tags.ItemTags;\nimport net.minecraft.tags.TagKey;\nimport net.minecraft.world.entity.EntityType;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.Items;\nimport net.neoforged.neoforge.common.Tags;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModTags;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANEntityTypeTagsProvider extends EntityTypeTagsProvider\n{\n    public TANEntityTypeTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, lookupProvider, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        // Dyeable\n        this.tag(ModTags.EntityTypes.NEUTRALISING_MOUNTS)\n                .addTag(Tags.EntityTypes.MINECARTS)\n                .addTag(Tags.EntityTypes.BOATS)\n                .addOptionalTag(TagKey.create(Registries.ENTITY_TYPE, Identifier.fromNamespaceAndPath(\"mts\", \"builder_seat\")));\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANItemTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.IntrinsicHolderTagsProvider;\nimport net.minecraft.tags.ItemTags;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.Items;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModTags;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANItemTagsProvider extends IntrinsicHolderTagsProvider<Item>\n{\n    public TANItemTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, Registries.ITEM, lookupProvider, p_421303_ -> p_421303_.builtInRegistryHolder().key(), ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        // Dyeable\n        this.tag(ItemTags.DYEABLE).add(TANItems.LEAF_HELMET, TANItems.LEAF_CHESTPLATE, TANItems.LEAF_LEGGINGS, TANItems.LEAF_BOOTS, TANItems.WOOL_HELMET, TANItems.WOOL_CHESTPLATE, TANItems.WOOL_LEGGINGS, TANItems.WOOL_BOOTS);\n\n        // Temperature armor\n        this.tag(ModTags.Items.COOLING_ARMOR).add(TANItems.LEAF_HELMET, TANItems.LEAF_CHESTPLATE, TANItems.LEAF_LEGGINGS, TANItems.LEAF_BOOTS);\n        this.tag(ModTags.Items.HEATING_ARMOR).add(TANItems.WOOL_HELMET, TANItems.WOOL_CHESTPLATE, TANItems.WOOL_LEGGINGS, TANItems.WOOL_BOOTS);\n\n        // Temperature items\n        this.tag(ModTags.Items.COOLING_HELD_ITEMS).add(Items.POWDER_SNOW_BUCKET);\n        this.tag(ModTags.Items.HEATING_HELD_ITEMS).add(Items.LAVA_BUCKET);\n        this.tag(ModTags.Items.COOLING_CONSUMED_ITEMS).add(TANItems.ICE_CREAM);\n        this.tag(ModTags.Items.HEATING_CONSUMED_ITEMS).add(TANItems.CHARC_0S);\n\n        // Thermoregulator fuel\n        this.tag(ModTags.Items.THERMOREGULATOR_COOLING_FUEL).add(TANItems.ICE_CREAM, Items.ICE, Items.PACKED_ICE, Items.BLUE_ICE, Items.BREEZE_ROD, Items.WIND_CHARGE, Items.SNOWBALL, Items.SNOW, Items.SNOW_BLOCK, Items.POWDER_SNOW_BUCKET);\n        this.tag(ModTags.Items.THERMOREGULATOR_HEATING_FUEL).add(TANItems.CHARC_0S, Items.MAGMA_BLOCK, Items.MAGMA_CREAM, Items.BLAZE_POWDER, Items.BLAZE_ROD, Items.FIRE_CHARGE, Items.COAL, Items.CHARCOAL, Items.COAL_BLOCK, Items.LAVA_BUCKET);\n\n        // Canteens\n        this.tag(ModTags.Items.CANTEEN).add(TANItems.EMPTY_LEATHER_CANTEEN, TANItems.LEATHER_DIRTY_WATER_CANTEEN, TANItems.LEATHER_WATER_CANTEEN, TANItems.LEATHER_PURIFIED_WATER_CANTEEN, TANItems.EMPTY_COPPER_CANTEEN, TANItems.COPPER_DIRTY_WATER_CANTEEN, TANItems.COPPER_WATER_CANTEEN, TANItems.COPPER_PURIFIED_WATER_CANTEEN, TANItems.EMPTY_IRON_CANTEEN, TANItems.IRON_DIRTY_WATER_CANTEEN, TANItems.IRON_WATER_CANTEEN, TANItems.IRON_PURIFIED_WATER_CANTEEN, TANItems.EMPTY_GOLD_CANTEEN, TANItems.GOLD_DIRTY_WATER_CANTEEN, TANItems.GOLD_WATER_CANTEEN, TANItems.GOLD_PURIFIED_WATER_CANTEEN, TANItems.EMPTY_DIAMOND_CANTEEN, TANItems.DIAMOND_DIRTY_WATER_CANTEEN, TANItems.DIAMOND_WATER_CANTEEN, TANItems.DIAMOND_PURIFIED_WATER_CANTEEN, TANItems.EMPTY_NETHERITE_CANTEEN, TANItems.NETHERITE_DIRTY_WATER_CANTEEN, TANItems.NETHERITE_WATER_CANTEEN, TANItems.NETHERITE_PURIFIED_WATER_CANTEEN);\n\n        // Drinks\n        this.tag(ModTags.Items.DRINKS).addTags(\n            ModTags.Items.ONE_THIRST_DRINKS,\n            ModTags.Items.TWO_THIRST_DRINKS,\n            ModTags.Items.THREE_THIRST_DRINKS,\n            ModTags.Items.FOUR_THIRST_DRINKS,\n            ModTags.Items.FIVE_THIRST_DRINKS,\n            ModTags.Items.SIX_THIRST_DRINKS,\n            ModTags.Items.SEVEN_THIRST_DRINKS,\n            ModTags.Items.EIGHT_THIRST_DRINKS,\n            ModTags.Items.NINE_THIRST_DRINKS,\n            ModTags.Items.TEN_THIRST_DRINKS,\n            ModTags.Items.ELEVEN_THIRST_DRINKS,\n            ModTags.Items.TWELVE_THIRST_DRINKS,\n            ModTags.Items.THIRTEEN_THIRST_DRINKS,\n            ModTags.Items.FOURTEEN_THIRST_DRINKS,\n            ModTags.Items.FIFTEEN_THIRST_DRINKS,\n            ModTags.Items.SIXTEEN_THIRST_DRINKS,\n            ModTags.Items.SEVENTEEN_THIRST_DRINKS,\n            ModTags.Items.EIGHTEEN_THIRST_DRINKS,\n            ModTags.Items.NINETEEN_THIRST_DRINKS,\n            ModTags.Items.TWENTY_THIRST_DRINKS\n        );\n        this.tag(ModTags.Items.ONE_THIRST_DRINKS).add(TANItems.DIRTY_WATER_BOTTLE, TANItems.LEATHER_DIRTY_WATER_CANTEEN, TANItems.COPPER_DIRTY_WATER_CANTEEN, TANItems.IRON_DIRTY_WATER_CANTEEN, TANItems.GOLD_DIRTY_WATER_CANTEEN, TANItems.DIAMOND_DIRTY_WATER_CANTEEN, TANItems.NETHERITE_DIRTY_WATER_CANTEEN, Items.OMINOUS_BOTTLE);\n        this.tag(ModTags.Items.TWO_THIRST_DRINKS).add(Items.MILK_BUCKET);\n        this.tag(ModTags.Items.THREE_THIRST_DRINKS).add(Items.POTION, TANItems.LEATHER_WATER_CANTEEN, TANItems.COPPER_WATER_CANTEEN, TANItems.IRON_WATER_CANTEEN, TANItems.GOLD_WATER_CANTEEN, TANItems.DIAMOND_WATER_CANTEEN, TANItems.NETHERITE_WATER_CANTEEN);\n        this.tag(ModTags.Items.FOUR_THIRST_DRINKS);\n        this.tag(ModTags.Items.FIVE_THIRST_DRINKS).add(TANItems.PURIFIED_WATER_BOTTLE, TANItems.LEATHER_PURIFIED_WATER_CANTEEN, TANItems.COPPER_PURIFIED_WATER_CANTEEN, TANItems.IRON_PURIFIED_WATER_CANTEEN, TANItems.GOLD_PURIFIED_WATER_CANTEEN, TANItems.DIAMOND_PURIFIED_WATER_CANTEEN, TANItems.NETHERITE_PURIFIED_WATER_CANTEEN);\n        this.tag(ModTags.Items.SIX_THIRST_DRINKS).add(TANItems.GLOW_BERRY_JUICE, TANItems.PUMPKIN_JUICE, TANItems.SWEET_BERRY_JUICE);\n        this.tag(ModTags.Items.SEVEN_THIRST_DRINKS).add(TANItems.CACTUS_JUICE, TANItems.MELON_JUICE);\n        this.tag(ModTags.Items.EIGHT_THIRST_DRINKS).add(TANItems.APPLE_JUICE);\n        this.tag(ModTags.Items.NINE_THIRST_DRINKS);\n        this.tag(ModTags.Items.TEN_THIRST_DRINKS).add(TANItems.CHORUS_FRUIT_JUICE);\n        this.tag(ModTags.Items.ELEVEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.TWELVE_THIRST_DRINKS);\n        this.tag(ModTags.Items.THIRTEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.FOURTEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.FIFTEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.SIXTEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.SEVENTEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.EIGHTEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.NINETEEN_THIRST_DRINKS);\n        this.tag(ModTags.Items.TWENTY_THIRST_DRINKS);\n\n        // Poison chance\n        this.tag(ModTags.Items.TWENTY_FIVE_POISON_CHANCE_DRINKS).add(Items.POTION, TANItems.LEATHER_WATER_CANTEEN, TANItems.COPPER_WATER_CANTEEN, TANItems.IRON_WATER_CANTEEN, TANItems.GOLD_WATER_CANTEEN, TANItems.DIAMOND_WATER_CANTEEN, TANItems.NETHERITE_WATER_CANTEEN);\n        this.tag(ModTags.Items.FIFTY_POISON_CHANCE_DRINKS);\n        this.tag(ModTags.Items.SEVENTY_FIVE_POISON_CHANCE_DRINKS).add(TANItems.DIRTY_WATER_BOTTLE, TANItems.LEATHER_DIRTY_WATER_CANTEEN, TANItems.COPPER_DIRTY_WATER_CANTEEN, TANItems.IRON_DIRTY_WATER_CANTEEN, TANItems.GOLD_DIRTY_WATER_CANTEEN, TANItems.DIAMOND_DIRTY_WATER_CANTEEN, TANItems.NETHERITE_DIRTY_WATER_CANTEEN);\n        this.tag(ModTags.Items.ONE_HUNDRED_POISON_CHANCE_DRINKS).add(Items.OMINOUS_BOTTLE);\n\n        // Hydration\n        this.tag(ModTags.Items.TEN_HYDRATION_DRINKS).add(TANItems.DIRTY_WATER_BOTTLE, TANItems.LEATHER_DIRTY_WATER_CANTEEN, TANItems.COPPER_DIRTY_WATER_CANTEEN, TANItems.IRON_DIRTY_WATER_CANTEEN, TANItems.GOLD_DIRTY_WATER_CANTEEN, TANItems.DIAMOND_DIRTY_WATER_CANTEEN, TANItems.NETHERITE_DIRTY_WATER_CANTEEN, Items.OMINOUS_BOTTLE);\n        this.tag(ModTags.Items.TWENTY_HYDRATION_DRINKS).add(TANItems.CHORUS_FRUIT_JUICE, TANItems.GLOW_BERRY_JUICE, TANItems.SWEET_BERRY_JUICE);\n        this.tag(ModTags.Items.THIRTY_HYDRATION_DRINKS).add(Items.MILK_BUCKET);\n        this.tag(ModTags.Items.FOURTY_HYDRATION_DRINKS).add(Items.POTION, TANItems.LEATHER_WATER_CANTEEN, TANItems.COPPER_WATER_CANTEEN, TANItems.IRON_WATER_CANTEEN, TANItems.GOLD_WATER_CANTEEN, TANItems.DIAMOND_WATER_CANTEEN, TANItems.NETHERITE_WATER_CANTEEN);\n        this.tag(ModTags.Items.FIFTY_HYDRATION_DRINKS).add(TANItems.MELON_JUICE);\n        this.tag(ModTags.Items.SIXTY_HYDRATION_DRINKS).add(TANItems.PUMPKIN_JUICE);\n        this.tag(ModTags.Items.SEVENTY_HYDRATION_DRINKS).add(TANItems.APPLE_JUICE);\n        this.tag(ModTags.Items.EIGHTY_HYDRATION_DRINKS).add(TANItems.PURIFIED_WATER_BOTTLE, TANItems.LEATHER_PURIFIED_WATER_CANTEEN, TANItems.COPPER_PURIFIED_WATER_CANTEEN, TANItems.IRON_PURIFIED_WATER_CANTEEN, TANItems.GOLD_PURIFIED_WATER_CANTEEN, TANItems.DIAMOND_PURIFIED_WATER_CANTEEN, TANItems.NETHERITE_PURIFIED_WATER_CANTEEN);\n        this.tag(ModTags.Items.NINETY_HYDRATION_DRINKS);\n        this.tag(ModTags.Items.ONE_HUNDRED_HYDRATION_DRINKS).add(TANItems.CACTUS_JUICE);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANPoiTypesTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2024, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.PoiTypeTagsProvider;\nimport net.minecraft.tags.PoiTypeTags;\nimport toughasnails.api.village.TANPoiTypes;\nimport toughasnails.core.ToughAsNails;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANPoiTypesTagsProvider extends PoiTypeTagsProvider\n{\n    public TANPoiTypesTagsProvider(PackOutput packOutput, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(packOutput, lookupProvider, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        this.tag(PoiTypeTags.ACQUIRABLE_JOB_SITE).add(TANPoiTypes.CLIMATOLOGIST);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANRecipeProvider.java",
    "content": "package toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.recipes.*;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.tags.ItemTags;\nimport net.minecraft.world.item.Item;\nimport net.minecraft.world.item.ItemStack;\nimport net.minecraft.world.item.Items;\nimport net.minecraft.world.item.alchemy.PotionContents;\nimport net.minecraft.world.item.alchemy.Potions;\nimport net.minecraft.world.item.crafting.Ingredient;\nimport toughasnails.api.block.TANBlocks;\nimport toughasnails.api.item.TANItems;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.neoforge.datagen.recipes.WaterPurifierRecipeBuilder;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANRecipeProvider extends RecipeProvider\n{\n    public TANRecipeProvider(HolderLookup.Provider provider, RecipeOutput output)\n    {\n        super(provider, output);\n    }\n\n    @Override\n    protected void buildRecipes()\n    {\n        // Canteen\n        this.shaped(RecipeCategory.TOOLS, TANItems.EMPTY_LEATHER_CANTEEN).define('#', Items.LEATHER).pattern(\" # \").pattern(\"# #\").pattern(\" # \").unlockedBy(\"has_leather\", has(Items.LEATHER)).save(output);\n        this.shaped(RecipeCategory.TOOLS, TANItems.EMPTY_COPPER_CANTEEN).define('#', Items.COPPER_INGOT).pattern(\" # \").pattern(\"# #\").pattern(\" # \").unlockedBy(\"has_copper_ingot\", has(Items.COPPER_INGOT)).save(output);\n        this.shaped(RecipeCategory.TOOLS, TANItems.EMPTY_IRON_CANTEEN).define('#', Items.IRON_INGOT).pattern(\" # \").pattern(\"# #\").pattern(\" # \").unlockedBy(\"has_iron_ingot\", has(Items.IRON_INGOT)).save(output);\n        this.shaped(RecipeCategory.TOOLS, TANItems.EMPTY_GOLD_CANTEEN).define('#', Items.GOLD_INGOT).pattern(\" # \").pattern(\"# #\").pattern(\" # \").unlockedBy(\"has_gold_ingot\", has(Items.GOLD_INGOT)).save(output);\n        this.shaped(RecipeCategory.TOOLS, TANItems.EMPTY_DIAMOND_CANTEEN).define('#', Items.DIAMOND).pattern(\" # \").pattern(\"# #\").pattern(\" # \").unlockedBy(\"has_diamond\", has(Items.DIAMOND)).save(output);\n        netheriteSmithing(output, TANItems.EMPTY_DIAMOND_CANTEEN, RecipeCategory.TOOLS, TANItems.EMPTY_NETHERITE_CANTEEN);\n        netheriteSmithing(output, TANItems.DIAMOND_DIRTY_WATER_CANTEEN, RecipeCategory.TOOLS, TANItems.NETHERITE_DIRTY_WATER_CANTEEN);\n        netheriteSmithing(output, TANItems.DIAMOND_WATER_CANTEEN, RecipeCategory.TOOLS, TANItems.NETHERITE_WATER_CANTEEN);\n        netheriteSmithing(output, TANItems.DIAMOND_PURIFIED_WATER_CANTEEN, RecipeCategory.TOOLS, TANItems.NETHERITE_PURIFIED_WATER_CANTEEN);\n\n        // Juice\n        this.shapeless(RecipeCategory.FOOD, TANItems.APPLE_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.APPLE).group(\"juice\").unlockedBy(\"has_apple\", has(Items.APPLE)).save(output);\n        this.shapeless(RecipeCategory.FOOD, TANItems.CACTUS_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.CACTUS).group(\"juice\").unlockedBy(\"has_cactus\", has(Items.CACTUS)).save(output);\n        this.shapeless(RecipeCategory.FOOD, TANItems.CHORUS_FRUIT_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.CHORUS_FRUIT).group(\"juice\").unlockedBy(\"has_chorus_fruit\", has(Items.CHORUS_FRUIT)).save(output);\n        this.shapeless(RecipeCategory.FOOD, TANItems.GLOW_BERRY_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.GLOW_BERRIES).group(\"juice\").unlockedBy(\"has_glow_berries\", has(Items.GLOW_BERRIES)).save(output);\n        this.shapeless(RecipeCategory.FOOD, TANItems.MELON_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.MELON_SLICE).group(\"juice\").unlockedBy(\"has_melon_slice\", has(Items.MELON_SLICE)).save(output);\n        this.shapeless(RecipeCategory.FOOD, TANItems.PUMPKIN_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.PUMPKIN).group(\"juice\").unlockedBy(\"has_pumpkin\", has(Items.PUMPKIN)).save(output);\n        this.shapeless(RecipeCategory.FOOD, TANItems.SWEET_BERRY_JUICE).requires(TANItems.PURIFIED_WATER_BOTTLE).requires(Items.SUGAR).requires(Items.SWEET_BERRIES).group(\"juice\").unlockedBy(\"has_sweet_berries\", has(Items.SWEET_BERRIES)).save(output);\n\n        // Foods\n        this.shaped(RecipeCategory.FOOD, TANItems.ICE_CREAM).define('#', Items.SNOWBALL).define('S', Items.SUGAR).define('B', Items.BOWL).pattern(\" # \").pattern(\"#S#\").pattern(\" B \").unlockedBy(\"has_snowball\", has(Items.SNOWBALL)).save(output);\n        this.shaped(RecipeCategory.FOOD, TANItems.CHARC_0S).define('#', Items.CHARCOAL).define('S', Items.SUGAR).define('B', Items.BOWL).pattern(\" # \").pattern(\"#S#\").pattern(\" B \").unlockedBy(\"has_charcoal\", has(Items.CHARCOAL)).save(output);\n\n        // Blocks\n        this.shaped(RecipeCategory.DECORATIONS, TANBlocks.THERMOREGULATOR).define('S', Items.SMOOTH_STONE).define('I', Items.IRON_INGOT).define('T', TANItems.THERMOMETER).pattern(\"SIS\").pattern(\"ITI\").pattern(\"SIS\").unlockedBy(\"has_thermometer\", has(TANItems.THERMOMETER)).save(output);\n        this.shaped(RecipeCategory.REDSTONE, TANBlocks.TEMPERATURE_GAUGE).define('G', Items.GLASS).define('Q', Items.QUARTZ).define('T', TANItems.THERMOMETER).define('B', Items.BRICK_SLAB).pattern(\"GGG\").pattern(\"QTQ\").pattern(\"BBB\").unlockedBy(\"has_thermometer\", has(TANItems.THERMOMETER)).save(output);\n        this.shaped(RecipeCategory.DECORATIONS, TANBlocks.RAIN_COLLECTOR).define('W', ItemTags.PLANKS).define('S', Items.STRING).pattern(\"WSW\").pattern(\"W W\").pattern(\"WWW\").unlockedBy(\"has_string\", has(Items.STRING)).save(output);\n        this.shaped(RecipeCategory.DECORATIONS, TANBlocks.WATER_PURIFIER).define('W', ItemTags.PLANKS).define('C', Items.COPPER_INGOT).define('G', Items.GLASS).pattern(\"GCG\").pattern(\"C C\").pattern(\"WWW\").unlockedBy(\"has_copper_ingot\", has(Items.COPPER_INGOT)).save(output);\n\n        // Armor\n        this.shaped(RecipeCategory.COMBAT, TANItems.LEAF_BOOTS).define('X', ItemTags.LEAVES).pattern(\"X X\").pattern(\"X X\").unlockedBy(\"has_leaves\", has(ItemTags.LEAVES)).save(output);\n        this.shaped(RecipeCategory.COMBAT, TANItems.LEAF_CHESTPLATE).define('X', ItemTags.LEAVES).pattern(\"X X\").pattern(\"XXX\").pattern(\"XXX\").unlockedBy(\"has_leaves\", has(ItemTags.LEAVES)).save(output);\n        this.shaped(RecipeCategory.COMBAT, TANItems.LEAF_HELMET).define('X', ItemTags.LEAVES).pattern(\"XXX\").pattern(\"X X\").unlockedBy(\"has_leaves\", has(ItemTags.LEAVES)).save(output);\n        this.shaped(RecipeCategory.COMBAT, TANItems.LEAF_LEGGINGS).define('X', ItemTags.LEAVES).pattern(\"XXX\").pattern(\"X X\").pattern(\"X X\").unlockedBy(\"has_leaves\", has(ItemTags.LEAVES)).save(output);\n\n        this.shaped(RecipeCategory.COMBAT, TANItems.WOOL_BOOTS).define('X', ItemTags.WOOL).pattern(\"X X\").pattern(\"X X\").unlockedBy(\"has_wool\", has(ItemTags.WOOL)).save(output);\n        this.shaped(RecipeCategory.COMBAT, TANItems.WOOL_CHESTPLATE).define('X', ItemTags.WOOL).pattern(\"X X\").pattern(\"XXX\").pattern(\"XXX\").unlockedBy(\"has_wool\", has(ItemTags.WOOL)).save(output);\n        this.shaped(RecipeCategory.COMBAT, TANItems.WOOL_HELMET).define('X', ItemTags.WOOL).pattern(\"XXX\").pattern(\"X X\").unlockedBy(\"has_wool\", has(ItemTags.WOOL)).save(output);\n        this.shaped(RecipeCategory.COMBAT, TANItems.WOOL_LEGGINGS).define('X', ItemTags.WOOL).pattern(\"XXX\").pattern(\"X X\").pattern(\"X X\").unlockedBy(\"has_wool\", has(ItemTags.WOOL)).save(output);\n\n        this.shaped(RecipeCategory.TOOLS, TANItems.THERMOMETER).define('#', Items.COPPER_INGOT).define('X', Items.REDSTONE).pattern(\" # \").pattern(\"#X#\").pattern(\" # \").unlockedBy(\"has_redstone\", has(Items.REDSTONE)).save(output);\n\n        //\n        // Water purification recipes\n        //\n\n        // Water bottle\n        waterPurifier(output, new ItemStack(TANItems.DIRTY_WATER_BOTTLE), PotionContents.createItemStack(Items.POTION, Potions.WATER), 400);\n        waterPurifier(output, PotionContents.createItemStack(Items.POTION, Potions.WATER), new ItemStack(TANItems.PURIFIED_WATER_BOTTLE), 200);\n\n        // Canteens\n        waterPurifier(output, new ItemStack(TANItems.LEATHER_DIRTY_WATER_CANTEEN), new ItemStack(TANItems.LEATHER_WATER_CANTEEN), 400);\n        waterPurifier(output, new ItemStack(TANItems.COPPER_DIRTY_WATER_CANTEEN), new ItemStack(TANItems.COPPER_WATER_CANTEEN), 400);\n        waterPurifier(output, new ItemStack(TANItems.IRON_DIRTY_WATER_CANTEEN), new ItemStack(TANItems.IRON_WATER_CANTEEN), 400);\n        waterPurifier(output, new ItemStack(TANItems.GOLD_DIRTY_WATER_CANTEEN), new ItemStack(TANItems.GOLD_WATER_CANTEEN), 400);\n        waterPurifier(output, new ItemStack(TANItems.DIAMOND_DIRTY_WATER_CANTEEN), new ItemStack(TANItems.DIAMOND_WATER_CANTEEN), 400);\n        waterPurifier(output, new ItemStack(TANItems.NETHERITE_DIRTY_WATER_CANTEEN), new ItemStack(TANItems.NETHERITE_WATER_CANTEEN), 400);\n\n        waterPurifier(output, new ItemStack(TANItems.LEATHER_WATER_CANTEEN), new ItemStack(TANItems.LEATHER_PURIFIED_WATER_CANTEEN), 200);\n        waterPurifier(output, new ItemStack(TANItems.COPPER_WATER_CANTEEN), new ItemStack(TANItems.COPPER_PURIFIED_WATER_CANTEEN), 200);\n        waterPurifier(output, new ItemStack(TANItems.IRON_WATER_CANTEEN), new ItemStack(TANItems.IRON_PURIFIED_WATER_CANTEEN), 200);\n        waterPurifier(output, new ItemStack(TANItems.GOLD_WATER_CANTEEN), new ItemStack(TANItems.GOLD_PURIFIED_WATER_CANTEEN), 200);\n        waterPurifier(output, new ItemStack(TANItems.DIAMOND_WATER_CANTEEN), new ItemStack(TANItems.DIAMOND_PURIFIED_WATER_CANTEEN), 200);\n        waterPurifier(output, new ItemStack(TANItems.NETHERITE_WATER_CANTEEN), new ItemStack(TANItems.NETHERITE_PURIFIED_WATER_CANTEEN), 200);\n    }\n\n    public static void waterPurifier(RecipeOutput output, ItemStack input, ItemStack result, int purifyTime)\n    {\n        WaterPurifierRecipeBuilder.waterPurifier(input, result, purifyTime).save(output, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, getItemName(result.getItem())));\n    }\n\n    public void netheriteSmithing(RecipeOutput output, Item input, RecipeCategory category, Item result)\n    {\n        SmithingTransformRecipeBuilder.smithing(\n                Ingredient.of(Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE), Ingredient.of(input), Ingredient.of(Items.NETHERITE_INGOT), category, result\n            )\n            .unlocks(\"has_netherite_ingot\", has(Items.NETHERITE_INGOT))\n            .save(output, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, getItemName(result)) + \"_smithing\");\n    }\n\n\n    public static class Runner extends RecipeProvider.Runner\n    {\n        public Runner(PackOutput p_365442_, CompletableFuture<HolderLookup.Provider> p_362168_) {\n            super(p_365442_, p_362168_);\n        }\n\n        @Override\n        protected RecipeProvider createRecipeProvider(HolderLookup.Provider provider, RecipeOutput output)\n        {\n            return new TANRecipeProvider(provider, output);\n        }\n\n        @Override\n        public String getName() {\n            return \"TAN Recipes\";\n        }\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/provider/TANTrimMaterialTagsProvider.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.datagen.provider;\n\nimport net.minecraft.core.HolderLookup;\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.PackOutput;\nimport net.minecraft.data.tags.KeyTagProvider;\nimport net.minecraft.data.tags.TagsProvider;\nimport net.minecraft.world.item.equipment.trim.TrimMaterial;\nimport org.jetbrains.annotations.Nullable;\nimport toughasnails.core.ToughAsNails;\nimport toughasnails.init.ModTags;\n\nimport java.util.concurrent.CompletableFuture;\n\npublic class TANTrimMaterialTagsProvider extends KeyTagProvider<TrimMaterial>\n{\n    public TANTrimMaterialTagsProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider)\n    {\n        super(output, Registries.TRIM_MATERIAL, lookupProvider, ToughAsNails.MOD_ID);\n    }\n\n    @Override\n    protected void addTags(HolderLookup.Provider provider)\n    {\n        this.tag(ModTags.Trims.COOLING_TRIMS);\n        this.tag(ModTags.Trims.HEATING_TRIMS);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/datagen/recipes/WaterPurifierRecipeBuilder.java",
    "content": "package toughasnails.neoforge.datagen.recipes;\n\nimport net.minecraft.core.registries.Registries;\nimport net.minecraft.data.recipes.RecipeOutput;\nimport net.minecraft.resources.ResourceKey;\nimport net.minecraft.resources.Identifier;\nimport net.minecraft.world.item.ItemStack;\nimport toughasnails.crafting.WaterPurifierRecipe;\n\npublic class WaterPurifierRecipeBuilder\n{\n    private final ItemStack input;\n    private final ItemStack result;\n    private final int purifyTime;\n\n    private WaterPurifierRecipeBuilder(ItemStack input, ItemStack result, int purifyTime)\n    {\n        this.input = input;\n        this.result = result;\n        this.purifyTime = purifyTime;\n    }\n\n    public static WaterPurifierRecipeBuilder waterPurifier(ItemStack input, ItemStack result, int purifyTime)\n    {\n        return new WaterPurifierRecipeBuilder(input, result, purifyTime);\n    }\n\n    public void save(RecipeOutput output, String name)\n    {\n        this.save(output, Identifier.parse(name));\n    }\n\n    public void save(RecipeOutput output, Identifier location)\n    {\n        output.accept(ResourceKey.create(Registries.RECIPE, location), new WaterPurifierRecipe(this.input, this.result, this.purifyTime), null);\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/java/toughasnails/neoforge/mixin/client/MixinGui.java",
    "content": "/*******************************************************************************\n * Copyright 2023, the Glitchfiend Team.\n * All rights reserved.\n ******************************************************************************/\npackage toughasnails.neoforge.mixin.client;\n\nimport net.minecraft.client.gui.Gui;\nimport net.minecraft.client.gui.GuiGraphics;\nimport org.spongepowered.asm.mixin.Mixin;\nimport org.spongepowered.asm.mixin.injection.At;\nimport org.spongepowered.asm.mixin.injection.Inject;\nimport org.spongepowered.asm.mixin.injection.callback.CallbackInfo;\nimport toughasnails.temperature.TemperatureHooksClient;\n\n@Mixin(Gui.class)\npublic class MixinGui\n{\n    @Inject(method=\"renderSelectedItemName(Lnet/minecraft/client/gui/GuiGraphics;I)V\", at=@At(value=\"HEAD\"), remap = false)\n    public void onRenderSelectedItemNameBegin(GuiGraphics guiGraphics, int yShift, CallbackInfo ci)\n    {\n        guiGraphics.pose().pushMatrix();\n        TemperatureHooksClient.adjustSelectedItemText(guiGraphics);\n    }\n\n    @Inject(method=\"renderSelectedItemName(Lnet/minecraft/client/gui/GuiGraphics;I)V\", at=@At(value=\"TAIL\"), remap = false)\n    public void onRenderSelectedItemNameEnd(GuiGraphics guiGraphics, int yShift, CallbackInfo ci)\n    {\n        guiGraphics.pose().popMatrix();\n    }\n}\n"
  },
  {
    "path": "neoforge/src/main/resources/META-INF/accesstransformer.cfg",
    "content": "public net.minecraft.world.effect.MobEffect <init>(Lnet/minecraft/world/effect/MobEffectCategory;I)V\n\n# Thirst transformers\npublic net.minecraft.world.item.Item getPlayerPOVHitResult(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/ClipContext$Fluid;)Lnet/minecraft/world/phys/BlockHitResult;\npublic net.minecraft.world.food.FoodData *\n\n#Temperature transformers\npublic net.minecraft.client.gui.Gui POWDER_SNOW_OUTLINE_LOCATION\npublic net.minecraft.client.gui.Gui renderTextureOverlay(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/resources/Identifier;F)V\n\n# DamageSources\npublic net.minecraft.world.damagesource.DamageSources *()\n\n# Gui\npublic net.minecraft.client.gui.Gui$HeartType\npublic net.minecraft.client.gui.Gui GUI_ICONS_LOCATION\n\n# MenuType registration\npublic net.minecraft.client.gui.screens.MenuScreens register(Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/client/gui/screens/MenuScreens$ScreenConstructor;)V\n\n# Villages\npublic-f net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool rawTemplates\npublic net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool templates\npublic net.minecraft.world.entity.ai.village.poi.PoiTypes registerBlockStates(Lnet/minecraft/core/Holder;Ljava/util/Set;)V\n\npublic net.minecraft.world.level.block.entity.BlockEntityType <init>(Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;Ljava/util/Set;)V\n\n# Data gen\npublic net.minecraft.client.data.models.ItemModelGenerators *()\npublic net.minecraft.client.data.models.ItemModelGenerators$TrimMaterialData\npublic net.minecraft.client.data.models.ItemModelGenerators TRIM_MATERIAL_MODELS\n\npublic-f net.minecraft.world.item.crafting.RecipeManager RECIPE_PROPERTY_SETS\n"
  },
  {
    "path": "neoforge/src/main/resources/META-INF/neoforge.mods.toml",
    "content": "modLoader=\"javafml\"\nlicense=\"${mod_license}\"\nloaderVersion=\"${neoforge_loader_version_range}\"\nissueTrackerURL=\"${mod_issues_url}\"\ndisplayURL=\"${mod_page_url}\"\nlogoFile=\"${mod_id}_logo.png\"\n\n[[mixins]]\n    config=\"${mod_id}.mixins.json\"\n\n[[mixins]]\n    config=\"${mod_id}.neoforge.mixins.json\"\n\n[[mods]]\n    modId=\"${mod_id}\"\n    version=\"${mod_version}\"\n    displayName=\"${mod_display_name}\"\n\tauthors=\"${mod_authors}\"\n    description=\"${mod_description}\"\n\n[[dependencies.${mod_id}]]\n    modId=\"neoforge\"\n    required=true\n    versionRange=\"${neoforge_version_range}\"\n    ordering=\"NONE\"\n    side=\"BOTH\"\n\n[[dependencies.${mod_id}]]\n    modId=\"glitchcore\"\n    required=true\n    versionRange=\"[${glitchcore_version},)\"\n    ordering=\"AFTER\"\n    side=\"BOTH\"\n\n[[dependencies.${mod_id}]]\n    modId=\"sereneseasons\"\n    type=\"optional\"\n    versionRange=\"[${serene_seasons_version},)\"\n    ordering=\"AFTER\"\n    side=\"BOTH\""
  },
  {
    "path": "neoforge/src/main/resources/toughasnails.neoforge.mixins.json",
    "content": "{\n  \"required\": true,\n  \"package\": \"toughasnails.neoforge.mixin\",\n  \"compatibilityLevel\": \"JAVA_17\",\n  \"refmap\": \"toughasnails.refmap.json\",\n  \"mixins\": [\n  ],\n  \"client\": [\n    \"client.MixinGui\"\n  ],\n  \"injectors\": {\n    \"defaultRequire\": 1\n  },\n  \"minVersion\": \"0.8.4\"\n}"
  },
  {
    "path": "settings.gradle",
    "content": "include(\"common\", \"forge\", \"neoforge\", \"fabric\")\n\npluginManagement.repositories {\n    gradlePluginPortal()\n    maven {\n        name = \"Fabric\"\n        url = \"https://maven.fabricmc.net/\"\n    }\n    maven {\n        name = \"NeoForge\"\n        url = \"https://maven.neoforged.net/releases\"\n    }\n    maven {\n        name = \"Forge\"\n        url = \"https://maven.minecraftforge.net\"\n    }\n    maven {\n        name = \"Sponge Snapshots\"\n        url = \"https://repo.spongepowered.org/repository/maven-public/\"\n    }\n}\n\nrootProject.name = \"ToughAsNails\"\n\n// We want lowercase folder names but uppercase project names\nproject(\":common\").name = \"Common\"\nproject(\":forge\").name = \"Forge\"\nproject(\":neoforge\").name = \"NeoForge\"\nproject(\":fabric\").name = \"Fabric\""
  }
]