diff --git a/.editorconfig b/.editorconfig index 9c75dfcc..553d1ed1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,5 +11,5 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -[*.{yml,js,json}] +[*.{yml,js,json,md,ts}] indent_style = space diff --git a/.gitattributes b/.gitattributes index 46dfc562..9bb7d66a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,11 +1,22 @@ -# -# https://help.github.com/articles/dealing-with-line-endings/ -# +* text eol=lf +*.bat text eol=crlf +*.patch text eol=lf +*.java text eol=lf +*.gradle text eol=crlf +*.png binary +*.gif binary +*.exe binary +*.dll binary +*.jar binary +*.lzma binary +*.zip binary +*.pyd binary +*.cfg text eol=lf +*.jks binary +*.ogg binary + # Linux start script should use lf /gradlew text eol=lf -# These are Windows script files and should use crlf -*.bat text eol=crlf - # While BlockBench files are actually JSON, they're minified so don't diff well. *.bbmodel binary diff --git a/.github/actions/get-build-test-versions/action.yml b/.github/actions/get-build-test-versions/action.yml deleted file mode 100644 index 033e3a7b..00000000 --- a/.github/actions/get-build-test-versions/action.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: Get build & test versions -description: Get versions of the game for the build and test workflow - -outputs: - test-matrix: - description: Matrix of versions to test - -runs: - using: "node20" - main: "index.js" diff --git a/.github/actions/get-build-test-versions/index.js b/.github/actions/get-build-test-versions/index.js deleted file mode 100644 index 9b150953..00000000 --- a/.github/actions/get-build-test-versions/index.js +++ /dev/null @@ -1,77 +0,0 @@ -import { info, setOutput } from "@actions/core"; -import { readFile } from "node:fs/promises"; -import { join } from "node:path"; -import { satisfies } from "semver"; -import { getAllMinecraftVersions, getMinecraftVersion } from "../lib/mojang.js"; -import { addAllZeroVersions, parseVersionSafe } from "../lib/versions.js"; - -const fileString = await readFile( - join(process.cwd(), "src/main/resources", "fabric.mod.json"), - { encoding: "utf8" } -); -const modJson = JSON.parse(fileString); -const recommendsRange = addAllZeroVersions(modJson.recommends.minecraft); - -const versionsManifest = await getAllMinecraftVersions(); -const allReleaseVersions = versionsManifest.versions.filter( - (v) => v.type === "release" -); - -const matchingVersions = allReleaseVersions.filter((version) => - satisfies(parseVersionSafe(version.id), recommendsRange) -); -if (matchingVersions.length === 0) { - info("No release versions found matching range, checking gradle.properties"); - - const gradlePropsContents = await readFile( - join(process.cwd(), "gradle.properties"), - { encoding: "utf8" } - ); - const versionMatch = gradlePropsContents.match(/minecraft_version=(.+)/); - if (!versionMatch) { - throw new Error( - "Unable to determine Minecraft version from gradle.properties" - ); - } - - const version = versionsManifest.versions.find( - (v) => v.id === versionMatch[1] - ); - if (!version) { - throw new Error(`Unable to find version ${versionMatch[1]}`); - } - - matchingVersions.push(version); -} - -info( - `Found ${ - matchingVersions.length - } versions matching range \`${recommendsRange}\`: ${matchingVersions - .map((v) => v.id) - .join(", ")}` -); - -const versionEntries = await Promise.all( - matchingVersions.map(async (version) => { - const versionData = await getMinecraftVersion(version.id); - - /** @type {TestMatrixEntry} */ - const entry = { - name: versionData.id, - "minecraft-version": versionData.id, - "java-version": versionData.javaVersion.majorVersion.toString(), - }; - - return entry; - }) -); - -setOutput("test-matrix", JSON.stringify(versionEntries)); - -/** - * @typedef TestMatrixEntry - * @property {string} name - * @property {string} minecraft-version - * @property {string} java-version - */ diff --git a/.github/actions/update-versions/action.yml b/.github/actions/update-versions/action.yml index 077105b4..d53b5810 100644 --- a/.github/actions/update-versions/action.yml +++ b/.github/actions/update-versions/action.yml @@ -4,26 +4,20 @@ description: Get versions of the game for the build and test workflow inputs: minecraft-version: description: Minecraft version to update to. If not supplied, falls back to latest version. - max-minecraft-version: - description: Maximum Minecraft version if there are known incompatibilities with later minor versions. If not specified then it's assumed that any future minor version will be compatible. - ignore-mod-dependencies: - description: Ignore mod dependency versions outputs: - has-updates: - description: Whether there are updates to include minecraft-version: description: Highest Minecraft version supported - minecraft-version-range: - description: Range of Minecraft versions supported java-version: description: Java version required for this version + fabric-loader-version: + description: Version of Fabric loader used by this project fabric-api-version: description: Version of the Fabric API mod used by this project mod-menu-version: description: Version of the Mod Menu mod used by this project - loader-version: - description: Version of Fabric loader used by this project + neoforge-version: + description: Version of the NeoForge used by this project runs: using: "node20" diff --git a/.github/actions/update-versions/index.js b/.github/actions/update-versions/index.js index 350b6adb..4a03faf2 100644 --- a/.github/actions/update-versions/index.js +++ b/.github/actions/update-versions/index.js @@ -1,21 +1,8 @@ import { getInput, info, setOutput, warning } from "@actions/core"; -import { readFile } from "node:fs/promises"; -import { join } from "node:path"; import { URL, URLSearchParams } from "node:url"; -import { minSatisfying, satisfies } from "semver"; +import { compare, SemVer } from "semver"; import { getAllMinecraftVersions, getMinecraftVersion } from "../lib/mojang.js"; -import { - addAllZeroVersions, - parseVersionSafe, - trimAllZeroVersions, -} from "../lib/versions.js"; - -const fileString = await readFile( - join(process.cwd(), "src/main/resources", "fabric.mod.json"), - { encoding: "utf8" } -); -const modJson = JSON.parse(fileString); -const recommendsRange = addAllZeroVersions(modJson.recommends.minecraft); +import { parseVersionSafe, trimAllZeroVersions } from "../lib/versions.js"; const allVersions = await getAllMinecraftVersions(); @@ -33,84 +20,17 @@ function getUpdateVersion() { return allVersions.latest.release; } -/** - * @returns {string | null} - */ -function getMaxUpdateVersion() { - const inputValue = getInput("max-minecraft-version"); - if (inputValue) { - return inputValue; - } - - return null; -} - const versionToUpdate = getUpdateVersion(); +const versionToUpdateSemver = new SemVer(versionToUpdate); const updateVersionInfo = await getMinecraftVersion(versionToUpdate); -async function getNewVersionRange() { - if (updateVersionInfo.type !== "release") { - return versionToUpdate; - } - - const updateSemver = parseVersionSafe(versionToUpdate); - - if (recommendsRange === updateSemver.toString()) { - return versionToUpdate; - } - - if (satisfies(updateSemver, recommendsRange)) { - // New version already satisfies the current range, but double check Java version first. - const allReleaseVersions = allVersions.versions.filter( - (v) => v.type === "release" - ); - const minMatchingSemver = minSatisfying( - allReleaseVersions.map((v) => parseVersionSafe(v.id)), - recommendsRange - ); - if (!minMatchingSemver) { - throw new Error(`No versions matched range ${recommendsRange}`); - } - - const minMatchingInfo = await getMinecraftVersion( - minMatchingSemver.toString() - ); - - const isSameJava = - updateVersionInfo.javaVersion.majorVersion === - minMatchingInfo.javaVersion.majorVersion; - if (isSameJava) { - return recommendsRange; - } - - // New version satisfies range, but has new Java version so is incompatible. - } - - const minVersion = versionToUpdate; - const maxUpdateVersion = getMaxUpdateVersion(); - // Current rules mean that the minor version is always the same, so we can use a range here - // Also we're assuming middle versions are compatible. This should always be the case, but - // I can't wait to eat my words on that one. - const simplified = trimAllZeroVersions( - maxUpdateVersion !== null - ? `${minVersion} - ${maxUpdateVersion}` - : `~${minVersion}` - ); - - info( - `New version is likely compatible with existing versions of Minecraft. Adding to version range ${simplified}` - ); - - return simplified; -} - /** * @param {string} projectId * @returns {Promise} */ async function getModrinthProjectVersion(projectId) { const url = new URL( - `https://api.modrinth.com/v2/project/${projectId}/version` + `https://api.modrinth.com/v2/project/${projectId}/version`, ); url.search = new URLSearchParams({ game_versions: `["${versionToUpdate}"]`, @@ -128,12 +48,12 @@ async function getModrinthProjectVersion(projectId) { getInput("ignore-mod-dependencies") === "true"; if (!shouldIgnoreModDependencies) { throw new Error( - `No versions of ${projectId} for Minecraft ${versionToUpdate}` + `No versions of ${projectId} for Minecraft ${versionToUpdate}`, ); } warning( - `No versions of ${projectId} for Minecraft ${versionToUpdate}. Ignoring, but you may need to revert some changes until I update this action` + `No versions of ${projectId} for Minecraft ${versionToUpdate}. Ignoring, but you may need to revert some changes until I update this action`, ); return ""; } @@ -165,18 +85,72 @@ async function getFabricLoaderVersion() { return data[0].version; } -// Early exit if latest version already matches -const newVersionRange = await getNewVersionRange(); +/** + * @returns {Promise<{neoforge:string;}>} + */ +async function getArchitecturyVersions() { + const response = await fetch( + "https://generate.architectury.dev/version_index.json", + { + headers: { + "user-agent": "secret_online/mod-auto-updater (mc@secretonline.co)", + }, + }, + ); + /** @type {Record} */ + const data = await response.json(); + + const versionData = data[versionToUpdate]; + if (versionData) { + if (!versionData.neoforge) { + throw new Error(`No Neoforge version in Architectury index`); + } + + info(`Found Architectury data: neoforge ${versionData.neoforge}`); + + return versionData; + } + + warning( + `No version for ${versionToUpdate} in Architectury index. Trying Neoforge release`, + ); + + // Get latest Neoforge version from Neoforge Maven + const neoforgeResponse = await fetch( + "https://maven.neoforged.net/api/maven/versions/releases/net%2Fneoforged%2Fneoforge", + { + headers: { + "user-agent": "secret_online/mod-auto-updater (mc@secretonline.co)", + }, + }, + ); + /** @type {{versions:string[]}} */ + const neoforgeData = await neoforgeResponse.json(); + const matchRegex = new RegExp( + `^${versionToUpdateSemver.major}.${versionToUpdateSemver.minor}.`, + ); + const matchingVersions = neoforgeData.versions.filter((version) => + matchRegex.test(version), + ); + if (matchingVersions.length === 0) { + throw new Error(`No version for ${versionToUpdate} in Neoforge Maven`); + } + matchingVersions.sort(); + const neoforgeVersion = matchingVersions[0]; + info(`Found Neoforge data: neoforge ${neoforgeVersion}`); + + return { + neoforge: neoforgeVersion, + }; +} + const fabricApiVersion = await getModrinthProjectVersion("fabric-api"); -const modMenuVersion = await getModrinthProjectVersion("modmenu"); const fabricLoaderVersion = await getFabricLoaderVersion(); +const { neoforge } = await getArchitecturyVersions(); setOutput("has-updates", true); setOutput("minecraft-version", versionToUpdate); -setOutput("minecraft-version-range", newVersionRange); setOutput("java-version", updateVersionInfo.javaVersion.majorVersion); setOutput("fabric-api-version", fabricApiVersion); -setOutput("mod-menu-version", modMenuVersion); -setOutput("loader-version", fabricLoaderVersion); -// Do not add code below the above closing brace, as it will run whether or not any updates happened. -// Control flow is hard. +setOutput("fabric-loader-version", fabricLoaderVersion); +setOutput("neoforge-version", neoforge); diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 48f87076..6596a173 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,3 +14,12 @@ updates: all: patterns: - "*" + - package-ecosystem: "npm" + directory: "/misc/mod-generator" + schedule: + interval: "monthly" + timezone: "Pacific/Auckland" + groups: + all: + patterns: + - "*" diff --git a/.github/pack-generator.png b/.github/pack-generator.png new file mode 100644 index 00000000..275c1a3e Binary files /dev/null and b/.github/pack-generator.png differ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5f36545a..1032bb23 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,11 +44,21 @@ jobs: - name: Build run: ./gradlew clean build - - name: Upload artifacts - uses: actions/upload-artifact@v7 + - name: Upload Fabric build artifacts + uses: actions/upload-artifact@v6 with: - name: build - path: build/libs/ + name: build-fabric + path: "fabric/build/libs/*.jar" + include-hidden-files: true + if-no-files-found: error + + - name: Upload Neoforge build artifacts + uses: actions/upload-artifact@v6 + with: + name: build-neoforge + path: "neoforge/build/libs/*.jar" + include-hidden-files: true + if-no-files-found: error check-datagen: name: Check data generation @@ -79,11 +89,41 @@ jobs: java-version: ${{ steps.get-minecraft-version.outputs.java-version }} distribution: "zulu" - - name: Build - run: ./gradlew clean runDatagen + - name: Clean + run: ./gradlew clean + + - name: Run datagen + run: ./gradlew runDatagen runData - name: Check changes run: | - git diff --exit-code src/main/generated + git diff --exit-code fabric/src/main/generated + git diff --exit-code neoforge/src/generated + + mod-generator: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version-file: ".node-version" + cache: "npm" + + - name: Install + working-directory: misc/mod-generator + run: | + npm ci + + - name: Svelte check + working-directory: misc/mod-generator + run: | + npm run check + + - name: Build + working-directory: misc/mod-generator + run: | + npm run build # TODO: add job to do gametest diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ba362456..7d13639f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,5 +1,5 @@ name: Release -run-name: Release (${{ inputs.version }}) +run-name: Release (${{ inputs.version }} for ${{ inputs.platforms || 'all platforms' }}) on: workflow_dispatch: @@ -9,18 +9,32 @@ on: required: true type: boolean version: - description: Pack version (e.g. 1.3.1+1.21) + description: Mod version (e.g. 1.3.1+1.21) required: true type: string + platforms: + description: Mod platforms, comma separated (e.g. fabric,neoforge) + required: false + type: string jobs: - create-release: - name: Create release + release-build: + name: Release build runs-on: ubuntu-latest permissions: - contents: "write" + contents: write id-token: write attestations: write + outputs: + loaders: ${{ steps.get-data.outputs.loaders }} + has-fabric: ${{ steps.get-data.outputs.has-fabric }} + has-neoforge: ${{ steps.get-data.outputs.has-neoforge }} + has-forge: ${{ steps.get-data.outputs.has-forge }} + mod-id: ${{ steps.get-data.outputs.mod-id }} + modrinth-project-id: ${{ steps.get-data.outputs.modrinth-project-id }} + release-name: ${{ steps.deploy-info.outputs.release-name }} + version-slug-base: ${{ steps.deploy-info.outputs.version-slug }} + release-notes: ${{ steps.changelog.outputs.release-notes }} steps: - name: Checkout uses: actions/checkout@v6 @@ -28,17 +42,14 @@ jobs: - name: Ensure Gradle wrapper is executable run: chmod +x ./gradlew - - name: Validate Gradle - uses: gradle/actions/wrapper-validation@v5 - - name: Get Data id: get-data run: | java_version=$(grep '^java_version=' gradle.properties | cut -d= -f2) minecraft_version=$(grep '^minecraft_version=' gradle.properties | cut -d= -f2) - mod_id=$(cat src/main/resources/fabric.mod.json | jq -r '.id') - mod_name=$(cat src/main/resources/fabric.mod.json | jq -r '.name') - modrinth_project_id=$(cat src/main/resources/fabric.mod.json | jq -r '.custom["mc-publish"].modrinth') + mod_id=$(cat fabric/src/main/resources/fabric.mod.json | jq -r '.id') + mod_name=$(cat fabric/src/main/resources/fabric.mod.json | jq -r '.name') + modrinth_project_id=$(cat fabric/src/main/resources/fabric.mod.json | jq -r '.custom["mc-publish"].modrinth') echo "java-version=$java_version" >> "$GITHUB_OUTPUT" echo "minecraft-version=$minecraft_version" >> "$GITHUB_OUTPUT" @@ -46,6 +57,26 @@ jobs: echo "mod-name=$mod_name" >> "$GITHUB_OUTPUT" echo "modrinth-project-id=$modrinth_project_id" >> "$GITHUB_OUTPUT" + # Also update the mod version in gradle + sed -i "s/^version=.*/version=${{ inputs.version }}/" gradle.properties + + # Can't just write inputs.platforms to gradle.properties otherwise the build fails. + if [ -n "${{ inputs.platforms }}" ]; then + platforms="${{ inputs.platforms }}" + else + platforms=$(grep '^enabled_platforms=' gradle.properties | cut -d= -f2) + fi + + loaders=$(echo "$platforms" | cut -d= -f2 | jq -Rc 'split(",")') + hasFabric=$(echo "$loaders" | jq -r 'index("fabric") != null') + hasNeoforge=$(echo "$loaders" | jq -r 'index("neoforge") != null') + hasForge=$(echo "$loaders" | jq -r 'index("forge") != null') + + echo "loaders=$loaders" >> "$GITHUB_OUTPUT" + echo "has-fabric=$hasFabric" >> "$GITHUB_OUTPUT" + echo "has-neoforge=$hasNeoforge" >> "$GITHUB_OUTPUT" + echo "has-forge=$hasForge" >> "$GITHUB_OUTPUT" + - name: Setup Java ${{ steps.get-data.outputs.java-version }} uses: actions/setup-java@v5 with: @@ -58,9 +89,6 @@ jobs: - name: Get deploy info id: deploy-info run: | - # Also update the mod version in gradle - sed -i "s/^mod_version=.*/mod_version=${{ inputs.version }}/" gradle.properties - release_name="${{ steps.get-data.outputs.mod-name }} v${{ inputs.version }}" echo "release-name=$release_name" >> "$GITHUB_OUTPUT" @@ -88,36 +116,52 @@ jobs: echo "changelog: ${{ steps.changelog.outputs.release-notes }}" echo "icon-url: ${{ steps.deploy-info.outputs.icon-url }}" - # Broken due to an error with URL encoding in some parameters - # - uses: actions/attest-build-provenance@v2 + - name: Upload Fabric build artifacts + uses: actions/upload-artifact@v6 + if: steps.get-data.outputs.has-fabric == 'true' + with: + name: build-fabric + path: "fabric/build/libs/*.jar" + include-hidden-files: true + if-no-files-found: error + + - name: Upload Neoforge build artifacts + uses: actions/upload-artifact@v6 + if: steps.get-data.outputs.has-neoforge == 'true' + with: + name: build-neoforge + path: "neoforge/build/libs/*.jar" + include-hidden-files: true + if-no-files-found: error + + - name: Upload Forge build artifacts + uses: actions/upload-artifact@v6 + if: steps.get-data.outputs.has-forge == 'true' + with: + name: build-forge + path: "forge/build/libs/*.jar" + include-hidden-files: true + if-no-files-found: error + + # Broken due to a bug with branch names and URL encoding + # - name: Attest build provenance + # uses: actions/attest-build-provenance@v2 # if: inputs.is-release # with: - # subject-path: "build/libs/*.jar" + # subject-path: "*/build/libs/!(*-@(dev|sources|javadoc)).jar" - name: Create GitHub release if: inputs.is-release uses: softprops/action-gh-release@v2 with: + target_commitish: ${{ github.ref_name }} tag_name: ${{ steps.deploy-info.outputs.version-slug }} name: ${{ steps.deploy-info.outputs.release-name }} body: ${{ steps.changelog.outputs.release-notes }} files: | - build/libs/!(*-sources).jar - build/libs/*-sources.jar + */build/libs/!(*-@(dev|sources|javadoc|shadow)).jar token: ${{ secrets.GITHUB_TOKEN }} - - name: Create Modrinth Release - if: inputs.is-release - id: modrinth-release - uses: Kir-Antipov/mc-publish@v3.3 - with: - name: ${{ steps.deploy-info.outputs.release-name }} - version: ${{ steps.deploy-info.outputs.version-slug }} - changelog: ${{ steps.changelog.outputs.release-notes }} - loaders: fabric - modrinth-token: ${{ secrets.MODRINTH_TOKEN }} - curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} - - name: Update Modrinth decription if: inputs.is-release uses: funnyboy-roks/modrinth-auto-desc@v1.7 @@ -126,10 +170,66 @@ jobs: slug: ${{ steps.get-data.outputs.modrinth-project-id }} readme: MODRINTH.md + release-publish: + name: Release publish (${{ matrix.loader }}) + runs-on: ubuntu-latest + needs: + - release-build + if: inputs.is-release + strategy: + max-parallel: 1 + matrix: + loader: ${{ fromJson(needs.release-build.outputs.loaders) }} + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + sparse-checkout: | + ${{ matrix.loader }} + + - name: Download ${{ matrix.loader }} build artifacts + uses: actions/download-artifact@v7 + with: + name: build-${{ matrix.loader }} + path: "${{ matrix.loader }}/build/libs" + + - name: Move files to root + run: | + # Delete everything that's not required. + # This is mostly for running locally with act, which doesn't seem to do sparse checkouts. + find . -maxdepth 1 -type f -delete + find . -maxdepth 1 -type d | grep -Ev '^\.(/\.|/${{ matrix.loader }}|$)' | xargs rm -rf + + # Move files for mc-publish action to correctly pick them up. + mv ${{ matrix.loader }}/* . + + # Delete extra jars. Note: If a release ends with one of these suffixes then this will fail, but that's a future problem. + find build/libs -type f \( -name '*-dev.jar' -o -name '*-sources.jar' -o -name '*-javadoc.jar' -o -name '*-shadow.jar' \) -delete + + - name: Create Modrinth Release + id: modrinth-release + uses: Kir-Antipov/mc-publish@v3.3 + with: + name: ${{ needs.release-build.outputs.release-name }} (${{ matrix.loader }}) + version: ${{ needs.release-build.outputs.version-slug-base }}-${{ matrix.loader }} + changelog: ${{ needs.release-build.outputs.release-notes }} + loaders: ${{ matrix.loader }} + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + curseforge-version-type: ${{ matrix.loader == 'neoforge' && 'release' || matrix.loader == 'fabric' && 'beta' || 'alpha' }} + + release-announcement: + name: Release announcement + runs-on: ubuntu-latest + needs: + - release-build + - release-publish + if: inputs.is-release + steps: - name: Post release to Discord if: inputs.is-release uses: tsickert/discord-webhook@v7.0.0 with: webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }} content: | - ${{ steps.deploy-info.outputs.release-name }} has been released! https://modrinth.com/mod/${{ steps.get-data.outputs.mod-id }}/version/${{ steps.deploy-info.outputs.version-slug }} + ${{ needs.release-build.outputs.release-name }} has been released! https://modrinth.com/mod/${{ needs.release-build.outputs.modrinth-project-id }}/version/${{ needs.release-build.outputs.version-slug-base }}-fabric diff --git a/.github/workflows/update-loom-gradle-version.yml b/.github/workflows/update-loom-gradle-version.yml index 7817533a..1aac46fc 100644 --- a/.github/workflows/update-loom-gradle-version.yml +++ b/.github/workflows/update-loom-gradle-version.yml @@ -8,6 +8,10 @@ on: description: New Loom major version required: true type: string + moddevgradle-version: + description: New Mod Dev Gradle major version + required: true + type: string gradle-version: description: New Gradle version required: true @@ -47,10 +51,14 @@ jobs: java-version: ${{ steps.get-minecraft-version.outputs.java-version }} distribution: "zulu" - - name: Update files + - name: Update Gradle run: | ./gradlew wrapper --gradle-version=${{ inputs.gradle-version }} --distribution-type=bin - sed -i -e "/id 'fabric-loom' version/ s/version '.*'/version '${{ inputs.loom-version }}-SNAPSHOT'/" build.gradle + + - name: Update loaders + run: | + sed -i -e "/id 'net.fabricmc.fabric-loom' version/ s/version '.*'/version '${{ inputs.loom-version }}-SNAPSHOT'/" build.gradle + sed -i -e "/id 'net.neoforged.moddev' version/ s/version '.*'/version '${{ inputs.moddevgradle-version }}'/" build.gradle - name: Prepare PR body run: | diff --git a/.github/workflows/update-minecraft-version.yml b/.github/workflows/update-minecraft-version.yml index 98362917..7b9a1973 100644 --- a/.github/workflows/update-minecraft-version.yml +++ b/.github/workflows/update-minecraft-version.yml @@ -12,12 +12,12 @@ on: description: New Minecraft version required: true type: string - max-minecraft-version: - description: Maximum Minecraft version for version range + force-fabric-minecraft-range: + description: Force fabric.mod.json's Minecraft range to a value. Semver syntax. + type: string + force-neoforge-minecraft-range: + description: Force NeoForge.mods.toml's Minecraft range to a value. Maven syntax. type: string - ignore-mod-dependencies: - description: Ignore mod dependency versions - type: boolean branch-only: description: Do not create PR type: boolean @@ -49,35 +49,37 @@ jobs: uses: ./.github/actions/update-versions with: minecraft-version: ${{ inputs.minecraft-version }} - max-minecraft-version: ${{ inputs.max-minecraft-version }} - ignore-mod-dependencies: ${{ inputs.ignore-mod-dependencies }} - name: Update files - if: steps.update-versions.outputs.has-updates == 'true' run: | - cat src/main/resources/fabric.mod.json | jq '.recommends.minecraft = "${{ steps.update-versions.outputs.minecraft-version-range }}" | .depends.java = ">=${{ steps.update-versions.outputs.java-version }}" | .recommends.fabricloader = ">=${{ steps.update-versions.outputs.loader-version }}"' > fabric.mod.json - rm src/main/resources/fabric.mod.json - mv fabric.mod.json src/main/resources/fabric.mod.json + cat fabric/src/main/resources/fabric.mod.json | jq '.depends.java = ">=${{ steps.update-versions.outputs.java-version }}" | .recommends.fabricloader = ">=${{ steps.update-versions.outputs.fabric-loader-version }}"' > fabric.mod.json + rm fabric/src/main/resources/fabric.mod.json + mv fabric.mod.json fabric/src/main/resources/fabric.mod.json sed -i -e '/java_version=/ s/=.*/=${{ steps.update-versions.outputs.java-version }}/' gradle.properties sed -i -e '/minecraft_version=/ s/=.*/=${{ steps.update-versions.outputs.minecraft-version }}/' gradle.properties - sed -i -e '/loader_version=/ s/=.*/=${{ steps.update-versions.outputs.loader-version }}/' gradle.properties + sed -i -e '/fabric_loader_version=/ s/=.*/=${{ steps.update-versions.outputs.fabric-loader-version }}/' gradle.properties sed -i -e '/fabric_version=/ s/=.*/=${{ steps.update-versions.outputs.fabric-api-version }}/' gradle.properties - # sed -i -e '/modmenu_version=/ s/=.*/=${{ steps.update-versions.outputs.mod-menu-version }}/' gradle.properties + sed -i -e '/neoforge_version=/ s/=.*/=${{ steps.update-versions.outputs.neoforge-version }}/' gradle.properties + + - name: Update NeoForge's Minecraft dependency range + if: inputs.force-neoforge-minecraft-range + run: | + sed -i -e '/minecraft_version_range=/ s/=.*/=${{ inputs.force-neoforge-minecraft-range }}/' gradle.properties - name: Create standalone branch - if: steps.update-versions.outputs.has-updates == 'true' && inputs.branch-only + if: inputs.branch-only run: | git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" git checkout -b auto-update/${{ steps.update-versions.outputs.minecraft-version }} - git add src/main/resources/fabric.mod.json gradle.properties + git add fabric/src/main/resources/fabric.mod.json neoforge/src/main/resources/META-INF/neoforge.mods.toml gradle.properties git commit -m "Update to Minecraft ${{ steps.update-versions.outputs.minecraft-version }}" - git push origin auto-update/${{ steps.update-versions.outputs.minecraft-version }} + git push --force origin auto-update/${{ steps.update-versions.outputs.minecraft-version }} - name: Prepare PR body - if: steps.update-versions.outputs.has-updates == 'true' && !inputs.branch-only + if: ${{ !inputs.branch-only }} run: | touch pr-body.md cat << "EOF_AiVMO7YIg1" >> pr-body.md @@ -87,11 +89,11 @@ jobs: |Component|Version| |---|---| - |Minecraft|`${{ steps.update-versions.outputs.minecraft-version }}` (Compatible: `${{ steps.update-versions.outputs.minecraft-version-range }}`)| + |Minecraft|`${{ steps.update-versions.outputs.minecraft-version }}`| |Java|`${{ steps.update-versions.outputs.java-version }}`| + |Fabric Loader|`${{ steps.update-versions.outputs.fabric-loader-version }}`| |Fabric API|`${{ steps.update-versions.outputs.fabric-api-version }}`| - |Mod Menu|`${{ steps.update-versions.outputs.mod-menu-version }}`| - |Fabric Loader|`${{ steps.update-versions.outputs.loader-version }}`| + |NeoForge|`${{ steps.update-versions.outputs.neoforge-version }}`| ## Remember to check! @@ -102,7 +104,7 @@ jobs: EOF_AiVMO7YIg1 - name: Create Pull Request - if: steps.update-versions.outputs.has-updates == 'true' && !inputs.branch-only + if: ${{ !inputs.branch-only }} uses: peter-evans/create-pull-request@v8 with: token: ${{ secrets.CREATE_PR_PAT }} @@ -114,5 +116,6 @@ jobs: title: "[Auto] Update to Minecraft ${{ steps.update-versions.outputs.minecraft-version }}" body-path: pr-body.md add-paths: | - src/main/resources/fabric.mod.json + fabric/src/main/resources/fabric.mod.json + neoforge/src/main/resources/META-INF/neoforge.mods.toml gradle.properties diff --git a/.github/workflows/update-node.yml b/.github/workflows/update-node.yml index 73ffe831..1271adff 100644 --- a/.github/workflows/update-node.yml +++ b/.github/workflows/update-node.yml @@ -7,11 +7,14 @@ on: workflow_dispatch: jobs: - update-schema: + update-node: runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Update schema id: node-version diff --git a/.gitignore b/.gitignore index 93765ffa..26525b0c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,10 +7,6 @@ build/ out/ classes/ -# eclipse - -*.launch - # idea .idea/ @@ -42,3 +38,14 @@ replay_*.log *.jfr .cache/ + +# eclipse +bin +*.launch +.settings +.metadata + +# other +eclipse +run +runs diff --git a/CHANGELOG.md b/CHANGELOG.md index 633a89cd..cac04d77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,34 @@ The versioning scheme is listed in the README. ## Unreleased - DATE +The big headline feature of this release is that this mod can now support having flower types added by other mods! This is something that would have been near-impossible with v1 of the mod, and I'm very glad that it's now possible. There was a big internal rewrite of the mod's code, but it is now easier to add new flowers in a way that doesn't make the game slower and more memory-hungry every time a new one is added. + +Oh, and the mod is now available on NeoForge as well as Fabric. That's a big change too. + +### Known Issues + +- Worlds that used v1 of Tiny Flowers will not be upgraded to v2. + - Any previously created flower items and blocks will be removed from the world. + +### Added + +- Support for NeoForge. +- After creating Florists' Shears with regular shears and a single dye, you can now use more dyes to re-color your Florists' Shears to almost any color possible. +- You can now use multiple Tiny Flowers when crafting Suspicious Stew. + - Adding more of the same type of flower will increase the duration. + - Adding different types of flower will combine the effects into a single stew. +- Tiny Cactus Flowers and Leaf Litter can be placed and mixed on top of any block that Leaf Litter can be placed on. +- For mod developers: + - This mod is now entirely data-driven. This means you can use JSON files to add new Tiny Flower types. + - Read [the README in GitHub](https://github.com/SecretOnline/tiny-flowers/blob/main/README.md) for more information about what files are required. + - The `misc/tiny_dirt_flower` directory of this mod's source code contains an example mod containing only JSON and textures. + - I've also made [a mod generator](https://tiny-flowers-generator.secretonline.co/) to create packs of Tiny Flowers entirely within the browser. + +### Fixed + +- Game startup times should be massively improved. +- Combining two Florists' Shears together to combine the durability no longer leaves the old shears in the crafting menu. + ## v1.5.1 - 2026-02-02 ### Added diff --git a/MODRINTH.md b/MODRINTH.md index 7dff280d..171ca097 100644 --- a/MODRINTH.md +++ b/MODRINTH.md @@ -46,7 +46,11 @@ A big thank you to the following people for their work: - [Lucanoria](https://github.com/Lucanoria) - German (German, Austrian, and Swiss) -If you want to help make this mod easier to use for everyone, then please don't hesitate to create a pull request adding/updating [the language files](https://github.com/SecretOnline/tiny-flowers/tree/main/src/main/resources/assets/tiny-flowers/lang) on GitHub. +If you want to help make this mod easier to use for everyone, then please don't hesitate to create a pull request adding/updating [the language files](https://github.com/SecretOnline/tiny-flowers/tree/main/src/main/resources/assets/tiny_flowers/lang) on GitHub. + +## For mod developers + +Want to add your own Tiny Flowers? Check out the [Tiny Flower Pack Generator](https://tiny-flowers-generator.secretonline.co/) or the [documentation in the GitHub README](https://github.com/SecretOnline/tiny-flowers). ## License diff --git a/README.md b/README.md index 8f4d863e..dd4d697d 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,236 @@ Add tiny variants of all Vanilla flowers, much like Pink Petals. If you're looking for a more thorough description of the mod and its features, check out [the mod's description](./MODRINTH.md). +## For other mod developers + +So you want to add your own Tiny Flowers? The easiest way to get started is to use [the pack generator I've built](https://tiny-flowers-generator.secretonline.co/). Fill in the boxes, provide your textures, and download a `.jar` file ready to put in the mods directory. Alternatively, grab the files out of that `.jar` and include them directly in your mod. + +[![Screenshot of the pack generator](.github/pack-generator.png)](https://tiny-flowers-generator.secretonline.co/) + +Want a bit more control? The rest of this section explains the JSON files this mod uses. + +The files required are split into data and assets. The data files are loaded by the server and synced via a dynamic registry. The asset files are client-only, and affect how the flowers look. Unfortunately, most of the work is in the second half. For each custom file, I have written a Typescript definition, for those proficient in Typescript, and an example JSON file. Alternatively, you can check the source code of this mod for the codec definitions. + +To keep this README readable, everything in inside the following expandable section: + +
+JSON files + +### Data + +There is only one data file required per flower, which defines all of the server-side behaviour of the mod. + +#### `data//tiny_flowers/tiny_flower/.json` + +This file defines the behaviours of this flower variant. + +```ts +interface TinyFlowerData { + /** The unique identifier of this type. Should match : from the path of this file. */ + id: Identifier; + /** The ID of the original flower block. Will be turned into Tiny Flowers if crafted with or used on by Florists' Shears. */ + original_id: Identifier; + /** Optional. Whether the original block is segmentable like Pink Petals or Wildflowers. Defaults to false. */ + is_segmented?: boolean; + /** Optional. List of block IDs or tags that this tiny flower can be placed on. Defaults to `#minecraft:supports_vegetation`. */ + can_survive_on?: (Identifier | TagKey)[]; + /** Optional. List of mob effects to be applied if consumed in Suspicious Stew. Defaults to an empty list. */ + suspicious_stew_effects?: { + /** The ID of the mob effect that will be applied. */ + id: Identifier; + /** Effect duration in ticks. */ + duration: number; + }[]; + /** Optional. A list of behaviours for this tiny flower type. */ + behaviors?: Behavior[]; +} + +type Behavior = + | TransformDayNightBehavior + | TransformWeatherBehavior + | SturdyPlacementBehavior; + +/** Turns this tiny flower into another at a specific time of day. */ +interface TransformDayNightBehavior { + type: "transform_day_night"; + /** When the transformation is allowed to take place. */ + when: "always" | "day" | "night"; + /** Identifier of a tiny flower type to turn into when a tick is received. */ + turns_into: Identifier; + /** Optional. Packed RGB value of a colour to tint particles. No particles will be spawned if omitted or set to 0. */ + particle_color?: number; + /** Optional. ID of the sound event that plays when this transformation happens due to a random tick. */ + sound_event_long?: Identifier; + /** Optional. ID of the sound event that plays when this transformation happens due to a scheduled tick. */ + sound_event_short?: Identifier; +} + +/** Turns this tiny flower into under specific weather conditions. */ +interface TransformWeatherBehavior { + type: "transform_weather"; + /** When the transformation is allowed to take place. */ + when: + | "always" + | "raining" // When it is raining in this world. + | "thundering" // When it is thundering in this world. + | "raining_on" // When this block is receiving direct rainfall. + | "snowing_on"; // When this block is receiving direct snowfall. + /** Identifier of a tiny flower type to turn into when a tick is received. */ + turns_into: Identifier; + /** Optional. Packed RGB value of a colour to tint particles. No particles will be spawned if omitted or set to 0. */ + particle_color?: number; + /** Optional. ID of the sound event that plays when this transformation happens due to a random tick. */ + sound_event_long?: Identifier; + /** Optional. ID of the sound event that plays when this transformation happens due to a scheduled tick. */ + sound_event_short?: Identifier; +} + +/** Allows placement on any sturdy block, similar to Leaf Litter. */ +interface SturdyPlacementBehavior { + type: "sturdy_placement"; +} +``` + +```json +{ + "id": "tiny_dirt_flower:tiny_dirt", + "original_id": "minecraft:dirt", + "can_survive_on": ["minecraft:dirt"], + "suspicious_stew_effects": [ + { + "duration": 10, + "id": "minecraft:darkness" + } + ] +} +``` + +### Assets + +Each flower type requires edits to 1 shared JSON file, 6 individual JSON files (mostly to do with item and block models), at least 2 textures (1 for the item and potentially many for the block model), and a translation key in your language files. + +#### `/assets/tiny_flowers/tiny_flower/.json` + +This is the entrypoint for any rendering-related concepts for this flower type. It defines the models that will be used for the item and block, and any other visual behaviours. + +```ts +interface TinyFlowerResources { + /** The unique identifier of this type. Should match : from the path of this file. */ + id: Identifier; + /** The item model to use for this type. Usually of the form `:item/`. */ + item_model: Identifier; + /** How to shade model quads that have a tintindex defined. */ + tint_source?: "grass" | "dry_foliage"; + /** The block model to render when this type is in the first spot. Usually of the form `:block/_1`. */ + model1: Identifier; + /** The block model to render when this type is in the second spot. Usually of the form `:block/_2`. */ + model2: Identifier; + /** The block model to render when this type is in the third spot. Usually of the form `:block/_3`. */ + model3: Identifier; + /** The block model to render when this type is in the fourth spot. Usually of the form `:block/_4`. */ + model4: Identifier; +} +``` + +```json +{ + "id": "tiny_dirt_flower:tiny_dirt", + "item_model": "tiny_dirt_flower:item/tiny_dirt", + "model1": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_1", + "model2": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_2", + "model3": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_3", + "model4": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_4" +} +``` + +#### `/lang/.json` + +Each tiny flower type needs a translatable name. For most flowers, the English version of this string will be "Tiny <name of base flower>". + +```json +{ + "block..": "" +} +``` + +#### `/items/tiny_flower.json` + +Minecraft only starts the item model loading process from an item definition file, so we need to jump in and create one. This also allows resource packs to do more complicated replacements. + +This mod uses the `minecraft:select` model type to switch which model is displayed. If you want to follow this pattern, which you probably do, then you will need a case for each type of flower you are adding. The final `model` identifier key must match the `item_model` key in the main resources file. + +Read [Items model definition](https://minecraft.wiki/w/Items_model_definition) on the wiki for a full reference. + +```json +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "tiny_dirt_flower:item/tiny_dirt" + }, + "when": "tiny_dirt_flower:tiny_dirt" + } + ], + "property": "tiny_flowers:tiny_flower" + } +} +``` + +#### `/models/item/.json` + +The path of this file must match the `item_model` key in the main resources file and be referenced in the items file above. + +If using `minecraft:item/generated`, the texture referenced in `layer0` should be placed a`/textures/item/.png`. + +![Texture for the Tiny Dirt Flower item.](./misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/item/tiny_dirt.png) + +Read [Model#Item_models](https://minecraft.wiki/w/Model#Item_models) on the wiki for a full reference. + +```json +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_dirt_flower:item/tiny_dirt" + } +} +``` + +#### `/models/block/tiny_flowers/_.json` + +These files define the models that will be rendered when the flower is placed in the world. The path of these files must match the `model` key in the main resources file. + +This mod provides a set of pre-defined models for common configurations. You are encouraged to use the model with the fewest number of layers that still gets the idea of your flower across. + +| Number of layers | Tinted stem (default) | Untinted stem | Texture keys | +| ---------------- | ------------------------------------------ | --------------------------------------------------- | ---------------------------------------------------------------------- | +| 1 | `tiny_flowers:block/garden_` | `tiny_flowers:block/garden_untinted_` | `flowerbed`, `stem`, `particle` | +| 2 | `tiny_flowers:block/garden_double_` | `tiny_flowers:block/garden_double_untinted_` | `flowerbed`, `flowerbed_upper`, `stem`, `particle` | +| 2 | `tiny_flowers:block/garden_triple_` | `tiny_flowers:block/garden_triple_untinted_` | `flowerbed`, `flowerbed_middle`, `flowerbed_upper`, `stem`, `particle` | + +If using one of these models, textured referenced by the layers should be placed at `/textures/item/.png`. + +![Texture for the Tiny Dirt Flower block.](./misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/block/tiny_dirt.png) + +Some specialty base models are also available. The most useful of these is likely to be `tiny_flowers:block/garden_leaf_litter_`, which gives a very low single plane like Leaf Litter. + +Read [Model#Block_models](https://minecraft.wiki/w/Model#Block_models) on the wiki for a full reference. + +```json +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_dirt_flower:block/tiny_dirt", + "particle": "tiny_dirt_flower:block/tiny_dirt", + "stem": "minecraft:block/pink_petals_stem" + } +} +``` + +
+ ## Contributing Contributions to this project are welcome. I'm still very must in the process of writing this mod, so might be a bit hesitant to include wide sweepeing changes, as this is a learning experience for me. diff --git a/blockbench/grass_only.af b/blockbench/grass_only.af new file mode 100644 index 00000000..c937111a Binary files /dev/null and b/blockbench/grass_only.af differ diff --git a/blockbench/icon-dirt.png b/blockbench/icon-dirt.png new file mode 100644 index 00000000..295f72c9 Binary files /dev/null and b/blockbench/icon-dirt.png differ diff --git a/blockbench/icon-dirt512.png b/blockbench/icon-dirt512.png new file mode 100644 index 00000000..7aeab488 Binary files /dev/null and b/blockbench/icon-dirt512.png differ diff --git a/blockbench/icon-example.png b/blockbench/icon-example.png new file mode 100644 index 00000000..8889fc43 Binary files /dev/null and b/blockbench/icon-example.png differ diff --git a/blockbench/icon.pdn b/blockbench/icon.pdn index e5dd4da2..925e9923 100644 --- a/blockbench/icon.pdn +++ b/blockbench/icon.pdn @@ -1,8 +1,10 @@ -PDN3s PPaintDotNet.Data, Version=5.102.9119.37914, Culture=neutral, PublicKeyToken=nullPaintDotNet.Document -isDisposedlayerswidthheight savedWithuserMetadataItemsPaintDotNet.LayerListSystem.VersionSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]   PaintDotNet.LayerListparentArrayList+_itemsArrayList+_sizeArrayList+_versionPaintDotNet.Document  System.Version_Major_Minor_Build _Revisionf#System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]keyvalue $exif.tag0[0] -D $exif.tag4[0] / $exif.tag5[0]7 $exif.tag6[0]7       PPaintDotNet.Core, Version=5.102.9119.37914, Culture=neutral, PublicKeyToken=nullPaintDotNet.BitmapLayer -propertiessurfaceLayer+isDisposed Layer+width Layer+heightLayer+properties-PaintDotNet.BitmapLayer+BitmapLayerPropertiesPaintDotNet.Surface!PaintDotNet.Layer+LayerProperties       ! " # $ % & ' (-PaintDotNet.BitmapLayer+BitmapLayerPropertiesblendOp&PaintDotNet.UserBlendOps+NormalBlendOp )PaintDotNet.Surfacewidthheightstridescan0PaintDotNet.MemoryBlock *!PaintDotNet.Layer+LayerPropertiesnameuserMetadataItemsvisible isBackgroundopacity blendModeSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]PaintDotNet.LayerBlendMode+ -Background ,PaintDotNet.LayerBlendModevalue__ . /0Layer 3 ,  3! 4"5Layer 5 ,k# 8$ 9%:Layer 2 ,& =' >(?title: Background ,)&PaintDotNet.UserBlendOps+NormalBlendOp*PaintDotNet.MemoryBlocklength64 hasParentdeferred ~,System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].)/*~3)4*~8)9*~=)>*~  +PDN3\X OPaintDotNet.Data, Version=5.109.9343.2610, Culture=neutral, PublicKeyToken=nullPaintDotNet.Document +isDisposedlayerswidthheight savedWithuserMetadataItemsPaintDotNet.LayerListSystem.VersionSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]   PaintDotNet.LayerListparentArrayList+_itemsArrayList+_sizeArrayList+_versionPaintDotNet.Document   +&System.Version_Major_Minor_Build _Revisionm$2 +System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]keyvalue $exif.tag0[0] +D $exif.tag1[0] / $exif.tag2[0]7 $exif.tag3[0]7            OPaintDotNet.Core, Version=5.109.9343.2610, Culture=neutral, PublicKeyToken=nullPaintDotNet.BitmapLayer +propertiessurfaceLayer+isDisposed Layer+width Layer+heightLayer+properties-PaintDotNet.BitmapLayer+BitmapLayerPropertiesPaintDotNet.Surface!PaintDotNet.Layer+LayerProperties   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; <-PaintDotNet.BitmapLayer+BitmapLayerPropertiesblendOp&PaintDotNet.UserBlendOps+NormalBlendOp = PaintDotNet.Surfacewidthheightstridescan0PaintDotNet.MemoryBlock >!!PaintDotNet.Layer+LayerPropertiesnameuserMetadataItemsvisible isBackgroundopacity blendModeSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]PaintDotNet.LayerBlendMode? +Background @PaintDotNet.LayerBlendModevalue__" B#  C$!DLayer 3 @% G&  H'! D @( L)  M*!NLayer 5 @k+ Q,  R-!Sgrass_only: Background @k. V/  W0!XLayer 2 @1 [2  \3! X @4 `5  a6!btitle: Background @7 e8  f9!gLayer 9 @: j;  k<!lLayer 6 @=&PaintDotNet.UserBlendOps+NormalBlendOp>PaintDotNet.MemoryBlocklength64 hasParentdeferred ~@System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]B=C>~G=H>~L=M>~Q=R>~V=W>~[=\>~`=a>~e=f>~j=k>~  vcIy3!\Qt:"CdfefuWuuլyyyyy=C#2++:.l<8̎}wϿVĊ*zV|bXsbSlZ}6.-:\ܿ|bzjXTڰܚ&kZݶ֣,zTX"f َ-{6TtSryæKRj֑62|fik˕M[*|e ٶo_~Wo߰2Rh{JeSdZG[;<׾D0xl9j;/-vfA| 5Kv7QVۖiǟK7uL.YBVe;'V?m5rܳL 뺗onKu]9RDkS{)L؃ޒ=/ƊM$mj?m[ {l\}W؇Ni>M-_}`$هNi>JNi[E{0XGv:ow˳Z:W(=<8dmVk;]ZsҪ;yuοŷֽѺ[H/4|gHH,ZrA}f퓯m3}oO_6`mxw֯O9^>xgK5Ux.F6Uy3]LR? +J*ۯ7/omзDke=TfUuc-ޅ5>oВ}[liRxlf{ήWʛZypT^c\ک|op9ײ"mBR5[XwN{v+l=K.u?*;/h*s+o=J;i~n3ko]Z?:ήB]}Reu[m\V=R=?e*ϵ> %Cut k{ il"߳Ts\ﴫef?Y߉\Em־c'װ\eZVnmYmcϖzOݡͫuU_hwX'+;EKTtLTW|jkۗ;pݭͩn)v>?߱՝%liPݖB0lYLNʦv6n}^} o)Z G7hC26}X-|RJ⓺%Aw^+cWܫޒڼݔ=.«W_P3U>iN}q;Yhǹ|mj\Mfh߃QѹOfmr7u9O^~Mg^m&661q^}mb%{Fׇ]K5Ⱥ~a7F mhqpmGwx'OL,{ rx̵m>Uբ-jis+ +o>;/?ʴՆƳdcR [.-Y\ӻ @@ -2628,7 +2630,40 @@ c 1 0y{P"MFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=*f& 1 0y{P"MFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=*f& 1 0y{P"MFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=*f -1 0y{PaMFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"y! +1 0y{PaMFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"y( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4= ( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4= +( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4= ( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4= ( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4= ( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4=( +1 0KS/"ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4= +1 0KS68ڤmTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~{N! 1 Om"! 1 Om"! 1 Om"! @@ -2759,6 +2794,245 @@ a 1 Om" ! 1 Om" ! 1 Om" ! +1 Om"! +1 Om" +;/Qp_ui4.7) Vl,/BzbhH*'K㓓s=t%ِ)C?d*Plȥoٸ+ kuϟ7 >/'[Wow\傷:0u'zғBz}{6)>Z=קca(<Ǟ vca6xo=:Rм3JaZ|'޿;F~O|q{w@.DY7  +Il\w!8pH؎{8{43x8tKPЊUEQ%D = @BTBTJP"zRɛ6^f3G)R/m-oz5k(mG:ZYUS=~wGBYpln)祐?v،~dН8SN=CY㯖j(.k6ox*'ۣ_I:&onpKTv1*hJzj7lMiÂi}򧡯 @v9Ô4D +x='M}fsuW樂}ug?=?0ny)S>ܼ>SQ׍wB_C|3⹁걭sjvwnіkIxrϽ4|FۖݞvsBx|9wϿB_k\>vs<ku]1>v ܜmk-[q7>g6/s43{ }?,W.~ GOeg7:ܡNhB#u䅳+q`ֿѿ2qݔ3 'v΍ݙ~+}IoѶmy)%Exu{g^V^su`w>=om ފ=5SۢSc}oūcnYݍY]x~3k;/?VU5=9q3~^;g03XT9^{r=ntۇwf>>Vo9U \{noc gն9iR s]e(l=7~!Z]OՄoY4JL]L{N=^ +Ǟs=)=hCokѝWK۞g}WM~|] 50;gTm~\=:>kqslmK]{33Tn]L{N܍/-!'9i=wzmȭW 4-='Fn~y jSs{ RG9ٜ5Qi}Ѷ=zCo]޴2;ԑK`>ki*9YnAv=Eǿs>YU5OgXyw4x7!|(szt|6d螼);0yi'Mܙٸs l7|9xOu8Syȭ{C?GBCsy7zHau];q.`]TB?WP^Yy.noϣ-[q[Ϊ]8 :UN:tμvg r`.vw [+٢Q>vGn޽s_ jU7nN uE۞7i_8mE1in⥳ <j0L}^3spa>p1g0S{Ni7:US9i.uΝB?Ovt[tNӞvwm{N#מ='͎=VsBiyʣ[ Ko {3=Oe='Fm{NN)0~{rpsS;V=g܍>Q9q7zhst\='n~J;튁kҢi7vfgQv'ۢ E۞ӧ'?ڛ.ЯzӝG߁?;9ntkIk{N-Mrۧ;}sWQ.oț=sntiv]9i_Kݻ3Ip}@Ztpqμ˙ڞ{hmgUѶi/{?BO 6~{z}9O{ta ='FלQl=O71z g#߬9yڢVY9nd[ 񷽋=OE뺫wߞyy9?g0ztmá{q[t sCMQ`q ݅s1S[sj{E.39Ztm8Ĭ=Pѷ='Mчn+=U;='ML]~H?]T +Kl\gq VlX ${f<~؉Nlog&M& jZ +}  n ذ`QĂJH $!@6\tq{*(dꙋs} ӹCVlf8ekZ|tzdbﱏS֑~xt'MZG'[JV+aezR=ds|նo+#N U3Ѭބƫ'gȿ'Ÿ=cY+֭ޓ˙ ڳiZ ÷@}mukCI>ynlT^Lzg|\{.ٍou{6FͷjU{6Mr+g?k_=4aGS{.[us؍IvWԞL_Ļ=w5nΏx6Y' Q=is;y,tl%tg'>ݑ+N 7ڳi7tut%ٴ];ۦڞ6g$۶.޽qw?նyz˱;;hixڑ݊۳9.3jϦhy]ԻG=vZjGƚ3fxlׇ~sڟnM*՞ #Q Y{(JGڶtF\ zآs:ڳt g2f{X/=}{6Fk^j{6Mx0rgW?-A{_ڳ@g9 Vj۵,qڳntl[۳ntzĮ,-iMXc^~Ml|.@l>߼Ynqś<ؠޔ9CZZHgnwlڍs{=yOrpK3kDW=hsu=KnȮM¾Gz_IY^b{vڍ&ܞe}\鲒#w.]؏9r؞MӼ|rkO v=N|bݞMgjjϲ݄UwLvW{.Nkwb/hcxV>;rϠǻG'NGXzvE$&=˟=Ys.H>HGԞ=z:2֤ގ9lt0~oڟA^|E<]{hҡAkqo{ZFFk7Z)=.ݒ9ZniY{g?`͍r]n⑿..4r{ݐ۳Y5}qu{.5pk/ڟ_Nctq,F8aOr]؇Ԟ&{W=w/dgnt}>gl҉ٯmPkL~]{^ݞ'mζE=֞ͻޑ+ڳE< +v{^=;Ff{oVoS;feN?ؼVy+96N~4{usmLll=Fv;vVӞMrn۳SVݜw~J{6osjϲݚKݹh?*2'Φ-kϫegCΣ{{6ED@0=wv, E;;FWYޫ]i^Z| R_Ljll3Yv\șնg9҉ߞelp{{vލn=kwrv4Ҟ[#g%x#&\YٱGOgCwf~g=֢7zuOGG$=0ѹ0hԢ, +OBGڳi7Z=˾|wݍŞ+j?[_}bݕlju=3Z=;!yX=w3Sطgw}lKy(gdWO=\{A g[|ϠW ڳylχڞMtȎ6a7|<lڍ?=Ԣރ5~.g=Go֗rϠ-ZBiSAi{Zzi{I=;ax6أVxYwQoN]>WsL?ŞW7~.hw*g-gFԞi7wjrβvCvo7:cwWڳy7ZYӞ?D>g;݂ОOgl *>-=h/ݓ>c<E5{ݴgJ{ Xk9kfޞ[+:'ʏnLr>W3ToğuϠ#o/\ܽvjϦ-U=G/ڳi7Zd{Ts`ztڳi2=[_|Ey ʓ]9vyiϦ6݇n=-z awKvlhh?ڳi7z$mݞ/|ve|P-;u3mV畳h?C7nt7wnL4[;st%^9۷=iѲ3:[g=;1ߓўMs:ڳq7zܰnvKvcR .\ +;jrx\<-:=Zvi--ljrv_L{iNF8LًÖMrå7h?k w~pqhѲXM{6-l3:-Z^?۳EK=a-W՞՞+ٍZwoM#1QӲtA5ٱGEK;h@=ᜎg0 {{6Fu9YڵzVލn#I?~}X |L=^MP/߳hA:3Zv Z{6hώS9Qkώs{[gvs wOzoaWLg0-Zvч/ds/9hUl܍x7Zb|.ww gaguLⲹ=/h?ѻLLwϠ--A3k-5li7Z::y%Ҟ#?;.up`(?ݧ#~˹G'c~av_g0-zl0jў"ОM-ZviϥFkߠEnG݄3۞ #};:TڞMӺW{m{y'3ڍҎ;ot %i#MșXkJkwFuٞ}lg&wë߽sN7_HwZE>cÒ~3<3:c".}b<^<>n~Mxs2Z;n^. +oiZ . ,жm;v9'8>vĎ$3 3a/Њh$.VZioqp@H`!e7 _vSU_U?U՟zNyCNbzxhuz{枬}}n`PۋKgT^mek8I:և^Fymޯ^hisd&{^HzG;.s+Ǽc^ӕDrp2s7=xF1ƻ=! )W9[Bυ}ak{^+WeO{h,.X=+q9\9Oi{0rd"\k-y'\j{J"Ps~۽CSIu,{.LI䃑{_^?̽?:UW>ZU8 ,/]k:Ր.{蔙{="sK6} =[挛4ܳ-vܳ-[gg |?Omi`cjYP."Ϛγjaܳm6Zeq/l.m\.8m%2흭ng>W;^ u4.ןݝM, ƪ/hVr֙NuW{tLE< =z:X9GyЏl\ꞹhp8D=sw8|tsJ\|]}W3Iuw{.5?.>O/9a{a{֚kZ)5->x(nԒ[|x2_]qqR}br6m:/dܳm~ܵhgl|_vrs4= vُ48-硶'#^0wݓ>CwGH& P68_W#~Fhj{:uꞥ!ٟhVwaF[V5{O[capk'pwǷkvϸ]t:w6-\8ɬfPY~塀"pzعgltǢ``c|&g|(t϶bhu@+Q>h5-nL=n(xLv3.Z:qt6-%HqB#&ݯvL=FzaD1Jҵx76?z:嵭]zӱJ~z՝Y0/4` ;r(-13=ȼolRf5\.G+yC{pZg[pWmYvl;WF~gq2~F9_鞃Au{3;Ïf&}q:.:2{^i,\Y3)i3Zfq;9Ȟ끮=fi8Dm_gd>lKbTvPr51H\tw#\F-\ܺ[hNl_ \̱g} ɞOlG+ĿǞ] qr/v"0ݳE˳Fݨ%͙?^ivnA\Ngqϻݳ,yAor型#Vzsa( Vl\{ھ9?{ve6Zw$'=u@Y5G]LGE\_q z:p϶k}~yo =Fo N{M,<:q9rKm\OM&ҩOjB?l;֘mwcƩ~ywgc=[]t&>=0s0w/ѷN0ml.nԒ &V*ߞ3=۲o=]ȵgq +ySAw>5Aw>5-߷ ݳ\.مh9'ֻQK:? + ܺg]{=fųjRܳG8vҿk7G;ԽqPѲmU݈ϑtyn}k:XyfGb .;ި$ψG=\w{Zg{.N=W gf쟇۳׉8h9Jn\k8lKlh4֣֙c9\\tcWs6-Elwt;.Z9= 纳yK|Jb>V5-Y#nTy/}R֩^{4[=EIm.Z~>.g:s C!袥S,86>d}),ؕZ!fh\Km^ Ņpd2UwE7n +=\E퓝vAtVQo0ܳ:Vp=lʋt9i{`מ?\.[WޞB{}}+~rp6nP%}pٿ +\ltp.ZőPk: mB,0⦥I qiǞ~:f%f^3DptM꾹ұF=-V"~F8gI='M#R~U9rsE.z"i+v=fW7-> G!\mlKTߋ+KkRE;jDݳEgaq2UqydqE1ǪK >]ޕqw{CAl^r6ZfvϮF$\ϻ:.y'V/:ǫOZgHʺ^Jn5 N^}'H{D~vs]>}½ލ{72-ٖ㩭澣v0xvb\t.Z#y6)v\XF {h:!^{tȌ?{ "Lu{!CwcZw&=>rϾ^"גYpٵ}qnD s]De꣯$̳ m_gr׊ɤO6{E҅E7ß6p-4ïߎ{ew_jo RKC?s}A\N{W!Q:m.ZDc힓5gSד\?MQ{:rϻgX+>p,P,.nhF:bw׼.O}r)}Ki1hs]~xsm{hQl{Lf_HcW7GzC\pE*23 +\Ɛyw'2aF>Kӥvo.|kan>k>~)gm;ngm5K;- V!qAgkg۝2m=rjk}ngldk[=W3=_l>q=ǻ=<ֽui?i=OZeٖg[Ů-<{葄_v1s޹D&T~ttysa7l6zhyi\lk|^w^/@mL}rz^y]wdpZjp2V{h κgsR/Y+ 3sD#,\U?ķwy{~9&rO0-ǼG~_8sKN;g|eP=b#HE;g暴}ٶN?+q=z:=K/SE9r?;veCl]wcu4=7WMfvt{όuyϜ'9s=ޞ}*wd]KwOγεsܤk"u$%oT{nY1̜֮Jcb~\&%=Gʟ zs=X.zg*8=+*d&[7{Asm8 9o頓6?'/ߔ~'B!$_wD-.pXT!^\.U.kXM梻. = \1:|.]EO,e=e"o3%WSsGFC^q,pcl *IiG*<{nqMJ;v+\KSSB!4?SnܳEc)헛GQEc͊;i78q螃ht]4~fi(pij'wfUl vqwÁs]7z1]hZ#ϵ1艼3v}noO !BI{+CO?;rkԬ}&,좱O{•a ,sٿz-1"퐣Lnw~&. B!$j^G_39}¬C ."8_6(N8UaFX*=)53ϫݳ= 1I7r =I{n؍w=g%:GsZB!v7?дϠ+=c9EmDӧ;N0yӇζ{.6u6<;i:tuٻXr>w#t 헃uM7)XWϭҹ|{mkB!B[??|O>vE{=n{I^6YtѸ~:=k܍32賺 p8N9@o,{5hs{}ms7u{>Su> >M}nʀOB!4k'iA'. Vn=/\mI{nݳEu=WN*p`v@Q̌Ɵ=ss]p_mCs7Bu1wb:|7z~8nRQy16y7ߍx_zA!Bȃ|{׈gP֒'ͳONdEc=gEGf{c~;#ҾWSؒ}n7"?SЍ}qTOp/z??|wSMawK?^wB!q߼}έQ܎N+}ڱ.zǤ{΢n=Eϵ. +:8Ft϶`v{`~ss:౓>w#L7 3:Yw6c&{=tۂXTsm.==gEGmO{=7ڿcR8QvA}/NL\'6w#L7: q]v\i+;VӯB!17 'PJ{ḧvN3ֵ*ipqni.>IgFP=ñJ AOשәo.Ϧ=[Mji1f)6u΀_lK!o[W*^!B!ɥr׻sm }pIxGޯ{msS\9 .IYܳmNqgp's}m8B;qAg=%s7w7w~>sŁ'Y('X[9>%HUV70B!D?+_9oF޹6p_>!]vs>gzvItܳEtϕrPkԥ}%E_1>4I7XtSuҾWSLum{%09.sW_wu !BkLuu.z8iWu,ܳEK S='Ektu.ԁx]tݳEéFͻΌ^,o8wYR9gpJ_tϵ@7:l9>z9 {:B!DW/g sϙsiwn.s鞭.zZOlg$gF9-0;@_:fo0Xw]p\[ٖʱTY?='E*bt:;_B!#W'm>Q^A%uKL޹7=]Ĺg.z2}z={ڠ c4 >[^5WCp c?׸h|Jaughxd9Q>Z*kC?^B!w-f7޹wMRy^|.y9Flsј=]t魺g/C-̱vL}|nuύ מ׍⟵hْڠ7~¯MB!$8sVhgcf +OLN= w.׸-.1م:.ǺgXݯk8i߫)6wD{ ;݃,hs>p~W'>'=Khg:^ڧk)B!ҜnnqEu5`X3ֶp>m}6{x3i_Eg=qt \<_buMI_ iJޞ>q7:bvs}4SlqѸ^a(}N@7PShs(pQku];])!By_gЅopힻ.$= }yafB;?#9{Sqϫ=~KK-GXك.eqiFmb϶90TmF'ƱIzUGwEzE!eKC_Ĺ`.zJnu7[?xkk3B!1`{&{3EcVf\|y܏Q%]4uB##{k×=gE=ۂ;n7v0?3 v]ֿcy|?vэfى:gNk5B!3~w53EOcM3y^W=7wϵɰ\L:]t=k\K_P~'mq}ms:e7ntρ|4`SgO弹VץoB!Ibxs?:ƒ`A^Ɖn>= k5sx_9.zu6 *펣Klsp4^OTǔE{png7hUe:}uyf\?K!Bfz' FǺV7{M]t !*J\ĺh3c;gF#mD3ql]F]}/G;tѸgs0htL̬:#NjIdm6{'_B!DKnmM{;YH[9.ڹ{9y=\4jq= k ϚjG:i}κ{e xgk@=Dp-Ə{FrswCk?B!{&S`ؘs{9c.:R"{^|ڂ5snq•sK# s.Jʹ(\tWnp88w_pySygg##ykf+îF7fXkS$$Bq?+nN ,ҾWSLPQq"s]4Ym/ :b|۝PJ{룷|Vay; .yG5o?A7CҞU;b(smM>yCB!( +Cf~d5]ͳT7=osMcu sѸ;&.UcwϘ)7uM/1MwAl|NK`pF,V}5jUL/aW#}Ӎ*<'<8g>ʮS9m~UzH!{6Nz\q<ֵBܳEWJJBs]4SYN{ ~#ospY>rx^1׫]spiX2f9[U*߫;{a-ysI{5wx3~*$Bܟ,^iꝭ.Y#Kas1ݳ{NV垕DgwGY;us 1g:[.==ۃs߁}<}s]{KP79YFH>јwߤIW7ӥGזB!l~|珋vϵs;+Ҿ8TgI{^t]j,;Y6L'EÛv_i!݋ƙf:ݳ-pBY;S=T4xbugh|&O17 +⚽4s6!$B<\n=׹gq;ߟY{sы%.:ݳ>u3vv\ts.p}seQ2NPj +jT33$Uvv>'Vb>SnwU'{&_NPzI!lqtL>Qω 19qyGwщvώ]qStf9XC8p!=3$s7Z 6g>_}OJ}܍`1硴i= ѳu}n!3fc΍Ѹn33W]';/.~@zMJ!tr/і Fr~w鞓m.BYEËe=׹.qpVv/Zk(޿v>a>>F#(>ѕ86ZgoӟIS !n~a|>P5ƼOjLbݳE{@.,g6{z=7 +3(leWJ,Zguc*]0,hWs:Je_37.n4$9JFqhw0S}Ս>s'A7z<<Ʊǿsw*%B.n +A3:Llut!c|lQjM̮uW7w#H*iܳF:3zW%4\- +I}ƅrrvSFgl.#.3p} 2%ي# PK!g $7AF`qbL߫QO뮽WekH_zW_}woZ:5_NݤtzF\şO/ XVHj~~l==i=ulOuZ^뱞Ub:1ݫ~n}bOy63W'/vXO^8k?}ꪖ'D"H$RoVv/Xƭ[cƺOY7@#gV՞1'`// R^*+qzA|T1XgZs7JΨճ;:Ve2DyjOj=xs}~F?uǢKٛ48~ռay6'{cm%{ +㆚rs?^g}H$Dt_\-N㸍ӑs Ys( {n.RYTjLe]`*`ʘ[=kY9GŁɟ,ߨYxGrFץG|IM$:=p){30F -5h5tUΥ[}꽱H$D53uؿ{'Uk}3ž=75d5Z眳h5Dbfјo15Wc=SgM>ݨ0`ʢ >{ʦJ9\6.u;|f<{ 1vT&7޷3n]|8_/}z,D"(X|8m 6/ /K/ {͞m˞sƢgbHg VS3`M^*cM^5w#ƽ ,r%0{3+ghOr= +nà~r9d՛Cwpk??D"H$ +V߮]ϑY4U3ֆ3^ZNʷoRy!YX}oeYg$ɞfFInfјs#bΟ=p-UcFr`ZŶ<3km}lt^ʟ^hd7gk§w.Z$D"^۟/^ g܌"c{`;Z9zk{ֱwEʞ3ȢB9vs+#Ȋ=kX4ˁSg\#سE7\! z7Rbӱ|!G>63bH{{nbF_&gisO3W~HD"Hdŏ߸U9q95f1ZcL͂ b9`Ѹ> h 1'ky10B43Lf:Kz7J7t1eʒ}0)ϽǏ>slT'9#NXu_8KD"(y! F18 i4l= cŞ3Ȣ|j0ˢ\̀+eј`Լ8l4fˡ3ƍ<-YdZuEo95fFB͒fh~AΜUFP?\y_SE"H$Wtu0{>U5Ps$?OYQW#g9A V=馲X~1_}tV5;S|Þk45d?9,:d-Q!5;ĝ}ƺà=sF>н=[ݩO~Qz/D".T'3=9q\z'Il\1o c {&g6ǔ,ହhrn649$as^z:>Fעa-iVher̨{#0I?{O PE"H$J[C~rr{s`@͐úcu0ucѪ+{g~X꠰g,:9&eѸžۻZR^Vܞ=kYtyƞ3ˢ>w9puPGjj/BFlt=_Nn\9l6g)A]ٿxWED"H$JJ<8JuQwH  sj>9+/5[LϢoXŒY}^g{w'hŢJܗj6̭w#0 N=! CE +k{vos2۽[#ݩ=|'D"H /˩~rܮ JoMbZ>Ԅ3:IȞXYG='âq9/cpQ㑚r4[tYǢ1sɞc=Yyfw#063 lR6Zexp hKΐcF㽃tov &+o,ԌA$DF nə>r컟fQq3!b8V-+koO<0b@zH=yA#=({|7{nAH;w3Ak?XyH${v9>ŭg̞tE {Ǟ;:[ g,9,YYǢ{>+s>{1¢hS Ss$m,,*>g[#*ԥ37Lt{-<Cs{c? +-hqmڱg-fc<9 l8Il>gm\z7Bu;w#bgd`y>e3 wWAU/gM6Fq1c*Vis`WnSH$P:z̢<E]Zm췐'&c!56=7h6k|/Z|Uzlty)ލ,,3QgtٳGϋ}dЛgռ֛Sl|~ahoXZ?4ս8}3{h%b:w ['5D".ߟtHy9[eb<;/Wc_c:556=kYt[9]F`&.ܛ$e&h'ٳE#o%ьDstHz7b`%̓d7ã3ú6Bm#%voFh&;wC6HygueE +sN'<~Skds;݋ƃqjF"Dt~ehNݐs;cfn+6o\ ǞݙhVl{ֱhs9y  fș=s`Ξu,6݈Ȣw3Gэud<}n&s{S}b|aԘIl)ll4&=g{H$kWzGO7V/5dMm˞X &FE#*{zWtYϢ鹲yYâ33nZFP{FY45n&32$zzC{g۽p 0#φOר$ښyLg_z pf_^*[+_5KD"?-<6|غh̀RYρkY|ά=g+=7hRX4sZ,SٳE, +{E hHo벨s5쳗qypƾNqZaX1q,.,ڔlt2j}h{~r~D"Ykӹ8,ZkPഭ: "gFV_-:4 6EsbϜY450EcR3c,{'3-a9аz\-^nF>

{tg5+ngI" õ!Ưٮ-eqVߍƸnZ*m;X{.5D{PfvFc Eɟ=+mO~ޏS~L$\9Qݻ:r8zO=y{E81goN6ϯ潜=cm=ɣqp:<:JF^&'[v? Ųտ1qۏH$q?W8љWžu,L <-Թye8t[Gaѭ,Wٮ {vhe}b|zP7QY4m.L ʵ3[٫qѴ3L>{ə>;CVsh&eeooA F6]ֹf~|5D"*-s933 H͑ca[*'žw&tE {n +{Ȟs̞ԡ vIz9{E;IسE#'L͋4d/gg,גz0=X4KH=O]hϾz:5g^sYsz9$ 1Qs`سyÅM͐D"(n*oN?^ʥw|i z}wӢ:aLOx'Wio:s>rK4::Nk#ޙJitjeZ89ߣU3ߺ _Bȡ(oÞ +='`ч5b\!縜y8p~גӮ͢X4e/3=ba6m>3'eѷ&{Ӆg71Fa,NK7ZNFk$aLvb~JsGa#SQߗc@g:-pduBlUٹ^[[?7(g,>s[RTǢWN8 +{Ny 9̅+w>n+{vEcNa͞X^ ?Δj 4ع,{5왓Eߟq=7 Z73>vǮz~9\-sGiq~~,be7?Gշ;;{n%!!Q]775WoEoQ=cQps_ssss3Y9fN,s쌹ᙟ45΢Z˞[hWRwCKq7;h(SwMog?C8-gj4y;ik3 tgF( ܹoN=_ϸ[qOvU/F.)aسxV,wn3{nb,YU8Wr8|t9 ?[gX4՝2KnhwvgLϺaLX]Fݼ]Fj0z;i.qEsK'{{^v0791oon׸ٕ3=WΧQ{Mj2h9\*wn3{E㙛ƞX4ʓyV5%`fȟ:}ΑEcdg`ƴoT+q3^Ixϱs?_.Q,9ZsAo<:{nl#oһd,KBBžl/{֫ +75]Zz=OL9fϱ +Kž.Ξęh {.EcΗ=DZÚZ -Y4v0>`u +)ܢott _PZ # +h[/9{áϷ~r珹q^9 =VuXasޟ`gg=EֲgCY4ƪ2Ǣqn͛=>hnAX4nhdѥ ,da/lbQelVf"o]u[`?矗h>'F[Ş[z ͎йqo_7󒐐ɻ yzu{*}MKÞhp͑=Ƣ9ٳm`^a`ඳ&Gn'5b *{cؓpzN?[Ð)`*.hB-9zG ?lGlLBB"scs{鬭=ڳH.l'dlbh\&e[,N~,Ec='I8_܌TĚJ̢G\3rbB>4+*"gQ7tÐs4ϝ$]hnlv'yp%n^&!!'>j:hʑ(Q}K{9;¢maϱ,j?A {֘nc8W=DZhI38A)j>k`ѐ|N.bՋX;5I}mK+V[3V3g"Itg;u= m[6~Md/o7?Ho?+u}u1O4ڋfq= m7]x9r:X4-ž5jm$A A` cCҘ]Kq|/75]xs;s Cm{,j>wӱUYr!*IX?1Fk}NRc:m>'sa~KM=;~7SsjgP,D̞sܳlv='r[x9{+=f5 A/zCf_ nHg'MP3~b +k(K!skhԒɺv8\{C9{aٚڠޝ~IIHHϴt}vg'ҳy9edq,az +u7 ljC9*x ྦ|ĢCEbaq, `U~ΜY1#Wfڼwq4qhP/ 6/=ety|ɿ6ݚtOȟϹDw~q&>z-9g>%7-u*9»'pB=h5U{mٳuu!,>>'agYnas #;oNƵHfs[}o|s7raXybx0C9ʓy}nk*{3^Lĉ? `suz>:9 +'z-w}2,,ZsTسyX2~ys%75M +=)7.R`:ٳ,Xp$so4xhyg].y@퓔 U:sӸ@Ʌ5>zN\':c}aj9= yԒK&L~sc~%-{.#Q\fwcɞX4X +7gSgg)X41}^V sS9Ӵ'[`9גR{CMtΠѳ7 6EOQolnO/P*>9u6?{o,-!Q@\tQ3 ZUĢ]\=žSh (;&[ŞsTypbzsX4s[e;/<oeyS`Sm뺈9ceKIOa-2 fUwԙX qs9 co3hhBsee ucowD7-9=Gu[ȝ"ު&t΅E%gxsP7a=Ȣ>w+uȟq_Vs'4بNQ:65»/~06YS uc1ε +5XokS[ga}uje(={ҳPs:aLCϝZ͞cX4y"eeq,>7'C/T)oDn΢ƓE_הB58oai X4NNy<4ySKwPAX+5 +n49z +ׅouXotЃf /MxZ}$$\ '= g-,g(K3u;g,Rxq'?CXW.U͟-ex\u7TY4(nLu ȺXtx:} ,綢Z5e;UOq}9 `&Ky-qhYs7ڀ\<̛?yޟ=IWǽj %$WngP'uB|umrQ:$%R`A zW+zq|+Gâqfi4VǢWd8יRw fS U ւ]1v͢./7ﵡft0TONω>&fMz Ϫ.Li9*xqfIw:y* >fw6g7gͱ>9{q6 gtm~ߺ$0 -wh5{.Ih~sى)'յ4=̢ȞX4",RX(+&NP6s;GZ~k;S8=SaoL-jgs~+\y}ujeH|ϊBW2Dk?7uIwPJS;/W+zi=*a\칉E0܌ߠf?ٚXTUĢb( fgh-g%a #B9&s3.'uwN΋p~sI9Idr*#;ɋޱI% Mp< b⿗`o^q]E $iM`|q.)gq,Z8WžX4yܼ^x7vlƺcCgSX4IWnhس:ymPx sj{F_$^Eu:yU*bmuNĬ|3r3fo4`yƴ52qB?{>-!!gg|Jg0 {W&'5Qa< \_+ߗ;$x7n9s"}0I?c 3*72' Bݍ"Y4 cс߭ ž+Ke5Ym> n%iϥY"MN+w_/ER]*:7ߓ05=c`Ԋ=ǰh_ZZ|;pIxFcF.ʝSZ͞XU3kE;žX4Eg00si]Ƶyh/aX4}/=U9ğEqU$~&\ȳܑE;T}yіocMFsZ"sϕ) f|&lVZIȞcX4Rg @_$79E#ACZw#kĢ:s|߾YYtF ndF0,um"ڱgaM}.1ތ9V~e{;뽭g?ܘEr㼼Nym{c*~YI!Z {";u=7y+LC^9ـr)|ܹ9E#bx?gQOa:Lk>_-{_Qd&FV]XOWx,,;FA}}Qw eeWNmmoPCWG!k;G:ѽy?@&2^;?Cr3? bᣵ_sD#C/Ti=z&zѣc)Y;ƞW\ϝwZϞjE^B޸uh=1so,{ƿ'YEc5?8ĢQkYX41 gkF[a#k3ӈqX7^kc[q=7?8r~ž_ok> + fþ,> ZsY(eg˽/ʣgkhu`=.* #:kmFB +nl7vKuC}%$ܹ<\Ӵ[orOϠnOhF縞[ҳP{~oF=?=7h䜛*aj,|V w$qe *{.;}. {I\=ɢqଽackEO-i0\=G?Yޛu ʟǼjϡyDQ7ԥqzO 9^u! IDy9\o- +=g8da8"濦h- .sa R{#0qoFƞ^͇>;̢nycѨq3 u:YW{!ֳ2 k3Mϝo4z`-]^(!W޴GAgb[0`9k@(Y?+ B;+;A5/RwCM`>G\Sf%gѺY~?[ĢQLﳹhMl>sY*Nƍlc 9`m`gk3oJH|}6=ǰh/ϗj|tzFƝC&Ka|=W+Xس3tt<ĞE7 +㕨&^vhchx a;M;hb9NP]|3Ogjz6g]b;5?:s{ed.ǿbwCg=xc=~{phRO4y]b1s!w^jwL_67EAob{7p] sTg_s4N=EQrƞXt#.zGe,r}c\\#u퍊gEo4]ϊgOo2F8wRwl JHdg{=|B>}5 + 씝/bg:=ћx.eS\zsIس^!oG/HLQʭYXtٻBw粳h5gY4LeVxM;c✥XE:x?K[{#%>&YMM嶍 +ݬwN^;bi 7?H|lYI{gssE|{|0FϬ,9ᢰ` +Ȟ(@yM*΍Iٳh_xou&";+- +e.hsTz `X>ˢ:ۣVViҫGIt7ßxp_4wb?2藓sn(!>\ϠFaݣYs>^bâH0p_Yu +075Mw+Y8tQ]^Er .V}E;}f`XJǟΟF:gR{CMf-& Ԗ=oF90-yo[$yD}3 jDq +{΅E{u:<"| +rxӣ->~->9E~&ΞĢyS{xnFkgYEgXtB3\7Ǣ&|_E+.}oIamSQo4fEi5˟U"^2%$>>`^A~wgP3F,Ps;߰Y?/<ܓ*xU+>xg-0Tj> ypES 9hkEss\XtPIfZɽW{},3s3_S=ǰhY,~¢}aO0=7h\,yG%D +IGvpÀ 'aCu5) IvWS$Eu(>#?>ـlVeeU/3K/_9& Q۝O⋃՜x,&Ytn~9MOkI"'Iq}g'%7Hf\zy0Mר>{~s_ݺ5Y8+.ݩͧ{|~h66ω%q{j=xF |ze/yqϋ|eUNjbuc!g1ݪnL[cuյ'q運йIUyݤgI8n}3X.iosGTъ5 @UmU9~us v5(zɤк*͟UsG?'K~\&s!;/s?.~'ǿn;=6m״ǿ\+=E릘6='|ۃm.~4IsKv73۳iM&-}$F 7v;6̢m{0Eo<ק}zbޭfr?tY]O[?]Jg +VJ6ŜoVm?<c;3Lˠϗn{=Zdw_-kzD[aW-ɞS,{nCF%sGMwdN[msEc<7tg,תim+3 dnsQły}6np_٥UjYc}:U<Ȣm߉Þ{F_}6).-i}^N~6H?|yo&D2:O9{N>rĞsEcn6sZ轀~Snc\[&ٳ.m 7j,ITܪz'c_@ga}:`s6>dy.vm{ǧCv׏g3;xgȞY5={=.U[xy?H[Ԟ-ssEJ35ž+oPEcrFMh47`Բ\}7rd>:51_^[sZm4bUw96h|~ n;'kkR0/i FM4#5_ dM46l=[؟ˢ߭нۘmD5,q*V{VilEעnxNO>rr{I7y]=|cgS{Fc{üh\C6sExwkɶvo?#*vJ?VɓeqtvuO9D/H.~ {iVس5nSG{N3$u +{NDc):T3&|hx6\\Ԣqy{FsjnV]j{g4vw6g47ʟ0fATݪT^9W. :s6J?Vրӻb=v)Kc}=Dϛ.\E{Hmԯ/W[YAunQk?L,Qq)=Kt級h8}^,3n˞5-M*{ִ? a?z{Vd~ZE/ﷷ&&u\:|]oEsamѡEʟۃo,1|dw"}N'{N}ے Ӂfr h9xAm.Wϟ5k*y~?j 7Dp*ٯu9&;y<Wa9PGi=wD9"/'sݻp޹E^k 39آ}OkY.Y4 T=,s3nW<tg-{FckYt}:pREѵS=gE7{?ٜoJ=3>֪1iД7OU9E3gam`='SaM4~Sˢ߅3oP~`T;]炡gEesE'qԡJ1VUlEr>gkbm?IKh5n?yd{?/]~Vqp.~k@p|1?~8!.-˟//b'ZTz͒9/f^e7cY .fDa)5X+pDMJZV:۳^_6_}osM +uGB>mQ}7r?zie )-jEWUlES 3#ۛCqjiM"| tE->n5-/Wťٚ4ğ \&'ZBOzi؛ctݏ1٘>nK.[gik9Ţe՟eȢOҜ=={ߝ Zr;kϩ=3},h羁PTA?{x`qh?wYBFE}:,wÏ>y28=$z2.d\I?VI_zsYͷkb(q`Jn;sG|=:XvM4Ez{ֶ& o=,]XCyu=o`{ C)=/? +6_[9բ5XӪ yUceEPlEաjʅ;~rT?]^6sG{o(kmx.V嚘 ɟtAgs+?qۤZ+dȍӢ~rW,yny<{Nggf[ +ƜǢgzf=_~{o཮V *{so׬9۾6]2t_| YҠ3%pgZOYkLa·W >2kGۣA~Dz{V 5ޞ :wtc.&~Iƻn-xOpeg1 \<Ȣq|׵2a}1Ӻy@8-PmEGWL9I{]z?KӁL׮,B}"? SyuR YҠ3#KΨX دph3VsEc}Ҟq\.>^$S\q煥r{iS;ͳخٙ8[=Ytq=d +~s[pUp%՟K4? YvI?VG.7Έ]12{5{N7GysD{{.oXkdѱ5TנoA\aϩ}Hkn'V+k$nG64>-dC*h; |4=LK* 6|'s7w=uhυ'n7mr*)}:0vټjs\ؠ% ?G}%pgZ']ܡ +NW\&ooƳs {n;9Y9 Ykb{F>3Z4ٮ>!Jq`yC5sh=kۚ${N1ϛ܍\Ƞ% ?#&[ +Aq艓epPGaM`N5jWˬk4/Lg?a>Djܖkby٠c3sѸhqI%A{6cXfkS,i\&{۠;~C'دp-=I z{^3ўRqE֏ +8V5ǟۀ'mAi;m*='ްǣAܪS+3AkP9]ES[k[4|sagυsbzҪ{I}/wq W`,ß~ۃuk p媸4ݟ3tN{N5h9|H?Vo*:ܯpE4́kY5.k#x{gI_g)zu evេy +ۄ䷫*9W18 0TU=spr؞x}VgA=P`C->h5=}1Js8OйE̕x_#ivzt\R?'kYs_2sfnJ0hy~7jUYӧ{] {\<_kaf 6]S'%3}u2ˢw&h.êk*{?} =+߾=0L\Cޞ_KZ=hop Mx.RҞ9m:.KoAoщg){ݔ`rYk\~~7jnAsao;'dxx{.~ܣ;t{=?Ub +"C{+ߠ9gۘXt=Th|n(W`!ɢ}sP:>Y[zTBNZ4P`F2xǬZ>c?5 Z?#Ϲ=Fm/z< +_;̝[j{QDn*X)町/wv\68tT' +޻dIoXi]M1kU[4z]C-k'Oq޼`V{Nhϰ0n ދVC/]8ۣ5p|q^{Nm̊A܋nýQ JAgpqc{Jl5Mׄ=ٳwhm^γd8܎\$G9?Ǯ~=Ee,jIױipkg=ǹMQkbe?Z4jU50_]9W znG*)}ݢwsEtϚa8pZ|ZZ؟{tm GިQBv[Զ& 9ŢZ<Ҟ~+Urݞ5јbYk.A9tpKCbiWQߍ݀72vPk8`X518ntK/Mה|dϩXh`y$NhcnGT7,h6Y4-{oh{8_RʟS YAem~;Ƞ$t+AG=톸1n{ xe͚hJágL`6T;Z47ůeM]F{vH?'Э 91=)z.!מݩԚьĄ9g68߮lϩz +L' {zqn5;t>Yzp\o(A}o݉w(jϽ,:j{p}bp[nC,{C[Vlbg-q.,ş; ޠ%3!pw\ -ǡ; :rhͱ=)FwfՇ\ePoDbkj۔ DSφ|XdiMTE>Hks&DOk1}79]^^-zp0ϩ QQ0E6!i~?klѸLݵð NX4?-ק#x$.֤A7$F~vH?y6.]И`ۛu~GT>^TfDkiω|GPJ h۰.wcuk8n59?{VZ-:}WɐE?=P7Q3Š 1-ԣtfhܧ\ND,{ξ\g۳j Z?#Ϲw^ lb ښ#bx}%=Wm=D?=îdM4-Jn=Ytߣv3_}y6ߚS 9h\gIϮZ4`E9y1hY`cT ,shzoTiѸ뽑38q=qa  w^pAAthx֔ۚf7Ģ}P[{6&t{NVjOs2w2ן$,: esqpMN&~֫[07ڗj$ۃm}vɢ9k8Y"gH,}:|fCwVa.s9sVs= 翺+>SϪ Z?A ]Cg50#=!v{o:p+9̧|DݝJ{3ǐۃ9k19]Ğq=ڼߠx~Zyi wI8dZ)kTߠ~u([+/^lER<Т_aJhh?wYnPR!zoTlЏs/q뚘ǓbpI\[W* M%p~ ?W} C_[7q{#۞ g}jmd&ˆt{^o.sEcgyճo޸}׸aؽ\<bo$A?#wuNYù97 UaZtޢ;ot45wۍUY4}d{Ǣ/?O`I\}8&>pH?g7||~gnÏC1 C_YSZWgW=Q?Sڞy{gI:N^o%A3ifѱ$YNڐۄ %M giaѧKj@Yy, L E}.3aRߙ֪gs6nÏؠU;t&r葳 mOi16nxVeD -Y-z}kE砷lqݡֹݞa~A =9?S?zxj&sqߍœW4Ns.{nÏ`A C~[֢p+w9Ţ^ޞZ(Sz3Aoϟ]yfѾ?Gwz2zh[;,n;.GM՞X4}}lԟWdk-zs*Yx.Y?sΈS-c :͟/PsnCc$) +{rǵߛ[$)BD!@ HKˢ;h;,KR-o}=WwU_865GoΜ2?*Kͫ9IzbTejfrco^Gة))Ul63e_z~Gy1U1fM99dATjմq$sRIӆ;/~(u/ϖg -q9{Ly87kR5{`ŕ3ЖTcD্p~]Dhܯ#9ygD0u$f;WNPP^2΋s= ǫ(&vfW2#WZ󗵛smvLehL z?_4 ȑgк:A'8ޜ_OV9ޜ=-91~x9΢٢UE7j 6Ÿ]0h_R#Xm ܄C,sPԝ5ju&YAϏ94'=fSwµ7fq va=y\M45kmwN `^xW>kW(#/?hۘ6\#Q'ssj5u5k0`lAaV;GSй :CO͋%19c0: ۳z{fi\͞sHuBaϱ9Nꡥfώ,Kjsm;\<.\Eo H~1ڢ1v\pNCg } s|\?2FḮt]L&Ο_;q/d:^Ó7s9g=>ѷJ%hgѨ>a컑ɢ=59@ixtߍ,gk-C zpsH ~՟:Hσ73zJysA>H϶t4h|vG2h]Ƞ38tɢ=hGCއ4s}S +yyԖZsp.r:%۳д?֟߂hϱ3;w#u-Zklҟs}}}ʢ9\XpކA_'EAÚ\7ΟQ e3ʞMsNϡA+gȃG4*Y9 .lzbwVze};0b/V.r H.Dż5d5є۟usr~hCߍڜ]쎗}5s> >Z4C%7\ׂ9e8hs-p_[9|g4"6l"8u5u\jѠsAו;J'V: ڄCώA ;[y0+Y˽9Fس[xm ((YHm,nSrR`-vq\=.gFnB)\lТa-}}P*ib7آ׷${gAu5 wng :?t]ivG<Р8Г؇ /_{ٵ9#'eg#!ܣ#>>Eh__"KNLbV~˞ٶ^ygjY|6&9quT:L92x/=FOj՞,W{>ПڕZ{މ;6j7eXr qs2=4_Jgq٢Dup^k?[t YkF1Gv_[:#?]\[G̵9op-?L!vFhvwCu-"9Xi㺚5Q[LaЪYANj٢So"`3[mx~[txN}Rџ-X(h3a̟+ߺ醸;ԟMjhȃGܨtOjtA_.X`~s_NW6J>۳-9ۇhj?sv:2'jp1Xlj5mvϞ 6S3[\SZ\RԜYùb;_Y'g4!g|CL[ Z?2fԤF>{fn>kE(kO6w|0ރ/^~ cẚGuQ};M màϟ_~vFugGsEal65j,z᧍KݵI aH}vܢɗҢ;M0>}S :Ƶ]g=Qջ[ฮfxE|0/&vfN?g#31jT:AsAw6h8} /ٞMD?[ߑ=[^ݨMדfK_FEw5KZ-=^20K`qϷeZ㾉ž}h+Tj[|5ZdѸ`gbgtYEs|pރp]ɪܮk.ߠ5+NSy7* C+mg5ѰDf{VhKmk \>r{v[=8ש}ysME}7nѰ^$= 87=E>E},N}h|$%A|&EGs!zug4{CMfwJنugȟt˜Ag[ z?K*11nT:T0hu +_=/=g*~ڿCWwiVK6žjKzﻑ?{Syiڞ}sq{*7cZ ;3d7 |q},]}:΢ٟ'1C=:zS?g?#ԾȃGҨǩ As)_#Ѻ^\&!lj\Cs9Mס-=9t|Knԉ9?Gnq}[w#Cp_j6:*PcJm,=@=~)j X4%>h%纺yQKPԟƵ(-^`o¾6ҷgJƻ>kh\\\a{o(ӆ|w/XGs_hYD{FLs\hsPlчvXs\S>b8^lҢ<>;hآm>h&8X7Eނy ڜhNןgt[G^9AtɠS3;-ڠ=Nc*:ܯx!={Lwhju%ڊ,W>94<؟KȍصEs}Y=E[`={q=UY4gXyC:0 +Y7X4aM)*(g'yȢ9 TC]3Z69AtZŠ33yH3*Zqm_?=}`IinCƦ>ks0o*dC5>L7k{>=`Bn +InΞ?Y4qS>>/XYEk[4*{CsTD#2Gâ;_U <7s9At{Š33rNmL=\lҢ7XΝgE yZg7yz^{v`0{=ḁo/Ox*&ƭڠ-g9ßgؤE<ҌJ;3h=9H QVg%߭W~c͞KV-'= qSs͞c-P=5𞃪,ur?K}&h\ŃwK87VuhܵP/,Rd8Kiڟ}~\$~09o몽}7؃87bϱ=*^<΢n޹/r!u~$vC0'Icol&'vgzFן9Ag-lEkOԮȃG1ծajР50}mСU}Fn^sLM4ڈu6YwfFڒR.s\M4_b.|Yqw՞,:z7V9EDŽkU=E?.t,c3Ezqlע3ME{R醸y'?59. z3٠ 3y2 +tFthS=dІ::Μ6ŽW蝐 LsLMWx^ZUw}ǨC`ӛCR9cѲǥ|>sCEMy>EQ-0OknhX ܜ> ,s)jߵ9ػ͈"?^ދ]95ڒ}ٿ\yA*VfЛȟԦȃG1ծ6ѓ#2hr~ߡGCt{q-_n;cѨov<{phMmQ&@e[TU=fr}78too~"^.k/xtv\W6꽑6hZ4[]~Q7}3YϛƴRrߟ t?9ܟ]6EY4xXda^2L)?=*nlϊ/7n)g˟s4?#ԞȃG1ծҠHVmщɡC#gY{LxJ{2ndyNup,a>|سpK+^g5qĻЛ;(ɡ9_wPjSX}r#SS7`fS\ۢ +J6Ü\;iɭɟfΠ][ş?VD }eMմP$=)YkQ># +kvu, 'q'szfW?$>$Dg/ݒ5鶝3N];%x)Z%d /H P[(:%KPpqQ]Rnj/kqOnCp,cgU}js,@m.æ>{gwI,2 oqyEIg-Yoyzu98>XۓGgmYPLXg؟0hE6e-jKCeշPiġt2Nk :ޡ :ޡKbsG4> P{7l-tE:۳ (y0xj5n^"˳TsFߵ$}dgMrGV Yϱ*97 ,Z߂{Rj͛Eg(xC1ө)grl9yM${S/}iR=سHEρcZq\${.j?ߧ:[xy}d8+Mϸ&͵Ϛ=U9E4EmdbMnd3وA4?tF6eԎȃG! X-C48A1ݠ';t_l9؞z\M4}*۳Hsɧ<$F;`L>G^ρi9֢{ݝs-} z̼ߍŸq{ʢٟ{? (zj%bv_?k7=g80AO=[g6hysG7h=9trdљ :Cg7d=zQ~9k]9Ef'g-1۳>{|rMBc=6Ec=_ߟ{-k=WtyveҢNw͇IՆ=w}hgoٟjs/EӮ(Vn3qlàMA6D<}ZhŞ ZCg6hE?%{s$ٯ{*9^D،Ț蛍r Iߍ S0Yo?ޏ8e9ƜzOjǦSao{FzϽiԕл/ kN$J #͠v :ڞĠ534c~7h=9tZ-t2F^.f{o0'Is֫&w^}74螅&l18著d~js+:ϓ,:|kٞq4y$;"k}{oh}֝:Km>h9}'fÞ,F?k[lݠ5A6DY4`}wۼkwyw'lQi}sݚfLsfn3$lݠ534c5`k :Ck3y,;4R}r)&:{gǽ50}7 +g!Qߍ7r`8砎hޟk۴h`W\)-i+?w>hj-XC8lJu);^Zd@vjc9AtfٔAlQ"YQ6Y Zšt +yz}K4b|o= +3|V=)$w8]'n75y>OgSQ8>sk} 7GEpAwNh9Y٠ :?[1hC̓ܠЈvN#?e~.DjS][nݟ&z W9c/>j6xlF1,tFs~^>;o!VQ;+R ӯ\`xGjFp]G4u?Y4X`N|Z<ө&g%n3h6oSٔAS!:QoB97 c۠ҡuz'Oo8yC&:l %}ڊuօ.s,^8aNwsPEd3v_ׂZps->>gwK<^7X8l{?+kו7{ yYIϩ mϠ]8vџ٠y2mC_C:4 ¡Ǯ:0^XW[bMnƬ?gٳΞjπn+]ngan!P] F3\73.Gm>4-Zݟ~Vo@#1iѪ{8EKϩ mϠ95h̓G(u+?-mB1hvI=hXg[ {.PM5cOmYk7@=wåxC~ku0R\M7w +}֛ЀP3[tlp7-khܛ +Η {1y/UNdm{՟TAg}Gm4嚬դI!kc-$聩ӟz`?%g}\w1x&1973[h{jUr+6-wEkնCuhm{ßhSٔA?Yf(u+~ئA8nd]NaЃT6xg]|{&:X ~n4!qOPM4sz}7hzEkρDpsZu}V2Jn>Ӛ[t|0W~fNϽ== +~>MNǹxoA N˫e CP` dѨ}6nY^{s'+~s8&n\&=$?5= :ޟSlʠ͐ԭGB'shjw$բ!Nc@޷9+ngԒ=߳П5&}7/ [ xfLiѼg`yLmI jJ5ҟ=hM+{fx猱`umО :7uw ??Yؾ6COhׅ(>KmywU.amg`C-iq>_\쓢xY2Xl۠a9AgW :ƟſlQ{!G[.và:AZt&h6h p&D}Љ<˟ߠ5q Q7|3 txڰ稚hޣpsL4}6{#Q>}^5r,XO*ݟh<PA`?>9z7HXòqeС.t?AuXɡб}AuC96sA=f&Z>GeU Sِ6 ,:w`>9 9ʢ7v^kǥj5ð[r?v5Pρ`s,Zr`QaN8ރy[)??5huv͠'3BmOh,IQ;Wݴ$>| +#Λ\ݒZ+nwD`?6a_ϓ :?dI - fzhW zAAi1 lAkryٛcS]=Z?'D_rg34-hˠF??z.&9ʢqQKm^>Тy^|dUܔ[vBgY4~ȢY%g\]8o`µ]1{Xa˟Mtx& ڄ??YؾBpMIyoϞsT?m>BUqhixB27)OKkXu=h8Gf?z}՟?`qJgsRNaj$6X8NtQ3l̠ +WEr3~Ϩmྜྷ{y&w#iM4Pϙ"HNm>{ԟ#qƷԵ;5Fӻg|,Bc[DϺ z>6hf(uOS^Oiݠ;jm'Coh^:۳ń5#aG|J3y顾I^jFxC/i׏/m7k=h^H75كŸ}wPGtϭp/8r̢|5/}Cz}λA'1Vן) Zџſ}lQ;!FSlu-tߠ-;Mߒ6/wxA kXwqW YŞkQK.5&y?Ga!=GwsW4<xTǒ?w|9s ZFY4~6 X>~6y6jנ3A34GSk*NQ =Щ PA[pТtG͠m:4Rz0aȰ=GY4<}3DGĦ??7Oq@3߽vŢ/,E콁QᾋYEsg3zw8hVγwb|S|y54jϠ3AgA y05Jx^ -2dvzĠ-9QΉCϽ]+7qviHX7ɟ&:]\۞rSܚh}7RY(}c?GkݷPGy83{8IV8g7-<1vE3[t,~E,mov_D3A{ρAg՟j#(uomSCߗҡMz]3ojb-?rMt T]zgSmFksЛrv?GͧgzE9.:,[-9}0o ^ փX́+O!<9>VE|]| ڢ?[3F٤A' 6B__Thw4Y#?㟧7^DΙh=`N\ÔyEI&:uQ>[_Ngk͠U9Akgj(uZ m͡uam:t6`ŏbq/?L!k/Ve 2=LJhԞ&??z+a;X}*`^0؟-h85~(Ge֗~i牂%Ea:.R~!W يAg3,jڟ ڀ?0hQ GSWNٓwO[m:֠ :߆C'5hea]͛=Q +l؟GjOF%5D wdڑX D;s͵9YEw&Ek{qgEGu$7آc8lŠtVc5}6Ϧ ڀ?[j(uM!{-A?X4Arc`ڡ)~;1=fQ,lCwoy&h #/OM4\ڍMč= MҢq,s| Y}s<|G=;iїlik-z`(>!in9A0V, ڠ?bnaz:LMk:ApICk3h=*c›Q>w{x==;O5aMS#k{C.&}7D}%z^[ہrs$͵^8fzo$&,8ք[4<-q%J{٨Ag3h]jڟ Z?2hm}# W>0N#- +irG>'bACJ +THڒP&lx>tG#:Ba/Qa)ԖeeqR嫗 YYMLiT3fI[|6o$I=kiӗ4yUNkLYeR ϷnH4E鬿=+?\z8KSEg'W-R͟Υeع+8Tz|sg#/w]zo*mgۃ?#?_9<ĉڛ}3HZ=w|@}\O~Kbh-WV$> ݵ|^֖{'=y<;d//y< _߫QKu:6ȃtVL3Ck0T~NkXՠ0 :C/%Ѿ;2qkImI \%`n;ù.=nLp=֢7n<[7=o]pBɼؑ?T ljјdI,lvɢWo=En Ơu{+?Ϻ ۟6ȃŠf5h ڴCg1h cкz̠S84dhOε=u 9kM|=ODIOuJ81zZE\;;s3a`MNŀ6'9`e-g[ p?cLz8lIkRVGYRiO^<YAtyq՟u?+tuf>Q Yj:4hZE5h=e)zm +8Uu S] sb kAd\p5cw껑6P~{ns\of"G+{\>g"{.zj-Ah5E侜բ_oѵ ;+͠-g-ŸϺ zҟ ?]Sc)Ma:֡sˡU ZCGtJ>0ՓUO  YE6aWkOG9sX֯_sp3N zGckE)p|u8SOgPEџ bћZ>Q7h V6h9AWy05jj3Y :١gZ4A3hj:zA?KgЃ +wAXcp&"ߋo믉69Ow%; 9 %P uϓ'X4gd;YMr-mWs ޢb3?ZteSiQȿ[_|xŞsZLsfJ]34ڠ33y09j_6NŞ: :Ң-shǢmpTѡ9|q޸=û|gmG9T}7 lk,sQ=G4a %`t7A6s-ֽt]oܢgLLӟstϠ)y6A9_v,:ZĀ3Ϸ}y$w; #1ϱkd*!d'4?g6:AgDϐ?=cL}ZA-Z1ˠX4AguLӡ?KO=qA wľ7w3am HU; +kW86"Es$PkzE5 rsB"RSyS,ޢ(?h@JgUm=2ϩ ^ϩ Z?g2:AgXϐȃ͠f5hA94AaCwH4oDks989<G<qPϱ]I=Bw5fo)jsXN\4'NkкڄArhLNй Z\»۳^<ƗM96Zg?== jǨإ}Nh޳0:(I9J+;7^AtroR% F٢c%ܳ9`Ң~n9dE[/i{~ǭl^[3ω}bAX.?3|iЊOz^MzϾ5>;+csX{o5I[`\ho9]-683^w{CC6y :?=DHߟ!P; Tc~ zЈ=9Cmڡ ڡ^lKO|Q}㘳zCQ́oq զc]ς?\n%}.x)JsEڥi[>ʮ4pO ]03EQ9 }MӾ;K?ՠUY4?Otנusz#A5WAC0kl*ӡm0hjЊ =p薨Zb#z-rsDM4R[m} Z49v?Ͼ$w>D?۔#7宬<ƺ.LY/6֒'.{?X.q ?*צ+b2 s.?t9Aggϩ1G zh mҡ]CtphСAC*Зmq9޻udMH2G?}kEM4ϮYXu;ǐYtp]`+wK!r~ -.9 hkt$tlJmVD,uYAgg\(t.{$CnN6h?AȃX~UAc8th=xGCt}m0hmҠ`_j=;[=z۵=<_!2cM&)`wsEґ侜UWj,:F(ku<1,kO{o +º@ +0S 1(XCI [t/?;s, 8p^SK?.?Eg#qXAwm1芲AYӟA#3˟ x+Ϯ:#ϡ?ϡ :C20˶be;cޟ'j}\ 8;|L=J~!ݠ0}7x!gR>o9E{<7Z`=97Wcpmvમ(ƯoK[ .G.lϻ1ϓ-[ݕ͑kA EHl9Awm1芲AIgL.?C>Qc~1ApՖZ/]Ncj:Azs4E,~sdM`[z <ڹkqԷq{9^ +Ư]Y?1xc7S?\ 8{v߫-7b}G,vs.beQg,huOjz/71ΠUz`zܠ9A?ӠݠS:tZnj۰P[shƚڐn8ԓQ+u${;砮= yfj6s3'Fݎ~mL޿jwq9p{CL&p&^F"9.4SԢb j&l][ lX4?c 6h_W>RcnK1hL2hSՠ1ڈA#9t'qjj75^z;І2>'B}~ŵؽA '׮ Gw@M#T˃GᙧÚ*w +u$cȢӟ3t(4?CYAq߶njwq.Au/mơ :C<m¡;x¡k?қq9&:}7RFQM4ʍ޳Nc}V:ue81rO89XR(g6{8nݩaØ[n :CZtC2\Zqй ZC5kА+OlbMC)=ODտGy|I=2^jOlkE']z>[ӟI$\M.'хۆcO0DC!FԶ[ mkݾ;KJnNmsh 1Ϻ ڴ?XҠrZCZC'4C+&6np 8'6zW?85AdhxKPnd۳ˌ,p3zkq 8Ҟ'PֺtǼo!N k ^oX?KGjʠtE9&i9Ɵ xe-7>A-trB;tA8A<dAb$ Ԯ={$6^h{\` +Ts2H;5>\Ə7qwx[3E ԗcl{?_uIw ;$U; 5aE~ʢvr?ܫ@wMo{B >8>x8Ff{c/KȽs[/~Eߣ\ ޹cqO?4-]3lAS3AI~`uA|l7438m7COj#vsnٗߟQ_d XSlE7ov#U̓߼O/gX;}z6[縴 9j,ڨMq͢c[W^Ybs֟-c#; kAWh Z?hж3Axi-7>O:Z1.C1h]ݠ#:ɢyġt{}_!s&sZ r~`µ}6\|>ɀEùB+G+PgTFJ[X^' 9Eui{~AnÎ[w{"ꟇMTɟm3h۠͠ ڔCBBСEʠcΫ+OlbMق;!fGmeߍj8j(>D2pN%}.cMo]#瑚h066Ԏt%&͑Kmϣǘڃ+$~#7؟q-vfD7Ϧ zҟ?ShGA1j)8t{jߡzܠitsn=,-V|#=O[4̍q *jY! +yrG9gbdOel;A  H)QNh"K%ck >:BN RKVUf̬_Dw۔B^?+lcì5˕YL%ÓU&X>Zdlzr;s[(60~%]e5clHTE`ۀkB8f5בQ<?82æ_ڎ!>e,ɢذ/p^B߷}va῏_VċRhtuܢ lMAgϨ؟ Ve,|_Ƕ>ZL\CeAȡ-N6hޠ:42LVj6z໳L;ٙ"sݦ_ukg?ٝc?>A7b 0f- + X4KX4s׆x->ɟ[tJp} ͟Ut?0h[YAƶ>ZL\Cҿ ӅNAЋ)ʓޠ;Ar`Mݛn|k嶨 -;`dz;u \ u- \>;4u]}PN,sa+<Vth}}Oʙ? +?=oJE[ǫ0kpRtu+q48+^kgÿogOh> &hi~N1.k0)瑽O|KD7[1Z,Zj9{~"?E ~/;cVs\J )fЪYARVϲ Vo.}-VRtsz ۢC &i2-:ؠKC{9Z56[BbgYn[ `ض9nnuR׷v]Ƭvؒۉl˵<"5hkwCdrރdR +gUנetn4s hѲa _S;4AC" ϠZApp.b=Wx~p bʞi`Phϰϣ= +E ו\{n+@Ok~ʯ &N8_+g螬ln?'cTg2 :ȟbaзhѲa 劗C"1CC iб,Ϡ5;LN]2Ġ:[`E6Zb#[s莜$0mp-;0swAG4N׷W>۳pE}1lLwBo}&Vp3x{ۡ~7d&ϊ,6+]lQYĠU4g4,g%t?Nm-PgB94F4C1h:Eupwhfٯ%k:Wet}mhPYߞsNkMwƀ=X4Y.IyD?Y4<ǁm:͊%9ʠU zMAGti :ȟoM.?ضG k(W6hʠ,ӅFph_ ԡw9E5 s7-[y L>wYK'z}8c3؟`^g8L,gr@ܷLm?S'zЇիKǢN[Ϸ,0vɟ|gџt?^Am-P}mjgr6~=Ǡ8tEFVeqc9tAssl|wZ56`܍gE'n^{LO0] ȞEҾMӉϱȟ`pNi7:ȍw\ghs,>_;bs_'5ySgmVX'0h9A4٠:zhٲF2 zv~d:Ԡ59Jc=mCt|ga¹*;Cߋ|ձh{]c#{e ~G=d͇>hx23B\>]At,n|"Lm?g\slW΀E/.6ݕ gߠus"N zMA'Tq :jtW6=ZlZӍKϠ9!]hȡ-ZȠ:Nh_Ft̡Gl0,:Afe'>nhGe'r/>/3>o<ٺ83>r&6۟hȏulK΀E>'́g?{x`ۭ,  +C?g?ڬhl_ΈCßcۏe[k-\؝13hˠ%sj^oI9AOo1}3zmzhٴ'_ y"}&A{nЊ:A+ph,s߷ܠ;^gpg}lCYXg9"oON^2vMk\"6~ FsVs`;r,[m7p}Yhş Z?'65֟t 'ΕQ :?_thѲi} :CuM0CDZFȡ=r۠=؏١tC{9Z56[J0w̯{\ \w~л_%}P'f{༦-go|cgodѢ8C L3E7fG|m9 Z?'25-ßctL0 S'ZjFeu#s}MCw#s8z U׉Ң8C &ʏwl͈E7γd2Yؠc0AgoĶ~zY9Q62Lhs9mXu`n ݉[{g,3dp=HŢSvoe"slA+g!m?2hI~hѲqM5O Z -W1hȠ%9tAĻ.sE0+|3dpm6Dܢk&0{CԢ^vej{̝q3}hg7-LYEln^p},j9Р%3D?DViв9p.Fd~oPk朠ٳEމ5D\ۓ㆟W>g3Weh)mhg8'g+gO>y6٠eA+gI :?盧_ -TRءZAWRjlb  :CZˡ\a=ʿm-bۈt8U't9h#g"+\i(KCq*â84|Ag}~hvLV=ПA+\iKA Z?C6D`3GUIl>[؉`N4ߟ hraM]&Bǘ7h̠:Ƞ:Ei ZCZ_`" +5K}N՜mt#X':@'~O`:go=YpNz]\plR~ึf>z-Qhx/{M>{ӑנ]gL zBA'(6u3\" +{Vl"9'gfx 7!!?@qg2N&Yo %x Y,!K߹%Z~TuWխI2[}˭?&^itd]i3 gi:9L&?l<՞o tۅ`;Nr-*ŗńĖ^X2g[bsR` l1ؽUHq[ySgvB~/M(&:W,jھB1Mn?t:}ئ(Nʿ,o~x(|֯Zla. efPӝxf=㹵5?U3$El`neIJ$Xt{59L8Ml瞦[EvGC4}Jv ס+Z[ phhS-dе*7h}[>.lnɲY?'߆J!B_/6u9qG  M-{stMQrW nSh %ޞ-DSMg ݠc`鹿eWCex#_ !lsVoR?YП?Jt8@g+8?'w k ;Co`g{ѭ +-{ݢkC>?5hQ3hEmhh4F˴AԅScäC1:NcBd^YSFvʦ7Q9h:w!A~AB}|e/j@G9]Àc}\޸hv34Ng Z?G7躰AgAgWlIdOp'7hC-ff&:Ath9֠ezʠSЋ lWT=aW9uCv8m 7P>+u27Y4 !]ѝ"wUlMuW4^uJDs~.^6YW %#xN}FyBgD[9~7@lMP/jV#Ak)GNanm\5l;ܟڠEנ5A7h6s%~wu44IL!chr]jthšt--=G ZCC2/Jl3V#$DSٺFG907ڟɢCyK-#՚~[ow?hx/اv![nj?k7x~͟U?^ٟ @Aq>W;m2hՓitB~3h]hʠ:t4֠EעSЋ +,v^!|V;(y;A +u ;¢i?kqѹ{Cf?G|6Ma,44h~;][&ՠcϪ Z֟M)7h;ϠРϕhh8/Ӆvsh4:4A4Zl :ȡG!vwyesSӟTWK9Lhuk6N7h?0^Xۮw[,m $h'_`]5ڳ6g-* :?7h3c :? Z?AOkšweנ-ɡʡUtVctGȡͱG`̞scF@y#M>S'ZasO?S'z*|쵟l59AEjyޟmTw?h͟wr* Z֞Ut͠}ݠϠb[ Mg[g% :NWrh˺QZA١ ˡ{Z4?;87IgWmH #h4Z4;5稰O;v"$}pq-ܹ+盬~]gҟUtXba۠uAvV: z F,v˷ gwr8t.4C tVgz>Z^Mi\wHCS'ڞo'pz4N~vo6(?" ދmΣb}bNq[W{۬vJ :?0(֠ A`+4xj+<|:7]hѝ~'GC;9:tߠqZAעEg Y:)+Э$>S':g?NH}SĶyEv*`{Lxs>cW4әqݙS։v`]`압 "|WE͘=EgIߢ[X}f-sdVa Z?*6m"t=VG^1Q&;w3u;9t;JthQxC1ZtX`СzԠ!'Eª]tKIBt-"yԡԉqgNt-:6T~tW4_is8c(ϛoUͶ9A+0ʟe Z?4hg<ޠU +cmt44I/`NP +oB:%ʠk ѡ-SR4h;VlWUtWettBq؉~E_C$M#6fjs& +gڟ5YE"\6lA؟e Z?j6eЎ?tyҠUz~LMCyrQ dhpi6-Ԭpt"ZA; + ;tD8Ek:Ѿ៧-wsD7dN4'pFsħ)¢@U®%dn֯ϡ Z?j1hl 1yhJjnAkqhD6SNgءACC+th?<8) +Ú3uc}NC'gNR9ޘJ3i=Q_5 ϡ Z?2h]۠G٨A^Ϧ Z?G1h&10-Ђ]`B:Agw/pheѮNR4¡}.2y'eVek]:-Nˊ|`NXwӝXvh^M"܇`}+vh3 6kpk>[sh"˟ :)l̠ ]:9A3 $}fuTʡ ZN0h5]ޡ=ΠC ١} cAC+5yUV9o5>s:ч9gGa FD6_.3gUv?[ȹ'6+_&:Ohe:YA?4 VБ ZC;2pdums1Ft@X`ЉpUp\`NU/le߀|:Љ~NtLρ#-:ѻ7,D еU;Ϛ,{W4s=SzM9ٟ Z?ne^ݠo9=ψ=:$}fСY]hǠ^ٽLC2h$2ҡEġe zSf&+[}NC'1 X[',uƳ;N4b-V߇~&n3_gH^lʊ;6~mŸ' ڄ?0h?j#gϲ-ϐe F8Յw蠝a :Cs'@Юݱɡ#۩Bsr,NtBvoYm|W)=йq MS6^o6[?[eЭa͠Mc&YAv8 5h&13 Qš Dth]hO6ݱ#8=ޡ[}Yc&+JT҉NQٺ3 s}#hEhg Nv={z'&Fg>Y ;Q +ntͼ?OtYArg3?Ŷ9̤Apw :Cg[ZmrhǠ[?6С cACk1yVhsĶIJϡ'lgLrDAN4[`I<ΰ~@Qg9ZIMt^L힧?ρi  ss^tg4n4?!k3- VeЦϠC3|n'14߂ :CGBph/rh-Lv ۡmC689N +lSaՋ]˾)?wSN4uQ;Ѵ{ÌE{ʿ>fyJ>bo^4ͦ!G}Eی?s ڠ?1DJ vr : |culIօ^{dl'fڔAsQt軏V9ACk5 +7.lyi>҉3j'z;hԢ;ӻ7ȟq9燬?;)E\)_K~M$^\l?tKA16ϲGlЂg/gIx̖+d44Vcp6j2;9 N1vOmfzҠ &eЊߢ;< f~pR9wsC/+ -ܸ'T'(eӺϨYyS M784tE:A +bӘU)1+DzvB{;,ۓ?76ܠYԠgP :?6hI٠Ѡ#34 :C9cкvrBuhc +^mڡG zܢq:AءM*9P> *;N}c8f݇Y`|alןesiqRo9_Xb-gcRcigA5ʠCsXҠyԠUGCϠewr -zܡh]h-mN64CG6hkvw! YͲ*}Ny}6kЉ>Z4;x> '|7&5nٟ,m79Ko |?sϯ)uklڟtKAgyVA=jjYڠC ?{th&A\.C m'J2]h1~mҡ EĠS6АN/tC8$l'Dkҹ7k?:4ϡ>C~S9Jc큯3hNrHg#Rc&YΠAϠ:7plAώA+glIwhj'' ZP7qdЦϠ1#c̠ ;4vB>vxVmi [Ϣ`?u :{0C;92gUt1uNE rP9tKAgqN?Z2lÅ~DMCcxfs{_AkB9 ơWo á :ʢ#t^١ ڰCnL*,߭S9 DS5fv4 ,YƟ,:^׀%u`t)ͯ(Ջ:(gmRc,fzˠuL}>lA'ȟo q44i[ |1vBk1nwr8]h-b&ZĠM9erjІ8)՗5V9^!(ϦMg5Cv֎-hӾ{C ;tf\k@PgFQc9]>k^+g-RcXl͠MAga?MiL+4Ww2{TTGuԉͭo?g?`0A_zz9r?ǯ=y&NEWYtO;F9Aw`b۟/i4hi.AW hh:K2h;9p }i'GC+C 6AӰ:̠[t FrhHQ-iyn OvkӖAS؉~J;^u9`S&woHpv9P}*9VlF:^Y0[&q6m,]6nНpϾmM?;g- hh:K zhz¡zwr.vV1hC-:¡U ZC5hiV4hl1hL2hDTcK;lF}͙amO؝۟':ѯֹa;?O[d3t>+qeE5lC&hy<`Klݴ?5NA)6Ϧ ZA' ZܟYx#dufz } Rzܡuv چCqnHǠu:.QװZԠZڠ:wJ'm|ͪ&Htm&>Rw5tÌ{CȢ3rp7w?K[]Vmr^ϮYt:[9]gŧgW ӟt'<6y  bY3~p44YB'ܠ' 2qՅ7h Gi>'NrháE޳a8A۵uǫpd5~)R:ZS8U;]R'/}ϑқQ󻟥lWtmcxYp!X9jltjYɠ)7T6b bІYA_ 1AW p44Y@|3tPʠ594(wrL4C5hWZآ áy&7hHm~y-V9S'Z)p NiB\޽!ԉN~Uw?ԟ',.voΪ3? ȟCb؟W[li-Df{6h j+jnYA=;Ϧ hh>K۟ :N0/ :CKamr'ǔAB9.Ц :MǠmYt,va7Wj>gDgŠOvov_l6$uC; }$`=8ۃ.Ztceֺmɟ zE͠uVg Zşut9Ԡyhh>KB4hVQZq٠m9A[thwhвȡaУ |MXtؽ D9 N^bX',:ٝ.*84cM -42hb+jmŸ?lЪàϒ]OFC]}4hM;9;Nn[в;9 ZC%Zpi.tCސ۠ zI Xyu3yw:Jd.v:Ѱ3ۍu+jhnѰ gT}s쟇,[tJOT2hlݠW ڔ?k1hvՠs\N?t%v~7L/?] C1IB{=#Ƞ-D:Ԡ-8׃kг;8{96aZ z >DtX}Vg ƒ}Duw=w`n)s͛z%hZn}`-|axrΟ џAg%6 9̠u^NAkl{Iؠcl*;9RZ>CE;v}thL8A#NCϏ ZҡG ++u|v/cg=svschvK7*փpf!~ָM!NN V}Ζk@Fgf6Yڠ5-sAgY΂?7lwfvo.}B?V!] :t3С LNCzۡ 7h :C/4mDW-DZl.7\YXzѡφsN̟φȟq\ ɍE>7h٨Am2hMlàɟgnКyhhh]}4hs;9bw:ʢ NVvhU6mסܦC,Z{<nzZŢo#޽6kftwSIDndMsT'z^{#1qpMlҢ?o[: ׬]~ ~\?ds|υlޠsfX,dК٤A_mʟE :An4440hiVɡŠzܠmcqZɠ5:tAq0ph4C{C_6?nA+EcH?;މ;a۽!ډ~u4~wJ?kY>g?lz7Y怿f=hf zE-YgSmҟE :Ǡ'hhh富 Z͡ŻA Ёmp'G\ V6hM-fMtlW<.4VZƢ 53=QnFRfN4<Y;r'v. g-vBgd OXqb3 2hټAp ZџpXVg#6QUo;~hhh.fܠ'ZgjЪ /R 5h] eвˠ58AuHcЮ9A9AСӡ {/u0kgW;p{ k߽AZ~xa'3n9_>v,Vl5eSHAٳVt +bß Y?thhh.I}B1vš: ڪC2肤AshC9IήCnEcUN7>o; }OgNti% +ްiЉ~|7m|]t{7@<\6+Ym +`>7F :o1Y6Ϻ :ʟmu :Ϡw +Є[VyQc'8ȢC ڀC6h1v C-lЮ8Awivס ZC{[s7推B' ڽpPgSL7zdxhx>TA{},ZJ:؈gnЍtߠ5mПu?ctYݠwBm444SyA8N/nFX۠ ZC 3hmϠ:A؂CNIu^Yir 7jta1u5[4tq^X4<'* r1F4f* 7Akg ڰ?2(6kBV3p|6ə􃟹C{g'C!d BX'Ӡ]u0th56lejvڻWbW=KFw'|CgSu{wAP?Ѓ'<լ~#ԉ֟a Xattߠ5Smu?c#gdgC hhh&g} B 9.tňAO:V6ia͠6 ZCI2h,V7h;nІZ٠9tɖR9~d43슠vs]޽]-?#]Vw=tRFd,Z[*Gkli?۠sٟ1hKנ]gqvӟ' h;"hhh&ghc]h R5sh;9LtCk5M*mʡE ZE3hm8As<گ<\}`lࡴ{ݤenmܟ]tt_3YtԞla^s: :A[8-Dvà^}6)?x9t|q3՝6 ϡtߦA7 ڄCMovC' ڞCC'-Vn泞$F-Ϩ/=x쀿f=GA|Џk8V~Bw4a6v8IIxmM֟g9|6IA)qˠB2~mm444S~sAOu.A[Oeбvrwh[}١oMtɆC1hs-v 7hpdK}V8nP9hQ?xṽEtr1,\gmtMKjghԏ7YqPttߠS׷AMN?On"̠;FCC3=o>tZ-rh ;9leth=5má7h:ؠ:w͚YuSԉ ܓ? +[-f-w?K:uE7$K˭3Yt?Y.A5h58og1Q1+FCC3=7=qe.t%AɁa#6b}D5hbq-ڮAqhqpЅ&[v{l&uᱠnoP'N?_qo薛Y1zݲ-nttߠ 3AχI1kgc=7+; hhhg_xik&Z ]d 1f rhӡtrڎAmߡp:/|GTϮta_uo P'\uEGwݤdMgۃd}_e&+۱97h c?Q?trوA7h盕FCC?B72h^ީw 4hBt4.kЦ.tAq ڔCvsTx=`:`+bS7VJ +Us,~7ΰE6dAK?'۠smɟ|Ag1$A1h%|v6sq臂Ѕ Nnв]h]w ӡtݠu8c ZCtEsh1s}v'c`d` tbϒLhAw9fc[kYˊ!aY|dvvՠ]@v zҟo[gQ :yՠE Zٟ!c; Mt`:ȡ l }nwr`qfw-'ڌAshv57h<hgktwнp|y<`oԉ=Lh=SԶYڢ|K>y9 mVsA ڲ?3i7h[,b:ٖA'ٟAgGlc ޛF8A8AAvh3D78{mΠ8Ac;A9׉nk?sNFKWCN uM:`y¢-{Ydʯ=}H?آˏ;lya~NA ? ڦ?Gteg-=/b̠FCC<7 :|'DŽC_1i*wwrdڪA7 Zա/ -6kZƠ-ڷ}f{3 +^ᳮlTa/i gNƛψ<}|[݃m +8H?ێuzJ?3%y ټA3Ķ?nkgSǟ 66)xnvrL;ABArhD7סU,ڞAshrhytcsY8lN&s{#ҢGAmSLt-~7 gۅm3:y{0ړ 8lTE7A#Y]AgtvjǮ9@3ml444s{7a1VUZN ˠڼA7q cj"ՠU סsjxdaw2pucvlM:gg ?_4= Zܟ = N?+}|55 /;Ak 2hSmǠ ZΡu oANayeutIKFL?|Wf譞vgNbGw?K[t?謹n;jk{wj]8 _OrϮ?{KA?Ag=?4y;8n_ضFCC=彟 =lr-f'zZ 6 :9nЦ zڢ:~VYxvջ;Gu~k|] + 7:)Hb9f!.6evyt ?k6da۪=`Ad6z ZΟ4?[5A*R" +ivG9BeGM5EXH vp(YD-;vd3? >>B΋Ab)2"3 +x"GRXRH~JO|(=y#n4Oy+a9딼[yN|PRiJʷd+4 녧3 4t/#r%8$߯kshx8M|(o-=;͈n'35k:A f޳ ,UNy$cdd9/sT(E=գ-fV*?n?<]|DeKlywv^x. <%%eY:(ȯSɜT[mWx}6_XyQ?oqbyI~N&z"k5|\G~RnƏt2?(7żzVG7m,HF"3IRAϯFi֓he!T+{YR7xxxͿ Zա ߡb:tЗJ]4E7h:ڠiƠmáq ڍC4k^99p}~$CgbFnTYf[>Il+u ƗVN*srgow؟=荣(LaQAw ڦ??;1v6 zܟ :?cm^*InSO,v3o ġtCmKX] .CGe" ái oV3hMgjmˠG-:C}4kWE-{u^\['QyE['YJ?-__.s\kgU=roNDU[~ɝ7 œ(;"kkVg/ nж9A6:(N?S4?+4?_]j[቞n=Ӡwr|ơ-o'Lտҡ mn֠ڶAc9J=Йȟ4DwsBzg<`#چ]${QO4wYCyZ2'U5Dr]?Bn .n^[kgr g٪ApaWm v5Yfمu[vII58Mkmˢ]hz. á_ 9uQYC˰{S{D($}i>-w?&9`?LIy"{^jMlr# +pmкLjuvߟt gLT˟u ^*=xxxgҠqwrXzҡqvrAG:4N.4ACߡ3<ۡ]E9]=NtUNtM2`gDCWڌ1>fh;fr&usۆAiH\>%C. ğ n.̠qيA++2(0h,4h 7 xxxԧtH~>A+:N%F! F ڕC}١$21^9uѸ~n -0a|O /߉=J~pnv??ϑj~hݟ7_~Xt|O}g3hoxnw ڦ?c?6hLiДn?R|(BƠCqzAHA;4AfmסWN*2:4hvhkmc}vsDt[T.vMU|;Kn'K9 hxsw{0owD͒?x&^ŞK{K6g4?4??mkЪҠnFف+Ԧã>̿ U :ҡu :]hl6,:A7}c=nѾCtCn}zӱ$wgvmJ]Ԧoͻ?)m'_lؑq`_=i~]zg6 :?;7莺ASA3Ak]s_&֟M Ÿ!^=65YfQ:ܠA:>]9GC3uѡG svcиml! Α;վ(M;pWMM=0c/"4}9*\P CaxˠCv\'-Q^tPDC/sO;& hx3~lϰ_:{Onk}UҠ1ٙA?G3Ak3Eϱw@5 SڀsR,v3VB9.tCk^p Z͡?onЃt}Ҡ z`~4C6)z\h^qt 0(wܲ?; Ɓ4P/j{El[y^tϠ٪Akmߟcm&;84?*d|4)߅~iЊ؅62h ;9+dtRIиtf=ՠA;4Ap蕣ȁC_uiNWF׷glƷ;޸8hLLBeKTsiϵmݕَظ3hl͠ _v-ctvcvYϐ-G?S : msBvלveVn-ޚrh|n:5h*i94A+:mЃ{mQ[x`۳EYݽ%q?ۉI'Z>{~>gQ+ظlX[-bӠA{ן42AS N凃Ԗã? FcA+qh.>9AvhzgЦC4CG'MoU.pqUOq/2Gr7.`k5;7z{{þE+vysٯ>tU[<^9eQ 8mӟ :?gnY۠=0elgݴϳ '6xxxg|8jД]hӉ:a'7;{KCS-A#-3.AgT~{2h<۠ٮAiM!;8dMmi<<S.CK1hvr`;tAtϿrh{݌gʢ ءYߡtC:хӦJ3CÏ% ct?E]:yBk3+  A#?M%c4?{ce{3OR[ـAO:Nj݅VqAOwh}kЮУ Ҡ S2hB^=&ΡCC':R}?mX71,͍ϡ-~|>?$<~f&:kq]a;ҟDv gЮŠKvJ#ctYɠ8mݟnxxxg%C+v?xЏ N.UzaߠcM}gsС РN Z!ٓ(mʅ{9yNtOvVwٟ  w\e*~!G4f*jAG.[go g.9A#w؟# C6hlgMu.c|g3ba`П846phUVOС á =iО9A:-62CBf6v{wo8D?۔?rg7={ã<۔ ҡMIE9d?CmiJ.AGu&7.Aϳ?{eGv ̠ϐԆc> к]݅wQBɁУ]1hvh.NA'աCx/g؆swoXu6kLX);<x GZ4c-px'^sl4ErOYtϠ]s,4?4Ag|vMyP!?R,tC#to }B0q4hwrqIfvaƠ=shLvhcB'ġ zCC֎kb%?lj8r03y'ڟw4޽?9jĝhY;?Gǟ-nfimQ`?tǠs?%ܠSz%4覞Aq ҟ;bm=Bk0̠oZ>Cvh{ 1vr:tAvCȡC eЇvjЊ]NqU97۔E90ո,Nd/lyl?tcMmIJl[W=Awq ҟ :Lف54A7 Mk |ZBGLsEB;gG]h&n5:sh-ߡ' j1ˢСC;7hM +k|#.v"A8L1кrԡU ޡg۠ c&1hUE!^!/{}Q(ٓ9 vnz?OX4,m0X oky}M|Ol\?tYˠ-oڟG :l2 џmɟ 7~o _Ԡ-v }]PthUȥAϹC4CG4C!A{CUD!Wbyc7`؟ < ?3p{ Jo=v΢{s8qE~>?X4,|ْ QO]te[dىAw V6hASAMAZˉ?7覺A#AS3xxxbA ס' }AG: uZ4azAϱCO5hBV2h6h4>$6hԠ zpp-j=[6Wm%\~>O 48Cy9{*ϑ5ׇ{#4PٺAw څ=A;g_ ʟA؟ :KhMu.'Ƞg0;+_팇',ttZ:}OL >l6>!CB4hvhoZ٠ՠ 3&7hC{٣(hlоd߽<щF~Nݬ. snsWuoij?ctYY3Z~kH=Š:}Hޣ݅. iS_v`+4C!A{áa7G-;*{WMm~V _ХTa3w񓽨ۿ=qz<$"j(-tf]3 ڱ?m9=%4覞A[gA8ϐ팇',Y;98Ơ ZɠBkcb ڽCg"(>o;<*jFEw:ݦ vop':?s‹,̽Z˖XCܿaՠs^T&g ڍ?'ݠyAg V5h2^gG팇',ۣօd}_q'ǐA? 1ib q zȠZŢ!A{ӡ!9V]v^wUwo(wٖ6DI ?s'zz[Ld?ǫȜs?qCT=3A#FP&g? ˟{mA7I :̟U  ğc]f'TNN01v١=v7mՠ &7=0AV툍/>gZsDk܉VqE_9|Oڍy[ՠ-3A#AΟl>A7I z?G/|mmj;8=CKԅV1nvrv5z ;AC:mݠ ءɽ9CnD"w4:S{C 72m8̝hdNGXDkFqS>] ZVՠ-3A#A_֟jЪnYBn,eд$i#k۟Cnz'-MgL`Ͼ3tzyԠ$1hƟCv@Bk91h[=Š(*8tBmP06hvh=jd*}{-JEupͿYՉ[^!v`<`Nts`s˦1.:ҟ8ȟc%V5yg6h$igN?C~63Yh-u :ܡڇ8>M̠Ў zŕA}HlЎܗc8AB.[rn'zȜTΟ}=8ם|_dy-sBkAù?C66hb.%?AAg IbЪ"^j~6DCl܇-'ɻ7-:IUgYsЕL66hldЖyA۾=,ϴ?2hL6%~Gmf<<<3a Zݠivr8tvrC[NCA'Q ڑCrL5{-l/K7s>PD}R;13R':!7 &9`76ڞ׎*tDEM4?AM?tĠuy`8Ɵ Z Me<<<|Յvۿf m :Cf&Ϡ١}vM&hJvӡM Z +nMr t9S Nt9e7҉r{0¯fa͙?zT7 KZȟ ʟ٠c& 6ˠY۠Y٠ڠ^Ã;WzA:i}ej }kо:tA:AV ڲC{rLcЃp9W ؽ?wIG':҉~/^'vM8iJV2hbV6hwomՠ-94# ??a! +kRY0=F yz$  ^i~=㶍݆33f ^,a0KI8Uu~?/qɽ?*}N7"*9u޻(y8u(^?p"F| +/05;7YIN=3=d<ʑW}n>I|5ՒIO:ߢda߽ujl-~N&$nr/;&ɯp;k-uz3݁lgM dRPm>ssΉkzZ;M{SX?=|=>|"ōW.)^63}o&jYToGs~90{foAݚsEW䣪ϊz|(w|ǟ瞮OӠ سA#NAϮ=o1h}gqYʠCsAOD2b[ɽcM ^Uhڠ Amw i.=:ԡ4;457h-cZAkpL͠EgLN:0NhŸmӒcg&ىz2wm"L_|mG3 ?{4!5hDi4vg,gehOg_Pxxx̍Avڅѻ9]A8AntڐAO2h-kӠk0hZA;9]tvs>[AݐDtGg4^0 cvKoB7g޽aE':t?k蟗='|I|M̟= ٟ1 홲?'ӟMnv3hhӠ#Ac;oנ Kt'G7wrxwCo^ ;*6 ژEcc mCk5 9]%)zI-}ٟZ:5gD?4 Kܟ{ ?42Sn3vgoy[נvpBv2={Yׅo'G8ֻƠ9ܞ.t*ژAC=mC0{etWesIUzRg޽~?"{h7 ?/<_INjڠAgᮔ-t2YA{a :?{tLv5|eyl'3ρmr'w'GAp9lAC4h3mԠ84tNp0}8~.'<'ͻ7"z^pz&w??pgWLcS7 ,|0 'Ÿ_GgǠ sAg|`igU ŕuAgl#7^V؅.BqDNvr^7hvhߡ C7NJ 26mн +i|T!;bWٽLfxLfIoa-8ҠuA?gVVaAԠ=lY?3h9}AHy?Fãor/ANN]h fjAo7hvhס{ :CkhL?aН7 +s܍ Eljys:bCUwo/?mCb*Veк1hblҠeo ۛ ǗuAV"_G^և F6spp'G,2^B>2h\j zVAph4з6:4A_8Cd fj,v;wwoċ{^b's::٧ |{hv`/;] gUӟeTٔA~dfq Z֟tA7= gG6hu #bq7dvU'wh= UuZAB1;4A?4gкՠSp.A3Y8Z*P܉r=Nt93,߅^)Vq Z?w ?00t9A{A7q Z?kfޯ}13o+zZ}¢ \6}pԡo,:ءzW= :1huˢ :C[۟o ++ϗ`^04޽?:ˎUF=Ȼvg ggriހ?0hǠM5ma$Ѡ?G5۠ڠc +nvʠϱ}G 53_Tv4#CGɡà;#AuA'ߡ ZC4mFZlphl{vWz +kyf>tk{#Aͷif.0wc& Z?G5hSkJşhLşUt1h 'vE13|4d҅rh;96j ڤC5hkt:x:{=ۜ;b7Guگ(gS`Md'A|ٟ؋2͜D\97i}<6T/YAџ \s v5I֟c4?ttwJʠ>ãwsaЖqm)vshCAsAVЪ,cv9|pyCy3b'~0ⳁ]E?GP?4hŠMlT9Im9AK -Ϯ]k@Av-BEw?SDvD<#a]٫5tMk6>Ef/|YA Z\3N?1ɠASmG 53C G@ˡ[y'DǠ 8ZV ١ ~eC{4-59+ z$cY*V 0ڟ t"EK#ڡ:fعm=h usg-T9 mTY֠YAght\j>,xxx̌0`>aVԅ)8ѵCCy;tע+e=]Mǡ C1&϶t"^4`t J!N> hqRrvV?_gNNOm6i ZŸϪ Z?4V϶45Sg& Z?Vle%xxxѿn;t|ۡeB9з zСfeMۡGV;4/p܋:ϖ{NG+^ޠ%p1hqprrTo9-~sj/~q;P?4h,cИlΠû+٠9,#A^w0At!xxxP3kâ.8.AphJAshshԡ CK4C{4]n!D >YqW(ډ}{fD/=wRnho±̣mv * ڔ?4?1hJşm5hlkAʟ :%֠ ']3|m#]Buh.AWAwZARbish_3[ޢu :}cڱh6?kk) ytL2=84w`7rڡק_Oܛ,lYz Va&Ϡ)~Wʱ?6h,eƠYfGX+n`ArhB;9tZf' +VۅQoЯ4;Ash9вoנshtSV`ɻ7g2L>gDflo:`NV؎kkV`bq ZM1h*נ+gL45a :?4Qz5hY.mB 6hP3_80 Oɡ>-;9 :C{t͡-mC4C4-4hݓc:tE_-`緇:7$;[hѵMצ~؇nlbXfДYAWgLş4542hP-"&cnAGqh˻Цwr8tNLޅf1h"Π:#9AGwh=]LC_-Cvovjݕmah)8˞=;яm׆86T/bsӞfV϶4Uv3hנ3Ac34Oca>M;9ݱh;9:.+e=àY^4>VkѺ ǡ~dA?3h;18p+v jWޮBBsCs'Za@NRMC Va ۟M՟M?G3hlk͟ ZڟUt~ZƠeo1hyxxx]ʠ`v'GZS:CȵA8cdiwh_Fvhס,ڠ-qhAxo!W[l#Lv3wa"c@'z3OZZA sa ۞j Zò?3hՠ'i.aЦ9ȠsAGg6hP3% }ɡ>C5-civmҡY1h ZƠ8n1hk"#yjW`l /]6-)z3w A:7s'5tOŸw`V?4fa?3h,ol?w Z?%ڠganνcvwzС''upX PǠ:Aˡ ѡ9oJ bmLl@[{:SЂYϡ-ἺoDB2c&>¥x4%i*YAXg9֟?iAGg/l<<霑v᳧AGqh.t1`s0ȡнm֡ A:AЋZʠ=ZE2h-2`8tAuhW>MAm>[^ޮA܉ϻE߉m ܛuh]܇yM Ϻ Z?gP ffş{ ߠ#A7=쌴 ^qЫ$kQZKZCA,2hUע ZC4h3}hZΠ8j4? .>[=BwۤdOM;+ۗv b N&_9\3hàUs<m! 22fw@AxFڅAuh ӡvrtC4C4C59t(fC4=5ͽi{q{0N'{I #;-٧Dm!_nko] ?6hݠl*1`e6c:1h%oQot\0 4h  oMs'C0eУ>Q :Mڠ ;MmC3hZhЧ2hэaH;9n4.U}Xd>ߢu>vV=[Ds-eЧ2hYg7G +ltmI\3v{;`q[ߢO=GciT/ ?0hU9AY3Ϸ ۚyM]g3hU<\`<<<83.|Ӆt(]肾.R6ԅs~6о]hCՠ١zLAqh/gЎAGtQd6dt7۟ߞ.̼i:H̝ތM[q{0C_uK{;ѫ~ sAq Z?3hsFk֜*&`|۠Usנ34Og]A'T +vrxteNmm}]*j :Ch$6 ١5ʠOg{eX:ـUWe2ϻs'zx+6a Ջ-5hg5,of~؟4J1h5 >c; Z>COu{yQVИ]h)q : ˠU8tנ;tRsFv}Q v~{n":v?s'7t@'`g,֯Pl;g"sN?w 9O5ЭٜASg,!4v1>/iZGǡ=}B/v3hSo]mC#fmДZY)9ACNrѭdgav)CtgDad3 cv{?…-5hbՠMAx-sǟ)t2YtV݁2`qh?6 ;η ={r6Y6* :۠%:E4Uupmؠ-r}JנU8WfvKd6݂1Reڱ9C'}Xrԉg&Q,D4hŠMsA-sAK&`9AKڠc +YdÓ 6p;9Nk;9vB;ApPɡUtRZAkrhơ8+4h-cё Apn"ct6f6~NS'ZrDoet{Y֧pنYͻՠsX6L)M7)s43hEd_<<<3>]hmx'G.tC۱C8Aqh/6* zLAh$nMѡ8+N_#)]V#yڭ\^ٽ9 hϡ-z#g>/-h]ҟ{ Z l<<<—A(B;.tB! ZΡ)SkIshء CGuV,4hˠO*ؙq#HvKm?`Nxşvko`m?4q5h,v7h|M?S@YƠ)Alv Z},7ޅ1hɝ1 5h]4ЎAC3hIh?־:CqV 2h"fѱ Atս'0i ݍUv R}=fmY&&~0I˟2σg)g +XjvcЊˠc3 6ؠyxR>ֳôC|ơUFqh.:^BZA+r rPthiFZA5; ڹW(`:>+,)g:#;ǟMN2Z绰96mq9Ƞנ :m9Ƞ)bޠ7`glvaAG!iЪvr t.tCOɠM;tAqmЖ8ZmIphU- :%+ܞݑFx\oZ߉>,V*,z#XyzK{P5#=6gyhu?_43A?ʎߠ͠34BנBC{84mҡ ѻ- mƠ9Ac;Jg5 ZC(5Cn!Wmh\l*[QO܉w0wٟw7r0~Tˆ^p6gSŸ ?w :OϠgu7 9A l"Yc^oj _<<<# z-Onvr94nXۡuhCYAc:jc5С CgT~áie%{ n kla,AŸ?8]g}-SOy!,^zI۟u*{2hJN?ctraן Z%? jZ +[rG^Ң@I Bw @DQdK==RL_B;f ^D*22D1>qr~yEHw1Z?qaWn|24C 6'KXo-Ӈ=kQz?C76蹷'cMAmOn a;}i`Sճav[kobGon6ka]?fD;ۤswLţ{?ǟ?Kh|@BViкנ m=kl ,@G}wv1Ϡ}־^FNA+B+37h[h>ahڸA 8wڔArh%amCNWxk#\Ol&zZ'3MIWxmkYA1&64tkYAE5hl?;՟i?˲As8o2sAzrcCB; E ZC ѡMMmAp芯C4h̠:A+hۡS'XV c<ullA]9-CWLl՟U)Hg[ zVYAE5hLǟ_EgQ Zğ z?yq8:45j:'1hd +}Bvܠ^9Ϣ %gв{ mڠ-ڰAvhq ZC;]ꔡ6vCŷXt?؟-iVJ{ik9AA?K42<4h?&Ab,nоoAs8IvmoAa5H&vd^shu-ЎA;IF3薼ASsh,uhmСE C5h^s+4?c{t3roW[Пu[Yןo: zAcAg zYAYfж3I^oв,fpF>E2[AmEzP79TtߡA4CЪSoц ڀC1hjʠM8^au]µġS| ia >uVmAGg]ڟea{ád:10h}CCkB2h6h3=j %o2ڡUgʡ;4Q6zU}ӆ\}7 ,6V;utYAϛV +7hL٠? +ҠĠ9 h-Aٟ~.C+Na'ȠorlC n -fjnr;-JumС :E["ՠEZA+{oϔCk7ha. }t tVmЦڹ|tW|ي>D/c`̕{ǟyo?2h,fAA@2hLƠyAh='/ph%)|} Зz6|CCWZt -qCơ :ԡ7ߡ9E ˡUgʡC1h|aЦi:tq '.ט:iͽvW*$Ppٹ+ +glдYAYf4U,c^ڟ Xt ?a{áǠu9t-M1 +еOڠEZZԡ zݝZԠ1T ߢá4C2hC;mCqנ9y5UMݡq ZCc.3hހ{#2Ci &õC oɡOϡG :Ac:Ath54%guκ1hYv+WX|w^vdD 5׮ro"b <7hAgdYAkֵ UA¶-C?VsS^3]Frh"qh ڡ=͡q ˡ} ڈCoGvhUw&R CsCGhʡ-W/r|)+D_Ctz7N u#7P Z??8XƟ ӟڠ%AMAoM6)Tm?t4VxAm;kLL! +1 Om"! +1 Om"! +1 Om"! +1 Om"! +1 Om"! +1 Om"! +1 Om"! +1 Om"! +1 Om" ! +1 Om" +! +1 Om" ! +1 Om" ! +1 Om" ! 1 Om" ر DA+4L 3_R ¹?9%ޞK\ZܓGmϣY۞G5 P;Ghz40s=:=k Zztts֣t-N E@Ά8XKvD@$E&W 3>Gzz^\m}ׯ߿^i8=ԍjuG֣Mu3֣u֣U՝u fߍn xB{~<|7ڳ b{C tVz{^EyzӺU{tq;uՖ9;_GgG7N{ޯGן[XM՝'/kҞog0 `_uk[tݒi摱g]wc-;wЮnZt݉?gTin=ڮzt݃9]Ψ-ڞnZt~'/ogΫJ=n~zu3֞ڣ";acu{ҺwuZ{Bюo==Z::;Ol>[`eu֝Wo{;У <ңyNGGԞhDW9e{GGޞhHL6Rs`{֣ b!wcۍ=MLE@Rh]趾g0G@A6BTvis-@NRync7@wWr{tG9gݹU:X}8٠z$twҺ:ݕnu4ݞSёgoHsC{.h0ztq;ϡn~Ǽ=moG'Оh Iyߞ͸Ggآ?Xzt;1Fs[Ty^t2ٍ.vw2t|m&Ͽ{&}ޣG۷*t 99||~z>=}x|4Ï?>5ɛnO=X^TsWܣkou`Ҽ:gh>O?ßwA^ݱ* @܍ay}lKUE=mO-lZt=Z{EmްGkK5:_rۄjhJQr{jfqsԡ{8mϥnt{tx5|a\=wD[-?mysfv<޻{k}{tn pû9F?'IYஎew=w_*9w3Ct.Me=-:K=G3@Gro; @t\\]ri_y=sc4%a4.Z$ [tg{^*A/FAP=W޷ѥ }ҠGoܝ/ݏ5hrwsb?;k*vG֠A~AY Mbwd 4ݑ5hrk*vG֠A~AY Mbwd  -4F +MKQ>6@l޵bV?s_ܠBl~̝;\SI!=[g_oѫz-:}a0\v=?՞+F^=LS=ԣgݢ7}>gzI0Mmb7z[yyKkj%,wo=>wzIcM\{.ߢyKkjes='wzIcM|{~7z[kгjCFWk0Du=ݍI{EFϴ=ۍt?֠۴F7jv('ݏ5n4eݺ=_עoڳ @~Aָ==5m {֞ޢ|y=4N!wٻt}g8x=}~n~fza:zHF{`x~ܰA/GObkξעgjI \=Z{t?֠h{==PVwm/nY֞(+ݏ5~-F}`X9n3i3wo=+R +E] ڔ?ҪvdS$lT%Z!!7\\:h9wHGf#fD'_޺4ϭ +^;8=98885'mߣY}/_?9k&ytd23CHݏ5ZtE'3UHݏ5[t6=:B{`=PXڞGn3UjeRsWGk0 {:Jml=@4貶5=Ѷ0 ]s{N5Ek0" :=sm{w Ѡώ5|i_?hq.Mzm +Y@Nm7]/1?>]v뛺ބGk_-UDyi{k]kcl b2a2Ky՞ϪE=kѽg-=?]tu=zG@բKgt}U{tآ>q{eОmם*;lhȸ=آG>FCm=lZ4؞ZtQ{GkPU聶϶a{Gڢ3o]-Z}ަGi#mhȰ=ޢz h|mN}֣VEg-*=љlZ4aEjW1Zty +1ҽxl @9d{EWО7h(sv@g=ojѕc Ad}Nڣoh)=ygyl!CϣQY k5}ߣ=_{h@amtmz jo۴hΓԟqU{7ڳm4Оo~Oi?[v0·{}r('{8 ʶ7g aiϻ7'Z~/ >_}>~r zsňt-*raMEF/ zDYV3}fk$nb24t{.E,ۦ_esd*56:ym?h6Wϕp5jgF4_LcZt P!ѥlѶZZȍJfrGIq5x{ϛZt}^=-*W.uc,'J  +Mo[U~ [B$IPZI'3$ bbXb'=e\_^\NoN7x :Awh+D~O΄zn gՈi$Lse^Ϯ='mѴ& ϵE{s>9[9_PLq)K,3{eMsM{gKg{t6+g+ +;H3qE}b,VgиhNV;L{^tKGM:>7=[9_xJPz1 +wgu~7gQLߴzs5(;l}6:U V]g{UI3~xmϏџ_Ӣϴ-b1 (bZԟ9s(}noQoEiqWա,9 29fQy`a-{}ҽE33-:ϴHsnK?VV>h"%fF }nr&ӣ:_EY=Lkϴh6lnmnmq1 (#eYlgiWwW4m/M-IxFg-9ۭ<]hZtE8,m6ZssS yҟCs2ٶ$nNZ|98y}F{EZg@!-%{g99ܷe]=[;'_,ʖ%=mQZtgZtŝπBgsaxNxOS{FV}&|ZYnѹ۳Eou-qfPshwGiϓ]w-,YioDyVvҢiRVgchgwo{=`$=Ӣk]KgEwԞhFhZ4Pwu0j J?䠵7mCs r6HyVԢis֢KmGs36+J1|-P3(Zg[R[EӴr>Xhϳzt]}xO#آ.=+oѴg@1fۭհVs_|_@Xkr߆M{v`=gjѼYhRgh`=.}_Uw0VբG}g ]ڢD-\Es]ԣi 4WՙGy}yG3ڳҙhZ^s*h yV.Ԣ}.sMvآ-=+jѴ,d=#h hWhp/~Z4=z&l48]φZ4- Ys}QI{Z7|[EӞF}ݣ>,EӞ=_}t6s%Zt՟ם wFF/4ܰGK~-B{֢3th~ kgp5ҢѢ>'-p7uyƚKO`EkoCL43{7~VwP{Ehz49I=~yJO {I]g3h3r7:pVK7(c|6EӞѹfg5h%{ D{l[4QcEGoϴhg-g~~_V7x +lHՠkR~2 ᾍ- Q=ӢhsY[u]c` „woӠk3^}Cs0lm휄^םi۞i3-hsWNhH.5H9gDӞ7襏{_ᷝZڳ]=ӢoyezfEӣ.=Ag?`EӞHٝg/-Z@{E+}ghf%>5{c?9P{7~{:pÓh-s˟IXh:4D<{j3-Z0~.Lv6Zsq?}Hú<=oshM)GXtV3E c@>{sϥ\4YϜ u]Ĺcl4 SrhSh:2AYϒqϣ ]tz|Co-3qYk)W.щ}E6A6<9{G8ٍΘ}+ +6KŻhsz(g\K{>=w܍lG;}E6m}eA3.L?ޟ,j{Α}693Z{Zh( +'e?,F+ A's]+?̫_wHUJ[9uh^R_u|CLhPz"dẘn3 әJ +]49\{ȶ>[zkp{yHlk/Fٛk;M1ʞit"{N.z ⢧UsMypT<B+_T.|X[. Z%?E3E>r݈_Gyrfd3iB܍k/pϓ \ޥq/(!WϽuh3hL^E7Y\g.ƧߊQƃƒ1co֙*k s +ξsA=^v%P]tu\4s7 +fOf;񾪤>y&p&FEO;A=%YfW Vz?5hSY4we]n苿'rǏ.]4>zkx*f@33Q~Jﹷ& )EuJf fm=oqхŃϛ0ct]h\"\G晁fe)9pϠ힒mVx?khsU|99g]Lrϛ0czpѸ6Uu~W75"좓)`& j2/"۬^.Xywn=}󎚻G!g=os|4g{U3ξ@YY{xue`}׶J䢣}qNѸ4g,stͪX[KdDOz1HgKs{xwe`.{n&:9묾RdhrE9Ϣk `ęl`>ݺsRU\E>,}mk7܍xr9\4lF=jkY[z @.]=HiSg[RzWH_>o"}mW;oW]"ltf48}Qg@-[ϴ)]twKx*ue`.z{nk+ =[g#h\zk麍Y[z |쳞"} `ޣA[m*?5ghq}NKYIKOeE3]Hi9CAn,.Zk j>s.0r䢵gs:p]# ;bݢ֖~U[ϴQKg4ѣd=<]e[#NFnu*{@JϴʁCzcC-E}3$z_Os"cHi9Cu 9?g]4Nkdxٓo'_]֟?,/_WEs"Hi9CAE0Ohk!.:ij\?lB5T<'034@pqHa~]sl4Nk$̏_[nsr΢W } P4@{?)E}:MFPg'HkSn +4@ڏ=>f8dq;gEb@zpqH{\{5} =[oZk_gofCoϱ9<+Hn?stl4y跞;!?;FCtPs5-WkoEWL̅n]4>:!^ѩfo8F|n +- +_]W| u"XH!H2:DSHiL +*x酗޴w 3e:?~ֻ RHYOsܺyO7O>iM9 )K,fLϯd~$ws?Ǜ?9ꟛ/_:ל߿<忛{Gw9~~ҿ>g}|y͓'ObgKyyD`Z:hC:{rNu{~//vr*?=뢗뢇{/뢋gDyY }HgOΩ.}uh]ASh}Fڍ۞nVy͚'T:vuы>Od3E\t7ZKuЇtZ=.laQt73pΞS]^ױ.zg]zߍ"gZ-gs4kΞS]^׵<>Oуww;ڍ?7j=3!/=9g{R>Okcy.Z>Z:hKgOAnz޻.g]JvG{>]L}g`'-֞g4kΞS]nT?#tvt肻k}nvrnAC?ٓqKmC/肻Sh]\k}EOy`o-V4#=ݖ^wt=wrhϻWtvg[4,#=ݖ +ϽF.a]|_g^HϷfih/=ݖU}|yJ F{|g;}?P_z5KC{8եL-gy.zeSh]B]yγ<}GO?;}h`o, 'T2޻W=t;B|{Ѻh`', 'T2vtvw3^уϾ9q|Y&IϷfih/=ݖvֶEϘm}lt[YKgOƩ.}ej~k}>sxmG9wHkލχvhX|kҹqKkyڟΝ6?|s٣t[{;im]7R< ms'TӞ#ݷ>w=ؼgG6?C]𞎎n4Lz5OC[8եtF3yJNƩ.}pvuvGG؍.?_؍3yKgOƩ,}婝ws>ϽF|E@AL s'T薻+>aļ%t@!L s'T]>򞎕{cc7 +HϹfjh+;Evtѧwݭgly>tF@sJN,})B_X;e}n.:aw8GN'Ew: +JϹfjh+;>Tz}>a=ufk}ng\@e9L ms'Tԗ*]O?ywAwE?Ycgo7ڻg;\ڥ\35Ν|SY^Sz/}>>aYݶ=gnΛ*\35Ν|SY^Szۮ}{uѭ%߽kumyh:rksV:wMe{-O5]w{w}ލv{}.٩9Ol9)~>@gsJN>, ye.^}]tw_F;'y>ѽ<*xСk̈1˚}Nwч>*ݾ3MCK3S9\ 3FY9L=[ryJݢyEW}ҽ-Ew?zY\ c3FY99:˥vލYO {]Z|ײswJh}wg("=뚫a rhҟY>+dzO}^n/ggh]\wg($=뚫a rhҟY>+5ee}.jv +IϺj1g>+oi +Ok\U|k1Ңbj %B ıЅXPh*#:&I&s?y w=xx8<^/k.-뇯^XҬy:G:y{0[\r=:y~r-Wώ\c`:_f9ʊЙn|WRhWɳ-:Y[Ek^_?tu CW; +Ϸi[QT=q}ff}zq&kc4|ni sҢ~Ak?[yq&kjA=}5 9{c3n +~gFoamnx +-q/G]>ϻ4 ;5ן[n pMt ֠2h m]g=/y=w[n[=g4hbӑ?ߵA'fyq&k^_c*[S7\{-=N7-X+sOk?[Kf6bvkS󋳝1WN @E-X nLtCb~Eg}AOt>N @E-X nLvl +yPQt ֠k3Ӣ]+E_\~|&y|xAd7{?˨+پ~:y hT݂5zƯ_ ]NC2A_ӣ~FPQt ֠0o˧]si?\Zu=bܠ}[]'/Y~Z?k㞽qv֣?Yz[]Ç}ܟYVumX/6nt 3mi畈A7nt-ZtEwF4Mt ֠kҢcصE}g3Рm[]gl|4pAE}֢w^ޘ jgC6AE}֢o\f'A^v><\t ֠{Ңs>k<1 vcôAE}֢zM;sr-X?ojM{tgz4  չÞ?܍]E۽nXFnYx6Z x'ӼZAi}ynLH9{Vj_-X[]qY{4@Ҫm=wc݂5h ZD(QŹ:Vn4[/ۣ;-3 L]k~E` goڢhIh}NF݂5hQfFH9]Dn4QghߏAڡWt ֠ 0ޢK*v +mss7Wt ֠L6E}mn4՞fSh6 +ϖㅮ݂5h*=/[=:ͳmϞڳASyz -ZOkG=(g-X&-_^>?+@YE7݃{݂5h>[>ǭg/|j;:{8:{[ =!_`Yt ֠آ>ǭѫ??EP`s)gۃ{݂5h=w\ןh/* +OkU~Ւhi bJŘvUR\HMq 0f2{ν]%-pýh`tw0 /Z]Yó_\wv^ϯ#3|=;=;~\>;~79\\A7+݂5hJmw'v__wM-f[5EP9l׼ | ؛n4]{9gw Y(sٽA]kЄZ۳ trMs;xVkДhY Ni囦wn[Mg-: -Aٹ-4|wUJ` лZsk5gL{_|=X& F4;ޡ+݃5h>kYwhr!o{lH4g-:k֢p}Yc0>O*݃5hRТТo]u?~>oS=XF[t˴h=2sMwqqq7uyL& ETනn}v<ݞ;w7f)Ճg}EWx{Ch={YοMyFԣ}֢*GE}-Fܢg-FZtZ`S$ fwoo,;Z4@rZtE-Z^i}Asfvhkh= )g;+O4hfir9h֟7IىwwChkc4>inol}hػZRݍy4h>ivw:Z4@RsinEMϓ4hzs?6Z4@BvHw'ims{#Nv{h iwnvhE}բhDZϑ=7Т94}բ3*y +Z݉|w=4}Ӣ;3jEg}^ԢvhKРۡ?ivÎ PZsڞD}^]?7h9m'h+Ҡf٘cb[t Z5hus<>O~ץ??"[n=lva7O>;}z3袣?4(ínڢ3p\{{=ȸ и;vDshnoןA3ZE}܂αE>3sE}h9џmy7-zm6EǽE|~ T֞DkϰEZtg-zkcP9ע݀Ѣsg-zџm|~_}ahqooh @=Ǚw(DαE/sݍ87wou@ٟg/m9μ:՟ ӢXv{Cb--ssnh \<٠+~Cߛgn͚ϺÎZۘH +j[WaF !.hhU@зW&$ҕusЮBO#ars_o7alׇWVf:?Saά<|1uc} @2uѩF7^gjS_?#hsܟ4??3ۉ.ݞ -j޸AxGEwswVS@ svޞiIg:MsvO5 ;s$Y?_۠ @3-]rTТ!H95t;1wrZ AvjЍ55 9>kTZ ;}`F8vK>T|7Z62]ݘ;N4 Ԣ{}nݠ|G!wOH9 +ݸ}hw}jyNw;ahnܢ}>5tҢG}ԠgYVUy>?5vŨ9S>Uڞ{ى|ѢLj77hh=hϳF-M;@K#>WmF--T?^bZ=gӂD5{5hhov>/:v!Pdo֠ -jECnnhXYto֠`svӍ +s; 󹻑{'syzݚ5hX-sѠaaѭYiϹsh%-XItk֠:n܉|63ўa%ѭyn֠{vϯ{0'34ݙ5h\c6?~c4F1CXtg֠<5fjͷL<{-:|>CkѫgH(fw9D}vc IEެ.0躻vϐXtkϐ\tGg9.PDtC!ѝ7D ,NtZٱ Ew6;uw?kPPtoSA7na[9n^DO}E};o夻{xs-3 y+' $ ~Wr.C} wIwIͷwݷZ +D}MwIw4>Owͷj[gLz筚t/PI5[onaC魷jҽ@EEo5ov6z& TU&]fzu6z& Tޢ߽kwNy}KoU9.5ӻn\\ n[oդ{Np}Mm]8\حg'鷭jҽ@G7&\un>JmUZx63Lؠ3V5^JN S6W=~۪& l}Ԧwi4%o[դ{ oo=p Mmt/MͿ'AImUz-|O83cv~۪& Nzg8ln%UM`p Mmt/:4V5^u;16h`'wrwclNZ夻I ؠߵIw$0O]t/Z魡K=ߵI$0O]t/Z魡K=ߵI$0O]t/Z魡K=ߵI$0O]t/Z魡K=ߵI:%0KMt/Z魡S]ߴI$0KMt/z齡K=ߴI$0KMt/z齡K=ߴI$0KMt/z齡K=ߴI$0KMt/z齡K=ߴI$ӥ +AmPC B $ n<#%/lJꞀԛ5u/Õ=o7mk^ϫ+{Roԝ3JꞀԛ1u's'-mL 0 xKiSw̨?+{Roԝ3JꞀԛ1u's'mM 0 xGg[S̨?+{QԽ3JꞀw{5u/s'mM 0 xGg[S̩ ;QԽsBꎀw{5u/w#mM 0.xGg[S̩ ;QԽsBꎀw{5u/w#mM 0.xGg[S̩ ;QԽsBꎀw{1u'{#mL 0.xGgSw̪+{PoԝJꞀ7[1u'{' mL 0 xCeSw̪+{PoԝJꞀ7[1u'{' mL 0 xCeSw̪+{PoԝJꞀ7[1u'{' mL 0.xCeSw̫ ;PoԝBꎀۚ`^?\Hp_c[S̫ ;wlk^yp!uG}FRRwܷil?m[Vb +ACO'%$ rڞ7^UIF`V~W#OsB>ͭR ;4xJ.:)#OsB.u}w!uG: # nz]HxB.[\݅\qk#+npwRwpŭBuz]IwV ;}w!uGW9Z.;\݅\rK#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#e,7޷`Y=u?XVo6d}f }?lcQ +A @s +"%\ ϻg`f~wߣAPѠ(iT4h*4  @EAPѠhT4hy.! +1 Om"! +1 Om" 1 Om  t  0ðuB@Xsw$I$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$$Iii$IR{/)IKJ$z 1t"m$I%%I$IiiII4$IR{_R$) =/)I$IJ`OKJ$%%I$IiiII4$IR{_R$) =/)I$IJ`OKJ$%%I$IiiII4$IR{_R$) =/)I$IJ`OKJ$%%I$IiiII4$I6P{_R$) =/)I$IJ`OKJ$%%I$IiiII4$IR{_R$) =/)I$IJ`OKJ$%%I$IiiII4$IR{_R$2Vc @@ -3061,4 +3405,186 @@ gk:c A 7}V$T|rt# A 7}V$T|rt# A 7}V$T|rt +A 7}$TKUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݷV +1 0 '1ؗc#Df$I$I$I$I$I$v  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠ  + !?DhϻgoAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h`o +ر AoAa`&xgf OAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h6 ++ +ر 1 i}6oxiT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*46*4  @EAPѠhT4h*4  @EAPѠhT4h*4W +ر AomHX4/ޙYoAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4mOa$ +QJ@lP, "Ql5ތgR!9v۶eO E E E E E E E E E E E E E E E E E E E E E E EeY.˲W9`3T?34hv8W|&4hw:=8SD|]lޡASܟ<'g˷g * g^<'eBNCf$79OɘҡSРE揜$|%th= gvr|th5 48O@Sfth- A ]2Xz/@ +4) 4:h#:hBMB AA:h9F(tФ,t@>@ +4) 4:h#:hBMB AA:h9F(tФ,t@>@ +4) 4:h#:hBMB AA:h9F(tФ,t@>@ +4) 4:h#:hBMB AA:h9F(tФ,t@>@ +4) 4:h#:hBMB AAit3% 4BՒ4QMn4Cҝu%i%M4V(IK.i%u@4wsn%]/JIC$=:mӾ.t%ͮ wiC%truB#,Iq<ҍiuΫS%M4Fe5u:hctI95I,V7w3%MtۧǸy}${]A#:hR:h5$tݖ=^*IK@.b;^ՒznЖ]H |#-IOIuWgdM{H-i%+pGI?f,IJ# IoHhG\O= m:_'Iumt%}.wk ]mW{A#:hRO7IJ)qIos_Sq_p$]A_V5ܵ'T|kcJ,mjmvᱷ }w~7OJzݛLAq]^+>IϺkv|gm 4B&et}|H\>H<콧K>#{gJ 5(㾓V{ c9侧>DzC}Գ&9/J{!A#:hROjgY,wv99K%΃bgQ 샗HzQ[.9BmԶѲ#Զcm8Bmۯ:BY&ˡs$`)c+{xY35X0k2Qۨ>zXE 'vN ŦAK'Ӂ퐴ѝ6|RDPIYStݦw^zR}uN`UIa)h] ,Oi LW%ݒ1aGۦJmI`}Gw },#l?_R6"}4*A$0wW^؎޹>IvwJlM_u~awɘgx.ّ ~U-[̶'|͋^hF:^M쥏7/:hBMʒ|].za3sD%}=#%SoXǘ{vM?pY4g?s +*E=UЮc.mzH%uqϖmA.~;P@ +4)KstV=4su{hܞP$\R13*Ew&@VG۲|O0N^w-{~!i_>Ww*G8:hBMʒܜMM\ZxI:CeJ;NǞMӁ~%@VIM/ɳ4~)?4B&eI`>΢^M 'LgIs9NNҡ!E|LF-hxm:hI%!1mFJ +4)Kp{hjtF$tﱝ`/ ,sc3bgIM_GMtV-:hBMʒCM\Zi^4nn-+9N0F'KڛV$k@GmT}IN`^W4B&eI`Nc_gIkc`58ވlU@T77}?RZR_wm,cF(tФ, ̷@{X~Uy{s`%-O`n6xLFj!%͓?1*id 4B&eI`;6^f}^dZ&s z>#% NsIbG +4)Ks,Pu$EK,F-i~cmk{;@{A#:hRW8$^tI34 0#F0W_}ĉM7dn63c swYfiӦoL0;֌5\~ffРA6]t^9pdGvZqrE#GwaOnzsW!C^zݻG_*۴o߾/6W]uٳc=?8f :ۜ|їpדּ2\pA1[;yuԩfҤIf̘1.+!]v>^AKZO7/y3n83yds뭷scnLbnb~ܧOs)D_~GB +4)K*PJ}kDϞ=˞W/]<3_7|ٵkW}~޽?6[n5yիܹsz[nѷO;{Ф?-Zd^xko[oez)swg}bѣ=zY`yͻk>ܮgeaÆlo@9vNK͜9sOs;v_paiѧzjmҠ_IOB +4)Ks*PcJ{َ /43g4?y7s_͛g%iTsdGgH{ 祗^*'|b֭[W| d=>3͛ͪU;wb ?<Ž<$Z:]k}g}eٹsgу/Y{۝NI?)!?t%[qmnejsEbŊLN>{-{{92r9fo^ Y|GQ맟~Z,ǰaâtcvZ{E~N= G}I45~Vl&8{6Uw_4wuWqvm{ cJ 4B&e?sυ޾e?[+W,Z|y.,[Cs,{z /.Q~V!.ej_cնYmֶUε^{{S{W{?[6ksL[y`>v6m24)_~eq}}n=[f*T{OM3d }ryW->;h_ǃ/sN>>%ر8lsk:~{_~{)Ks>q7~[B>J? +wpUE8JG" `B `PJ(HuTzP$ El(D t!zR.Jr=9oC=n˲\r;v,۱2 1?S םz')::ZGk.:t(*UXVdGQ=ǚ5kҜ9s ޽:w̝R]3v9r^{5bsβ*7DŽɓ'(*V(Y̙O?39 .xꢍx/n?leni2 +*ȑ#id*Vԣ~Ydr pr,z<бd|ygΜ!{f2իWKͱl.|Xb4zh˩m۶,WZR~IcizhѢEFۭ[7μzI 7cz饗a˲O%<# +_mSN@vAsԥK8-[F:t~OCC 4J7|ySN%Z7\xLO>ⶌcWF 5kw])..J.XZƿ 4Yr%/_#Rhh(%%%ӣ>:f+A(ZLLL&\?WZf̘AW\9~8 > +*‡̙3rʎe; WNJNN&z*ՋuׯN\tsq̝;7M2t㭷b'Asύ5r$' |իs!R%x]+G3+3CMa.97v-cxxc|hHǟ؉3&ufTxq[1q&ŋIgO^/<'۷ҕʓ'{z[hA6m6|b; K!U>}ht[~8M:/;o*UxQ`&M|݇>vZ2q~mdd-޲eK|2 \rÛAߎ{;_QӜA?G+Vl>4ACZ&yЃ&]{튣l/(66;Tr Z7w{ȀKW=|0 (,,)xзݸ)R8_ƍvݹ`.L2}6!R%x0Ƀ.[,錸Cu ź?`#]%Kx.R̯[F nĪYfME9Ǐ'ԯ_d< ĺ=r12]-jmYVw;믿9ˎ;G8C.w g 4Ja3gNq>={L@zKqF?֊ +scoiѢwӴ{]wAg5F🳦vl lz~!!!Iو%KT>s{QsR%x0̓*/_LA\]^xJMM s=2G@3O?M׮]ngo}w;sW4&BΝԩSJ.]zg߉aAgУGOL*VWrU@mY kȐ!!vݰaCfh5e^u .8s jNsM :ȡU T :LIG֬Y#=V6l msw02p@PlO +u놚ƀ:rwHLL-L ЉYf6&*HKK3LnݺܡL$%%)6\!U7z7sḂ"iӦ.84`ẞgϞ7'Ю14PEdd$j-[CyweB.xА*V=x+&&td„ {ll,ѣGmwԉa\x)b[);x@cƌAM3Ѓ4hwhҤjUA| T :A Ssv>"""l]ڵk#ؒ&ܹsmAU={50/p3gΔc *G!U{Їd-])SFʺSȑ#9xJ θq7clA-Z5f͚$<<\f- T :\AȨ[b_j*؈ M?s{%{ȟ?14PI P .\}`ƙ<%=+ )>hĈ4}toi׮]Ms5렾 =z4M2sf:{]3.L4VZE~Y#)CMӃ~Wbw̙̅}hѢE2q$xА*V&2jVtt4F Ν;L@%4`z~W>.oT`Ax"w<֭[ɤOeɒ%d*9M@y@!%|ڲʔ#;e,qnDFFgGiOZ#""4w@˗N: Gp%YvZhP<56[ W_}UnPLG!BMσ8ըQLF))9Âl ACJ4n2~O5$9l02 q`qر#w7CҥmKAC 8cƌ#iҤI@qwȂttL};Ν 8 +߿?jsPa֬Yd}XiٲedHGc:tHJ|8̔)S߰+W,+r{X->!M"qHn ' )!)aǜлc|t]G_x >r/f 6=R ]#vk~OD~'A?:+WTZj:NJ}V'f A]pʔ)#abժU| =v옄?i`h"qvکwm6q,/\WAy&:-ZPvG +Bׯ_/3{lNO8!.{n.3l, HqA-[Jx +N:v|ٛ7iwfq wȟ;uɒ%:{$$$ t7n={l̽}Iq]pNy+jt9ٶb˥wQɅs# +0?sAqv_իy^E^?Sq-[@ Dj׮ &AGWj;w=R`{Z;5k/L6q$''ktm@=!4 4@ +KNNs2d3g/KWi޼z;?uPQ}G: n's 7 tcPxqEn֬)ST{={Dvv.zB:h:h:?{N‚L9Ν+a[nKU4iyum:({|Wng3sM7 tUMl{ =_mGMD&MګdddhtyʶbxO%>>^Dbb943c*(W93//&~A%{:(=n8q @ugӨQ#5:BUݰae](wy߄ɓƶb`xO.=?SNL2f>ۮ I\:(=rHqٳgC]j'^#\qݮ[Hlٲ|Orݿ:h} >i1OH@BM1aȽu6lԩS!.YD\|扺&A4??P\9E3f>۷o6>yB:h:h:?/<s׹sg 3)))JǎU:>1xAСCuƏun5砗/_n{@4F:hSNi@t $tu~:_s֭[5߲e$̠Czvyq$> G1A9^{M\gĈn=>\e˖k4A/]H:g}f{@0e^k4|ʶb`xOEʕ+%ߛ?_~=ѣ_'t>m۶* v:ɰk4A嗶G + tWXa{@w^#w}t $tu~r%9Fa[s„ I޽U֭'t>/Ƚu6wC5?A㠃~i&iӦ~#nMϷm, H蠉T4mTBnRJf̽ܓg}V\^z}{ uPz: tA4:wмgD>3fPG +L +}fY A3A9v옄Z0<*c{@ +[A9~ 8ĉuvAGAѣ fRСCG +O=FY A3A;w?$޽yU:,* ޺AW\xxDǏס:htcbbl̽4=rAFFFl, H蠉rssiVƍ  lzqv3)ݎ;V\qAG6$9sv)}~cg10OH@BM< Ij$,T^ϙVZ%a}G/p;w=V 2dto]^]7nG-Ct8蠣A_}նG S6//H ++KͶ}t $tq~lٲEwszժU}Ap=V 6lto]]~F4<5:4:vUT=Z`OT=q>yB:h:h8?]hƌ#a$ +۷otz](QH\w{:(3ψA㠃:htsI>٪ݞ:uH`ѢE}'f &Ӆ}{%wIŠ6Zx#'BuPW^:t8tt;脄ۣ p|7} +b x O /^+wݠe˖G + SN5 +מ={A㠃:ht{ %''; `ZvZ A3Abbm?^c*Utz])0|нuA#:ht͹CaϞ=Z'f &$==v6nhm75j [A9ݻAhݺ5@tt;ohÇ:'f &ŤaÆ 0rHkA%Kl 3rЏ?4:hAtx1g3*uzm@ɓ'!vU\?A㠃:h<퓬,111Zb x(kmA +|vQ2h qM}]w'P,[ rЏ>4:hAt$)YƾV'f &JgtIII]9k׮h:h~wV^ [A9.]Aa:t8D3gi1OH@BMu̘1#1]6ϹȰ6Q{:t8 /qA4fQZt $tC\:ζ] ?ڵKk{e_:OJMqA4f%:fP&JRoj^ZZZ֭[mJԁыA㠃At8D35kW:Ax(Kjz>K.K.Dz-;v창&Q˱cǠGC#==-H۶ma:t8D3JA3AsٻuJ5we>^^u9z gyq:ht8?Ah)A3AsٻjTRZgj:L-dʔ)W! \̙3^頑A4:h& 4S'I{Ջ/E +mU ^-|ɜp/F"aނQ~ ^rlFg_0^A&3gJLt,(FaBc&uYϳNxbwK E0tPY/ZZ8h8h?!IM$AC'FsiO}vN +]hؽ{ȽCE?n˖-zɝw) A}IZ8h38hr6AIpЉ\S5[\!t^{']sᣓsޢE'|z뮻d8h8h3f̐ 8u<&)gr4 ͥ=BϚ5+t'?uI+fرcw_~%rA >\'VցZ8h38hrAIpЉ\S-LQ?[З93g۹sgeCYZZ8h8h?!IʹM$AC'FsiZǞ={BimmwU-tMgu'N< EQWs˗/Z8h38hrAIpЉ\k XbER=Ifyσv˖-sϟ, EQW4Z̙3e{*8h8h?!IM$AC'FsiZG}TeѣGfyω\~_C/xEQW4Z 8h8h?!IM$A8skjjMҞzYaСVs<窪*ꫯ.?xEQW4Z 8h8h?!I9M$AشiդTO2%Fbys 7lE]qνKqоAA yMR8h" Z>~]]]e[Zš,544.7EQW4ZɬYd{*8h8h?!IyM$AA_g, /^!YK,}8h-qJp~AA yMR8h" ZG~~B/itL07{?~;ЫW]L>cdE]q8h%8h?ucbtMTAA7EϪUB/g;wβ_*||z˖${vR'UpZuA㠕ցZOkkl?&&AapDtSu^mmm3jw*]cu_ر#t2ˁw}7Y UuցZOKKl?&%gLhEdM$A(s]WC/e,]Ԫo6v˾LfT螧z߆~֢̀+ڹ+VHjA]vcRrtMTA(cTdoͰC/e$g:9{M$㡇f/^ xEQW4Z 8h8h?{tMTA(SԋZcqO~[.TTTXиK~{> c.\3CUUl +p:p~Aٹsl?&%e|&un#N<Ϫ?C'r뭷33࠵(ꊃA+Aw}W.ࠉ*8heࠛn=wg ƍj{8,X4ڝ;w.fE]qέ\RR[48h8h?$7ڏIAipDttSW,͘1#2Bəp^1{ӧC&V7߄~p}sAAAwyG848h +:zSNjߵ5kք^FqY+&7o^d 6~_uG 8h-qJp~AAߖ$82 >f7ȑ#ašg$!qF*8h-qJp~AA筷ޒ$82 . +-%3d={qɸ ۷o~W=33F֫VQWW'- pzpЙ &uDg[=K=20ХyO>7T3g΄~֢̀+pz|M~#]vE;=uAapD:`ڵǴɾ}\O%C/ 2Z8hp:p~Ainn:5jEqe4Q#bn1;v,)RYY ',_|E菐pZuA㠕ց:+&;]AUp:btЅBa +}e7*,e!eٍJR&[Z$VjF>6hS.2a5D>mW5vf 5EQї|箷x_-qu=yf~[n/=3hh7n=34orܽ{wۣ9âE`㴴4W_mǫE$90fOpϨ}'wywL߉ki]lt8pPD+0eEE표k]xD;/2ٳgvÁt8AYp!~LMTvHqhrQQQ1&W\q폍Ԃx؞|ᇢe˖O?=3AcAJ-:,qA4A3AP32d폍ԂեRm˲2#94Dt8=gt8A㠃l} 7 + ac:h:hZC@BC5xml 4h;v=3AcAJM:qAG֭ќ4sC@BC>hbw^lOoiٲh&!!h۷o=3AcAJ-2}tHttaA:tRRќa144Sߡf ơAGEE6: +^۶m=3AcAJssA4:v]t=3ttL"nbp}HxWa8px[n=3AcAJM:qAGԩќa144S㡃f ơA2͵:{nؾӿʺuyfc94DttHÁtd;h~> A{:h:h!{Hiݺ5loxn4?+pB}nڴX@C=$ڙ1c[:h:谠A:>>h@#..DtA8Lسghaر̙3gƂ|Mt8A㠃lݶm[ۣ94X=A{:h:hJt?==]|bڵ|r܌=Z3sÆ r:h,^頑A4:v-[=3Ahժ= 4 +G<YķG)Z8uloxnƍ'Z0a>ׯ_o{,gƂ t8A㠃l}e蠝O$vZ A3A;]ͪ*CO$&&JEz_w'Nπ3x! :h,^1gA4:v 6= +*iܸl;- HqxM6<2ydJff>KKKm tXAA#:htБ9sx;VS=vZ A3A㠃Y22274uPQQVE+s>׬Yc{,gƂ t8A㠃|} yo6ӧMʶb t͒'>|{NM4mzSO3ۈ#D{׊fbիW蠱 zyW AA4f͚qMpgy+Z9zvZ A3A㠃xbcbףG^4;nxV=3AcAJM:q4i҄kZ;[{ݧOJee'fuW]u[A_yB:h{w/_|;o!C6.5A#8Yl W:h~E;tcD̙3\wwqhD{m, HqA_8z:oN:6 f4;d}.]X@+44:pСnm 4tVVwЃ̶b`_ߔY蠱 z9`:pv~#yv>?뤤$ynje&:,'f Ak_reD׍fjO:AcAJM:2ϙ:t표૯恃n޼?C^b&:,'f Am3fhg5~hv;SLb +c94D7 4:p[v_ Er NQQqƉVvj\>yB:h:hUUUx9^~+1tjٳhc˖-tFF>W^m{,gƂ t8 8hG=σsMAg%~~iJ𜽁Y A3Aj*ck}\\5\SM4'jvЏ>>KKKm tXAtgAýkd"o>i8%KvJJJ`Θ1C4<fѶ}t $t$l)?|5;I&wGr:h,^頑ACd~|'\r饗hÇ66nhl8aʑ#G[je{$ƂuĈ:htБwnq߾}m \T)]t $t$,G P:u$ ohuglk)蠱 z9h=J&nץKII53n:ڵk;Y@||/'f &a9h_~߮]ZpqH6m} N@37.--=SAcAJM:<y#۷(^5 B&4ih61Hm{, HI:!!A|ȑ#Bs &&ӧho4wK/պ=1ZヲYfGpzXRRb{砃Ƃ tl۶^? '| fA?㢝ڼߒ,ZY~1޶bWaÆպ.]Vz]=ω'D;UUUҫW:7eNBQD;t8guw^ו;w®]ivt7ዲ' ׍8hGI:RWWpM֭[G&k.랒P +Ҩo߾ԩSYoGDDPll,eddPeeKU8h^8 +-ZD-ٍ3{A&s\^xÀ慣pD*Km᠁?6s[ij:x% +r 7e{+sOp9h_|.2Ç\oQ̀慣p|:??L(~9MMliɔ)a 4rк6/_LQjjjd7h4/u=z44poTVVYij;hn /EvVOIJNZ}&]ӧNJrqG#n G]9~#''bNSA`: ߿} @8h+pЀA?tedx$ٗ4AAs XqYi;h%K.3<ѯF 8xWXWڼ.w0xܹ G]njC + +tࠁ߸,48hĞ,< + 9 ٮ + A3ݻwwu~7y:ݦMd7h4/u5kְWiq" ]1UUUv_gYVlWHpЈZ897q:Q]]Zqd2Nj7vXٗ4AAs Djj*[Ŝ/-2qDeяRd{*D'FX v&L ]iMػd]֭^vAQהxd6\'Ӂ~A+4Oa8Orr28_'Q!p^׮]K2m4[oL&//Q222d78hn8 +  7\R%yUiuAAATZZ*<4q~lG48hඃ֙{y>$$Lȑ#׷o_M5-Z} J G]9;͛e_a뫘$oƶ_`I' ϓ G]9:5 ˾__QΝ)4ots + +٥. iӦ /M! +4pAҥKG&ٲenk^4pufʔ)l^z8aFv3|s=g̸m*pмpuܸqd:\> ӁA石OiŖeUrܻp*..]2K,-[rBVAttt4Lll,뚾Lfk'unrss[o9, +pŞ:Ӷm[5x?(Kyy9jj࠹+44'pȝwމ}9΀ꛘӚϡC\wЍ9cJJ +9gӱ}fAأJWyk9sչVUVnr猾}k47uMMM%ӁZȑ#/Q)\sZ9=^eg}{<'vQF r:#g^'&&\r%ԲcǎwnR9ȱTy+4t;hڎIi: ˲Jxî](>>{,PځF pW_}5ĉ]t!yG]g޽;vYk࠹+44'pj8hkd + #4utzG˲ʸk~Dv9G)=e;(DA#\n8I&xuKUUz}dFu:8hn8:~x28h>q",|21"4es-?38h?N{?GDD=iwв<\`yfe%[nm>y. (pWࠁSi&ҙhO +;w$i۶'߿mܸNee%\ G]9>y^믿N~f4b>9M/-Cޣٷ@yoN#Gqp8uкzALwEso3cAsQ{L8h8蓹iѢE'?NӦM`vJ1U"[ cNPRvvϢ{8 +48hAӇtFa̘1d:W^[(77Tĉ4}t袋\iI G]tQQɈ233IukQxx8[?;-}4rЧx +9#2?>UUUi>|~{ɼψA#*;E5 xqO?msRXX! A5.++ &xXc +Oys~Q12t}fY6ٿmn׭~)9rtgC+>>;<5,3gčA#;hAӫW//Bڶok 87tM4g;*}_ArP=M]SO犊7 wZt7n{g[WA#=zPBBm̙3wߵ-[S{;v^SWTTƍiʕ3jVV=4h 챁 b@:Aqqq4ydˣ+Vi۶m/Ё<.(//b{sxS=֩S'9n|}]n)e@gϞ8))^|E{ϋwy/^lS>8GJڿ'?Nc&믩v999']1~>✣K/TzlN /pgAA?pj9h Sxg +\9$ }eYh›ge$DA#FAAAw>׈0/{mD.˲e{$DA#FAAAOu":{ϲڊevHށF   8ha3pާZU@eYCe{#ČA#܁FA ,K +_eU 4K#DCO!KhčP +|"0 ADC'S?N0Se8̒{:ggu:k=g/d= NZ7΍}U?#pzv9sٝE%8>;;@/ݎfX|_a N&RAo za=E }՝W&u`sO%v'bh, ;9u>s<ɽ K|:}E$jV2аx:tZO'y9Ѡ7+?K{>z^<ɝI4F$@fthX?OO:̚ߘDc|40ة_404􎼞p|:$&yZ%/&iԠCy|ҡԟgMLs՞]Vn14mW#IxϧCgף;Λo7oG/؝7Y[=zk+kujKAOګ E>I>=@wS{dL$X MkfMXA t%{+֣*k +4&rl>[/'9䚆|{}*O!~ _|O\Pnidױh6~Sۃ5ܟν>Tg ˕doya^&9Sv򻍿 P==s̮Nr$/Q{|3NrKPK=|5w[ L~)#93Z4ԗ$7w6K҈-[.|w&Lr"ɯ=|%v hks$M$?Ih'$M6-w!ɯ5I>T{|\~!&i9O'σ,=$)\$oZf.c-;;yUI.6P P= lNGvh  ۡA@{4hz4n ѠѠ4GGvh  ۡA@{4hz4n ѠѠ4GGvh ` zmmA@4ha7h:A@4hz4&i!  I4tH'ɚݔ{FKngc4@]tS4h Pq4{84@}t< =Р,tuhmСg# : cAE֟`L4h3 &Z1РZtGYӠբ]tgѠݣDchG/4}Ѡ @ T[O +ر 1A9C'<`B53  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠ i( + AoAXTޙY|t>  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EA6= + !?F{fyv|4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAAW +ر 0 쿴Cp +ԛ/of|4  @EAPѠhT4h*4   @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  lqO + AoAXޙYNw7ӠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4 (a% +ر 0İg:Pg ^iT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4 rƎ& + 0Ch 2m{8׿?  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠhT4h*4  @EAPѠh,rڠ_:,# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt +Kg_&d2i2gdL&3MK/i{6VhqBAP]Bv%T +*(]XTn|Naz.ss&,>y_}?[UU* `usXU$9SI~_I:I$JzO'e܌/j=kt=բ>/dEgО/p9IF@Hy֣yE}%CU_@;:Ud}W[6U&v{nk;YOUã6J?#Gë7TS܌H+@/;r{ʍ;mп.L|(sI~OI3Wj3I% Kف^_M^uzr:#I~5ϻ3Im֟g]$O6KBעfvl3MZ::l~9I_ґdy$kw4;Nr.g`JrSkfok{nvzвj936s׵]h&ɦ$O%y;aRc“zipKA7܁ݗ1y䖎od,E0/I>^9-۴t;Nw|{Yi֞h.JkM+7X zWdz}/w=_}@oKziľmnl[NQC$w|VlZz>}I(О\g@JBiѮ٭OA?ԨMH}=ʹϕz[ +YgK? zSkK[_6yϵZs->k"yAJt%˪ߕ9tʢԻJ?zOkK;.;>}QN gQ/u}ڎym{jwFJ'^uJwc\\{wqjV;J?zKF]i׉;e7NiԹ~Sﳶ;YAO_sW3]o[9$y6?0yE-۪kZ'J?zGҞvˮqQB {/x%Y'K =fpkOمeII}}]ooԸnW\F4h:nb[gv?]hZQZҒe]oknԷ>ݮ]NnYrMwWoȼ^~.4MKrG44Mv]jWUA jдuzڝM̬]hK`Tv]qQH[7}'4jf[vL3 k%y^G]syכlz5qtʹsBoHrѼ~+;bm3;SPVO73vsbϪ=]Ao{]3ok4/{WWfwkO~f5gئF]l n-ڠkY_)=#$ԛe+wu~h4ϗ~f+uwZGkеl|7՜:v{?_/=#Zӭ7/w. ?J +{YYz[LϽg&$3$l,$l[X.WUuYPb %Z.H! YĻ +^9i:[+L{z|H*9{NwW5@$Gܦ9t#Jtv=9wP߂LGx5ZCî:|TIDVNGz7.9W}_7#c򣱥gmݮLkԕgs}.$}Fpp2ƅ_ 33|3gZ ͭLk/xS\Ʈ V=}9k@u?IWy3X}+Z-Ng/tK[Y:uɟƁȠG_nGWGsۗ"ϴdE셶]&szj͟F zAs@$5SGgevoɳ m5pꮞ}t M͟FQݑg rӾ'Ǖqu32Yo^[FCi؋LKG_!3=(j~{ߝL}=;"onEe}+k~g!9ts[[)>[#@eY/\_}=IKrX1,kz+ksaoJd%Z5{>w޼hDg-} T.Iw~3'dm=I׹~@$͗54FeM캲? +eITdF|>nZL4v梟y@e|ghd~K9r|_;DO|QSkgYȲ>R%}18,{uWk!?mﳀAқTK;6:}=Iˍz#ϲRW2\zʟC}ppHz"ߙAxݾ@$4_n?y3:ʲ^Wk*#̞}F$}54%^s}=ISiyV׹e΢ɞqH&i'̘=Fc^2gmﹹG%=$醤H:%iIҠ6ctXҽ^~N/Kzw$=-($}W.۱yl<˲?YַFafџ {=I?&ϋOk;/e~{h>rUgH^f?6~K38yZ+m{Ɵwx\RFҀ16 s{a%~II|8(-/̆2hP}v37JQgYF׺6ʼoӹlEͭ}<%$$mJ݇?~R^{at-7TXA[sdѹ! agѹk{>adѹ %\^>s ^,S.ip 늅oFE=E$}_c֬彛g뾍7(V5gϷL4ǚٺZӗBڻ{o/<[y,:Y%.$mݦWxiln3m=&9G&{DA[[s#[OGߨ4=32kzi=<7]74wyPIٳ͜l90aSܖ[1˧3fzZ?oRٿO1SLNMiLtƅHs\k\Hg<{wW{=ڑ+p`9y;Zve9})bMx="3~s{{@9n{ij2uqr3ս޴p^r^SײKcRyߟ. ;{nhn.n KPf3qImf7s%k|kM(qOU@yBWh4%:M<ܾ:ضd{jcsi;]=31aW MeQ绷؜{d~+wz=\ܖkM/a$]1j:dzV:e]p>_u{d϶7izGf`0yهKu\;kJ?JZ-:9=6#we_Hz/gsg;Cwflng}ܮ?:y" ٷ6324мoZ+4SWe,tegCy%=L[ϰH-{V}]2ó&ޔ(f>th~W3^=T IM~,;[lb홖^Mu\ן*r?g瞱xvvI5\(4~U :}~\;Wvs|݄3Sΰ=k깇#;{{Ϝڮv^t=x'͜Sξ30z +l r@v ˡbgvhKlWL>sƖ}a]Rd{èkhz{=^B/4JRL=6G_= Kbg{:\=v®`(W/thZG 3w7f+;[%_R}>uԢ3s.I?XLޛ٧ޟ\5 Ϭ ztXRDGoYsY:}f"뽆Zdϣ?o@d1} 3jǛZW\Az}QKs*l_qj3VœWo{|Z:zVeN_G?3I/4cI[M,[a{.q8W XNsJkI:l2r;ߟ;vHzSAR]̌/Ts/3= -:|2Z[̍ z3eݛþ?{@mӅJ7}.W`z + N~wz6s$:^uj53œX,"{kxk~~s0eT +#}Mo ~9WM#G#od{%3uuZ7t}&Z!Ԃ\{|ojF;'QӎNΫܖ3TN{z3H|- xpz{R+R\l{-7mƏ:j񍉎jf$:ɫO:ɠA/$JLyf{RKw\{03kX-5~8[#޳`P㙓Fuvn?4A3Aܦ Ϭ7̠{38oĕA?cibuSkȠ@$}GydVko~3JseЏ{|}vYˆ҇]{)ߟIHJK Vu'ӮygS(5~,oL{j74|IZ=ڣ\9kp{vR gГkg]5WAZu;Ӵ&Vevo8G?@h5+gԲVwcAqGM{|ؼ}v;Wdٹ+ZRAggz$}ٕGf~%:z]ѥ{+.^u[x;S>ւX,9;ǽ,Hu&P~C:| +{ldY32Y߽kzofl& jT%$*@BH[PJSAD 5 RQRM[B@Tj@[T@QމZEs=~3tO9~9AH_Dcޓ? Y^xc^ySkZVjwz;A}sN}ݣu'is_rțZ˻!qiڌ폸]cpyUjz{v~wPXޝh$?g3N>0)6z}ǽ4{8 FDfp[dHOgS4RGCN`G͠/0)uT#CQ{h t"L"-ǃl{>kl j3A*]$S Lw9hhΕ?&1۳|;xVˏw{=ۿ^~/wsΠ/VH A[_4{`j52سr]0~:&&Nں iDYM`省6g\`\6ݰYV}6Wʭ|{9R_]l- 2j7<~`pft7Hҥ]#?$ۦ3MA-h-x?{pn; m;G3ߕ#.Z3/mb?|vv^Lˠxo;SQ~ٺ]8;WJf+ﵿͽ@z-0g}i[}YwCLMڮcfvckV9 lj?GbZvo73/}K$k?6|CD}/""?}c^s5rz.Y]czRq-Rח96E>OqYgfy~}_D~ED@1lDM2/68}8)ϻʪ'^{he+kxС>}}ݵuZJ]Uf^84A_tϼd>cwT'9eoZ~bW.;sNdДGEjԙH:gAzZ=h+nym}ѽ[+.>>~sd\?Ȟ" -(,4~ID>("?/"׈Ȕ mEFQ^NKא,2H=`^y3χJ]mfO*;YV3FYE"&ED~PL6""3"d,"'"gɞ+ڻlo6?zYD~ADf7ُэbnȬǃZ_<ǹy6x=!ZZ:d\"|zM^5Nk5G5g=gǜ5w<նq{wJDnw*}yw@"2穋N3s:}qEuemγ+3CYUk}v=qpV1nno&{;8k6onwZS9;:glkȏ/;f.%$"ٜe]A"ܷ֞-N7k=[X㳶Įk=t5eй|1j\eL%sm q{ +7[524ݳ&zE>m..y&o("/ٮX㜂VK185KY>]c]qy G'lx~@X"2eRp1'aAbA[XWlY{~2rѭYctJ7{U$gmL~|EsaZ&5yVgKq0Y۟Ĥwˠwk5[: tMO| 1۸:ƝsJ>-먫ort MIbAi~|v56j3\L{9]_]CKz}-_t~f׵| ,yіut 9^Lnd/ƨwˠk)]k|vC713hyFȟľu}cV_l>sv8fҟKDe:z +.fGl*&nrAKMB_[:rYƣA?ojVBvMMb[θ-!kw9~m-@"вqbԿ}ˠe#ԗ׮7suZ+56{&dFμV\o7炩;VWLg7zqζ^@"2Ak7;]rcZF z]aMڮUHyi%]t~|9l2],[{xWgTSS3޶{alzGCDV v]Z}?Y[2躆0۰CoG!ft^O㽶uզݟ9oZ}?4"-hr Ŭ qˠCDZfvL6̠[̡Zy Vs\-X=.EDe򖑹ZoٚAg[5kVKS[ +Vm-7G9zTַg FDefe`rU[^aV6F͠;oVs{v_ZfSۼgEOEQM7k>vb>g FDeegyKOa^[^a2ODl3dEktrI/Uf5IODp=NDN oԝ;u/n7.De]{2UgyK<fЭs+3Vc.B}خgy}{i}J3iz;domX^4{bw4"7cpfYޒ+jyˣ1ߕ57v[% oV[oy}CZ}62hYt,jmc:ZO7|іq ;,o1gjJˠzVTZcw]n຾Z} Z?:yVM"!yED3DlrE"2o).qoXJo7+--ZrOe\*Y[/B}Z31 Li=62K{mu[ lO| `tatcؿeЩtF@~v OJ̠3AWy{+5޳|%۞+n ^p2hI'V zV׬^D2mOo[>피cؿeLJΠCAr\gbL|lyÿ?-K3Lb%gN^9wFD^eC{:[Ɩ 1_A7i} zh(4ImOhD䥸 -=1_2t}lYAO:ox12hlg)[ƗΡimO|w`)1" +lU]{vmu]m]616h$!j 5!`b &D~Bb$D0Jb"Djl;<۽}瞞' D< "F/:DvfױuEֿ}Mt9YFSgBwndϰ66em?խ3Ӻjי=Q&"w58|7f3`""_eN3ʪSp2h,s>D}7jI cemdX=w߅Sg33e;} DDPLcswΔ(MEԿˠkQMŘA43fS]|{=ɮg+7m/|Bv'l2OJ]<7?D}ҭs3J2NA{~?[zw͚fk`""72uܥ&^( yuzw(D}js^_E ú'׏8yLo&jO.ʜ.joEd{tשp?wл+BwRAϠ3{!y2-9;4 ޑ+.[d+]E$ kTgέZ{L};㺵Z;/堩_b'JD[lΤ'M3H)U^[{]2gׇ +Zdy}s(^- Tf(3}؞v>{L3W[\c;U9]zCD^4] ,Cyi1}R?b/A'ɠ=RPl{fi}!"r6ًҙlA+6GzuȠ[RPZjgc]F{3ڄqwEbޟo&"XaEkjC$"sSszxwt]뛕Vz[}ҭ1+3lQ4Ƞ A8jAo;ߊ#gtMD?3OD>-"S" u~ж˼gd:1>jZztT|&41Sږ*}{ ͢ "3?JzbZ 1Z^TcEmd( &uyGU{ m<7zϜϊb+{}嬁k~1LtkWxwfгQVgqwVoXZ9=VYxnϷEb?VZee^j1՘ a2hu43f gV#NO,zx DP߶ˠٜn2Q~/24"9Y{+ɥ 52t L-'7:3AѠ+72A}hYy}qo KuAc<ܢsW˳L JD~QM!fq^_TfƽݸwGtoI k]w ZӦnm;TȠzwX3F߽(^趾 VUgؔ[b^.4KugYbe;BVgx̔};TLY^wBWt,WTAY{ I+ެgtޔ[<_3=輾hf3ɠ WMSryU 44۽9+E{3j3dd̠~D|Cc۽<˱ +2hy"rMk jp~Ȁnb̠YE;<14(y"2bAb 7{ ɮ[[5̠| LD?=|O<{"rM]][ m{+pnO[g흥AבA~=9]8j|@>ȳV9t]S0p vKtէ?Gs ~=Wls>2Lo$"S6Rh Fwîeɞa}?^l\s* T(tL_|33˦䛈\gCmw]=]:M|d>(hʒA#rΛfE}(:nHC't6%A zp9o`@!H6ٙeZޟ a:MkSgj֢.2hXgGyc{4@ȀdCbAsٵ$ag2/Q9˺& +b2Sm,"FQg5fLo$"c";Z=]+gATNYyӺoB3hskȠϊ*}͜7BSY9L:=Ԑ^|5M{5h  z`jUYSG]͠3I}pADЕ5Aߤr-g-ot?-]Nj~fiYsuz7rzy5f}?k9No\t:ɞaLD C+`؂́ L٩y~8Zڎs*wv=K(U߽uv.38aqS-O?PuβqedN-2Oz@,eύt 4$YȡY>0\VMͻ/ގkN?Ƚ*?-#Wo*W-YڕZ֍O=G_<\gã~ϙ.TΧ*w_12ZV%K}m\r2yͩ3Z tB]* 4@ Knfoɲ>jvlr:}Cc6G*S^ȓG,;77u;7j ɵXٰ@:st:F6]T[UI:/v CH24ZZT1߼F}ftsv 4@e*h$$R--BWVܘo7k~008N}f|]-=@2uCZ~0 !Yt[Yyf5=:Z>ghպƬ|57ou[(k6,:HbNzspxuYm>䁓w,=.U\߰fӎN{ 4@wAf{%y/ٽ# P5kWpO\y\ljz)}౺$x$[d?L|s5]esP3rpJ2 I} OI>eܫ}cI>j.YacI>PqN$=%F3WR}0=_zE˞`b-{NUoȞJr9$NKdODlY_L'y{='TT3s~4ٺ<4\eO +' +# +A 7}V$T|rt # +A 7}V$T|rt # +A 7}V$T|rt # +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt# +A 7}V$T|rt A 7}$TKUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUݷV \ No newline at end of file diff --git a/blockbench/icon128.png b/blockbench/icon128.png new file mode 100644 index 00000000..44bf34f5 Binary files /dev/null and b/blockbench/icon128.png differ diff --git a/build.gradle b/build.gradle index b615acdb..d78e0783 100644 --- a/build.gradle +++ b/build.gradle @@ -1,93 +1,6 @@ plugins { - id 'fabric-loom' version '1.13-SNAPSHOT' - id 'maven-publish' -} - -version = project.mod_version -group = project.maven_group - -base { - archivesName = project.archives_base_name + '-mc' + project.minecraft_version -} - -repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. -} - -loom { - splitEnvironmentSourceSets() - - mods { - "tiny-flowers" { - sourceSet sourceSets.main - sourceSet sourceSets.client - } - } -} - -fabricApi { - configureDataGeneration() { - client = true - } -} - -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings loom.officialMojangMappings() - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -tasks.withType(JavaCompile).configureEach { - it.options.release = project.java_version as Integer -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - sourceCompatibility = JavaVersion.toVersion(project.java_version) - targetCompatibility = JavaVersion.toVersion(project.java_version) -} - -jar { - from("LICENSE") { - rename { "${it}_${project.base.archivesName.get()}"} - } -} - -// configure the maven publication -publishing { - publications { - create("mavenJava", MavenPublication) { - artifactId = project.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } + // see https://fabricmc.net/develop/ for new versions + id 'net.fabricmc.fabric-loom' version '1.14-SNAPSHOT' apply false + // see https://projects.neoforged.net/neoforged/moddevgradle for new versions + id 'net.neoforged.moddev' version '2.0.140' apply false } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 00000000..67840524 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'groovy-gradle-plugin' +} diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle new file mode 100644 index 00000000..6196d209 --- /dev/null +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -0,0 +1,131 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +base { + archivesName = "${mod_id}-${project.name}-${minecraft_version}" +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(java_version) + withSourcesJar() + withJavadocJar() +} + +repositories { + mavenCentral() + // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = 'https://repo.spongepowered.org/repository/maven-public' + } + } + filter { includeGroupAndSubgroups('org.spongepowered') } + } + exclusiveContent { + forRepositories( + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org/' + }, + maven { + name = "NeoForge" + url = 'https://maven.neoforged.net/releases' + } + ) + filter { includeGroup('org.parchmentmc.data') } + } + maven { + name = 'BlameJared' + url = 'https://maven.blamejared.com' + } +} + +// Declare capabilities on the outgoing configurations. +// Read more about capabilities here: https://docs.gradle.org/current/userguide/component_capabilities.html#sec:declaring-additional-capabilities-for-a-local-component +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> + configurations."$variant".outgoing { + capability("$group:${project.name}:$version") + capability("$group:${base.archivesName.get()}:$version") + capability("$group:$mod_id-${project.name}-${minecraft_version}:$version") + capability("$group:$mod_id:$version") + } + publishing.publications.configureEach { + suppressPomMetadataWarningsFor(variant) + } +} + +sourcesJar { + from(rootProject.file('LICENSE')) { + rename { "${it}_${mod_name}" } + } +} + +jar { + from(rootProject.file('LICENSE')) { + rename { "${it}_${mod_name}" } + } + + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_author, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version': project.jar.archiveVersion, + 'Implementation-Vendor' : mod_author, + 'Built-On-Minecraft' : minecraft_version + ]) + } +} + +processResources { + var expandProps = [ + 'version' : version, + 'group' : project.group, //Else we target the task's group. + 'minecraft_version' : minecraft_version, + 'minecraft_version_range' : minecraft_version_range, + 'fabric_version' : fabric_version, + 'fabric_loader_version' : fabric_loader_version, + 'mod_name' : mod_name, + 'mod_author' : mod_author, + 'mod_id' : mod_id, + 'license' : license, + 'description' : project.description, + 'neoforge_version' : neoforge_version, + 'neoforge_loader_version_range': neoforge_loader_version_range, + 'credits' : credits, + 'java_version' : java_version + ] + + var jsonExpandProps = expandProps.collectEntries { + key, value -> [(key): value instanceof String ? value.replace("\n", "\\\\n") : value] + } + + filesMatching(['META-INF/mods.toml', 'META-INF/neoforge.mods.toml']) { + expand expandProps + } + + filesMatching(['pack.mcmeta', 'fabric.mod.json', '*.mixins.json']) { + expand jsonExpandProps + } + + inputs.properties(expandProps) +} + +publishing { + publications { + register('mavenJava', MavenPublication) { + artifactId base.archivesName.get() + from components.java + } + } + repositories { + maven { + url System.getenv('local_maven_url') + } + } +} diff --git a/buildSrc/src/main/groovy/multiloader-loader.gradle b/buildSrc/src/main/groovy/multiloader-loader.gradle new file mode 100644 index 00000000..65280361 --- /dev/null +++ b/buildSrc/src/main/groovy/multiloader-loader.gradle @@ -0,0 +1,48 @@ +plugins { + id 'multiloader-common' +} + +configurations { + commonJava{ + canBeResolved = true + } + commonResources{ + canBeResolved = true + } +} + +dependencies { + compileOnly(project(':common')) { + capabilities { + requireCapability "$group:$mod_id" + } + def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) + attributes { + attribute(loaderAttribute, 'common') + } + } + commonJava project(path: ':common', configuration: 'commonJava') + commonResources project(path: ':common', configuration: 'commonResources') +} + +tasks.named('compileJava', JavaCompile) { + dependsOn(configurations.commonJava) + source(configurations.commonJava) +} + +processResources { + dependsOn(configurations.commonResources) + from(configurations.commonResources) +} + +tasks.named('javadoc', Javadoc).configure { + dependsOn(configurations.commonJava) + source(configurations.commonJava) +} + +tasks.named('sourcesJar', Jar) { + dependsOn(configurations.commonJava) + from(configurations.commonJava) + dependsOn(configurations.commonResources) + from(configurations.commonResources) +} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 00000000..4fe9c0a8 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,55 @@ +plugins { + id 'multiloader-common' + id 'net.neoforged.moddev' +} + +neoForge { + neoFormVersion = neo_form_version + // Automatically enable AccessTransformers if the file exists + def at = file('src/main/resources/META-INF/accesstransformer.cfg') + if (at.exists()) { + accessTransformers.from(at.absolutePath) + } +} + +dependencies { + compileOnly group: 'org.spongepowered', name: 'mixin', version: '0.8.5' + // fabric and neoforge both bundle mixinextras, so it is safe to use it in common + compileOnly group: 'io.github.llamalad7', name: 'mixinextras-common', version: '0.3.5' + annotationProcessor group: 'io.github.llamalad7', name: 'mixinextras-common', version: '0.3.5' +} + +configurations { + commonJava { + canBeResolved = false + canBeConsumed = true + } + commonResources { + canBeResolved = false + canBeConsumed = true + } +} + +artifacts { + commonJava sourceSets.main.java.sourceDirectories.singleFile + commonResources sourceSets.main.resources.sourceDirectories.singleFile +} + +// Implement mcgradleconventions loader attribute +def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> + configurations.named("$variant") { + attributes { + attribute(loaderAttribute, 'common') + } + } +} +sourceSets.configureEach { + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant-> + configurations.named("$variant") { + attributes { + attribute(loaderAttribute, 'common') + } + } + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/TinyFlowers.java b/common/src/main/java/co/secretonline/tinyflowers/TinyFlowers.java new file mode 100644 index 00000000..94140484 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/TinyFlowers.java @@ -0,0 +1,16 @@ +package co.secretonline.tinyflowers; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.minecraft.resources.Identifier; + +public class TinyFlowers { + public static final String MOD_ID = "tiny_flowers"; + + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + + public static Identifier id(String path) { + return Identifier.fromNamespaceAndPath(MOD_ID, path); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/TinyFlowersClientState.java b/common/src/main/java/co/secretonline/tinyflowers/TinyFlowersClientState.java new file mode 100644 index 00000000..29292756 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/TinyFlowersClientState.java @@ -0,0 +1,15 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.resources.Identifier; +import net.minecraft.util.RandomSource; + +import java.util.HashMap; +import java.util.Map; + +public class TinyFlowersClientState { + public static final RandomSource RANDOM = RandomSource.create(); + public static final ItemStackRenderState ITEM_RENDER_STATE = new ItemStackRenderState(); + public static Map RESOURCE_INSTANCES = new HashMap<>(); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/block/ModBlocks.java b/common/src/main/java/co/secretonline/tinyflowers/block/ModBlocks.java new file mode 100644 index 00000000..d7f4f889 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/block/ModBlocks.java @@ -0,0 +1,37 @@ +package co.secretonline.tinyflowers.block; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.platform.Services; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.PushReaction; + +import java.util.function.Supplier; + +public class ModBlocks { + private static final Identifier TINY_GARDEN_ID = TinyFlowers.id("tiny_garden"); + public static final Supplier TINY_GARDEN_BLOCK = Services.REGISTRY.register( + BuiltInRegistries.BLOCK, + TINY_GARDEN_ID, + () -> new TinyGardenBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.PLANT) + .noCollision() + .sound(SoundType.PINK_PETALS) + .pushReaction(PushReaction.DESTROY) + .randomTicks() + .setId(ResourceKey.create(Registries.BLOCK, TINY_GARDEN_ID)))); + public static final Supplier> TINY_GARDEN_TYPE = Services.REGISTRY.register( + BuiltInRegistries.BLOCK_TYPE, + TINY_GARDEN_ID, + () -> TinyGardenBlock.CODEC); + + public static void initialize() { + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/block/TinyGardenBlock.java b/common/src/main/java/co/secretonline/tinyflowers/block/TinyGardenBlock.java new file mode 100644 index 00000000..f65ef69e --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/block/TinyGardenBlock.java @@ -0,0 +1,414 @@ +package co.secretonline.tinyflowers.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiFunction; + +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.item.component.GardenContentsComponent; +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.helper.TransformHelper; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.util.Util; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ScheduledTickAccess; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SegmentableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.level.storage.loot.LootParams.Builder; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jspecify.annotations.NonNull; + +public class TinyGardenBlock extends BaseEntityBlock implements BonemealableBlock { + public static final MapCodec CODEC = simpleCodec(TinyGardenBlock::new); + public static final EnumProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + + private static final BiFunction FACING_AND_AMOUNT_TO_SHAPE = Util.memoize( + (facing, bitmap) -> { + if (bitmap == 0) { + return Block.box(0.0, 0.0, 0.0, 16.0, 3.0, 16.0); + } + + VoxelShape[] voxelShapes = new VoxelShape[] { + Block.box(8.0, 0.0, 8.0, 16.0, 3.0, 16.0), + Block.box(8.0, 0.0, 0.0, 16.0, 3.0, 8.0), + Block.box(0.0, 0.0, 0.0, 8.0, 3.0, 8.0), + Block.box(0.0, 0.0, 8.0, 8.0, 3.0, 16.0) + }; + VoxelShape voxelShape = Shapes.empty(); + + for (int i = 0; i < TinyGardenBlockEntity.NUM_SLOTS; i++) { + if ((bitmap & (1 << i)) > 0) { + int j = Math.floorMod(i - facing.get2DDataValue(), 4); + voxelShape = Shapes.or(voxelShape, voxelShapes[j]); + } + } + + return voxelShape.singleEncompassing(); + }); + + public TinyGardenBlock(Properties settings) { + super(settings); + this.registerDefaultState(this.stateDefinition.any() + .setValue(FACING, Direction.NORTH)); + } + + @Override + protected boolean canSurvive(@NonNull BlockState blockState, LevelReader levelReader, @NonNull BlockPos blockPos) { + if (!(levelReader.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity at this position, that means we're in the middle + // of placing a block here. Let it pass for now, there will be another check + // later. + return true; + } + + BlockPos supportingPos = blockPos.below(); + BlockState belowBlockState = levelReader.getBlockState(supportingPos); + return gardenBlockEntity.canSurviveOn(levelReader, supportingPos); + } + + @Override + protected @NonNull BlockState updateShape( + BlockState blockState, + @NonNull LevelReader levelReader, + @NonNull ScheduledTickAccess scheduledTickAccess, + @NonNull BlockPos blockPos, + @NonNull Direction direction, + @NonNull BlockPos blockPos2, + @NonNull BlockState blockState2, + @NonNull RandomSource randomSource) { + return !blockState.canSurvive(levelReader, blockPos) + ? Blocks.AIR.defaultBlockState() + : super.updateShape(blockState, levelReader, scheduledTickAccess, blockPos, direction, blockPos2, blockState2, + randomSource); + } + + @Override + protected @NonNull List getDrops(@NonNull BlockState blockState, Builder builder) { + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (!(blockEntity instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, fall back to default (probably nothing) + return super.getDrops(blockState, builder); + } + + List flowerIds = gardenBlockEntity.getFlowers(); + RegistryAccess registryAccess = builder.getLevel().registryAccess(); + + List itemStacks = new ArrayList<>(); + for (Identifier flowerId : flowerIds) { + TinyFlowerData flowerData = TinyFlowerData.findById(registryAccess, flowerId); + if (flowerData != null) { + itemStacks.add(flowerData.getItemStack(1)); + } + } + + return itemStacks; + } + + @Override + public @NonNull BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public @NonNull BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + public boolean canBeReplaced(@NonNull BlockState state, BlockPlaceContext context) { + return !context.isSecondaryUseActive() + && (TinyFlowerData.findByItemStack(context.getLevel().registryAccess(), context.getItemInHand()) != null) + && hasFreeSpace(context.getLevel(), context.getClickedPos()) + ? true + : super.canBeReplaced(state, context); + } + + @Override + public @NonNull VoxelShape getShape(BlockState state, @NonNull BlockGetter world, @NonNull BlockPos pos, @NonNull CollisionContext context) { + return FACING_AND_AMOUNT_TO_SHAPE.apply(state.getValue(FACING), + getFlowerBitmap(world, pos)); + } + + @Override + public @org.jspecify.annotations.Nullable BlockState getStateForPlacement(BlockPlaceContext blockPlaceContext) { + Level level = blockPlaceContext.getLevel(); + RegistryAccess registryAccess = level.registryAccess(); + BlockPos blockPos = blockPlaceContext.getClickedPos(); + + BlockState blockState = level.getBlockState(blockPos); + + BlockPos supportingPos = blockPos.below(); + + ItemStack stack = blockPlaceContext.getItemInHand(); + + TinyFlowerData flowerData = TinyFlowerData.findByItemStack(registryAccess, stack); + if (flowerData == null) { + // The item being placed down is a TinyGardenBlock block item, but doesn't have + // the tiny_flower component, which happens either if the item doesn't have any + // components (unusual) or if it has the garden_contents component (normal). If + // it's the latter, then the Block Entity will handle this so we just have to + // set the direction. If it's the former, then don't do anything. + GardenContentsComponent gardenContents = stack.get(ModComponents.GARDEN_CONTENTS.get()); + if (gardenContents == null) { + return blockState; + } + + if (!gardenContents.canSurviveOn(level, supportingPos)) { + return blockState; + } + + return this.defaultBlockState() + .setValue(FACING, blockPlaceContext.getHorizontalDirection().getOpposite()); + } + + // Ensure the tiny flower type we're placing can be placed on top of the + // supporting block. + if (!flowerData.canSurviveOn(level, supportingPos)) { + return blockState; + } + + if (blockState.is(this)) { + // Placing a tiny flower on a garden block. + if (!(level.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, don't do anything + return blockState; + } + + gardenBlockEntity.addFlower(flowerData.id()); + + // Consume item, play sound, and send game event. + Player player = blockPlaceContext.getPlayer(); + SoundType soundType = blockState.getSoundType(); + level.playSound(player, blockPos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, blockPos, GameEvent.Context.of(player, blockState)); + stack.consume(1, player); + + return blockState; + } + + Block currentBlock = blockState.getBlock(); + if (currentBlock instanceof SegmentableBlock segmentableBlock) { + // Placing a tiny flower on a segmented block. + // Don't do anything if the segmented block is already full. + IntegerProperty amountProperty = segmentableBlock.getSegmentAmountProperty(); + int currentAmount = blockState.getValue(amountProperty); + if (currentAmount >= SegmentableBlock.MAX_SEGMENT) { + return blockState; + } + + // We need to convert the segmented block to a garden block + // and then add the flower variant to it. + BlockState newBlockState = ModBlocks.TINY_GARDEN_BLOCK.get().defaultBlockState() + .setValue(TinyGardenBlock.FACING, blockState.getValue(BlockStateProperties.HORIZONTAL_FACING)); + + TinyFlowerData originalSegmentedData = TinyFlowerData.findByOriginalBlock(registryAccess, currentBlock); + if (originalSegmentedData == null) { + // The previous block was segmentable, but doesn't have a tiny flower variant + // registered. + return blockState; + } + if (!originalSegmentedData.canSurviveOn(level, supportingPos)) { + // This only happens if the original segmentable block was on a block that the + // tiny flower doesn't support. + return blockState; + } + + // Since we also need to update the entity, try to update the world now. + level.setBlockAndUpdate(blockPos, newBlockState); + if (!(level.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, try undo the change + level.setBlockAndUpdate(blockPos, blockState); + return blockState; + } + + gardenBlockEntity.setFromPreviousBlockState(registryAccess, blockState); + gardenBlockEntity.addFlower(flowerData.id()); + + // Consume item, play sound, and send game event. + Player player = blockPlaceContext.getPlayer(); + SoundType soundType = blockState.getSoundType(); + level.playSound(player, blockPos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, blockPos, GameEvent.Context.of(player, blockState)); + stack.consume(1, player); + + return newBlockState; + } else { + // Item is a valid tiny flower block item, but there's no block yet. + // Place a new garden with the flower variant. + return this.defaultBlockState() + .setValue(FACING, blockPlaceContext.getHorizontalDirection().getOpposite()); + } + } + + @Override + protected void randomTick(@NonNull BlockState state, @NonNull ServerLevel world, @NonNull BlockPos pos, @NonNull RandomSource random) { + TransformHelper.doTransformTick(state, world, pos, random, true); + + super.randomTick(state, world, pos, random); + } + + @Override + protected void tick(@NonNull BlockState state, @NonNull ServerLevel world, @NonNull BlockPos pos, @NonNull RandomSource random) { + TransformHelper.doTransformTick(state, world, pos, random, false); + + super.tick(state, world, pos, random); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public boolean isBonemealSuccess(Level level, @NonNull RandomSource randomSource, @NonNull BlockPos pos, @NonNull BlockState blockState) { + return level.getBlockEntity(pos) instanceof TinyGardenBlockEntity; + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, @NonNull BlockPos pos, @NonNull BlockState blockState) { + return level.getBlockEntity(pos) instanceof TinyGardenBlockEntity; + } + + @Override + public void performBonemeal(ServerLevel serverLevel, @NonNull RandomSource randomSource, @NonNull BlockPos pos, + @NonNull BlockState blockState) { + if (!(serverLevel.getBlockEntity(pos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + return; + } + + List flowers = gardenBlockEntity.getFlowers(); + if (flowers.isEmpty()) { + TinyFlowers.LOGGER.warn("Tried to grow empty space in garden block"); + return; + } + + Identifier randomId = Util.getRandom(flowers, randomSource); + + // Try add flow to garden, otherwise pop an item out. + if (!gardenBlockEntity.addFlower(randomId)) { + // Drop an item based on the variants in the garden. At this stage we can assume + // that the garden is full. + ItemStack stack = new ItemStack( + BuiltInRegistries.ITEM.wrapAsHolder(ModItems.TINY_FLOWER_ITEM.get()), + 4, + DataComponentPatch.builder() + .set(ModComponents.TINY_FLOWER.get(), new TinyFlowerComponent(randomId)) + .build()); + + popResource(serverLevel, pos, stack); + } + } + + protected boolean propagatesSkylightDown(BlockState blockState) { + return blockState.getFluidState().isEmpty(); + } + + protected boolean isPathfindable(@NonNull BlockState blockState, @NonNull PathComputationType pathComputationType) { + return pathComputationType == PathComputationType.AIR && !this.hasCollision ? true + : super.isPathfindable(blockState, pathComputationType); + } + + @Override + protected @NonNull ItemStack getCloneItemStack(@NonNull LevelReader levelReader, @NonNull BlockPos blockPos, @NonNull BlockState blockState, + boolean includeData) { + if (includeData) { + return super.getCloneItemStack(levelReader, blockPos, blockState, includeData); + } + + if (!(levelReader.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, don't pick anything. + return ItemStack.EMPTY; + } + + List flowers = gardenBlockEntity.getFlowers(); + for (Identifier id : flowers) { + TinyFlowerData flowerData = TinyFlowerData.findById(levelReader.registryAccess(), id); + if (flowerData != null) { + return flowerData.getItemStack(1); + } + } + + return ItemStack.EMPTY; + } + + private static boolean hasFreeSpace(BlockGetter world, BlockPos pos) { + if (!(world.getBlockEntity(pos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, try prevent anything from trying to write to it + return false; + } + + return gardenBlockEntity.getFlower(1) == null || + gardenBlockEntity.getFlower(2) == null || + gardenBlockEntity.getFlower(3) == null || + gardenBlockEntity.getFlower(4) == null; + } + + /** + * Since there can be "holes" in the variants, this creates a tiny bitmap of + * which positions has flowers. This is useful is for the memoisation during + * hitbox creation, as keeping the number of cache entries down for that + * is important. + */ + private static int getFlowerBitmap(BlockGetter world, BlockPos pos) { + if (!(world.getBlockEntity(pos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + return -1; + } + + return (gardenBlockEntity.getFlower(1) != null ? 1 : 0) + + (gardenBlockEntity.getFlower(2) != null ? 2 : 0) + + (gardenBlockEntity.getFlower(3) != null ? 4 : 0) + + (gardenBlockEntity.getFlower(4) != null ? 8 : 0); + } + + @Override + protected @NonNull MapCodec codec() { + return CODEC; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NonNull BlockPos pos, @NonNull BlockState state) { + return new TinyGardenBlockEntity(pos, state); + } + +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/block/entity/ModBlockEntities.java b/common/src/main/java/co/secretonline/tinyflowers/block/entity/ModBlockEntities.java new file mode 100644 index 00000000..4a707ca9 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/block/entity/ModBlockEntities.java @@ -0,0 +1,20 @@ +package co.secretonline.tinyflowers.block.entity; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.platform.Services; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.entity.BlockEntityType; + +import java.util.function.Supplier; + +public class ModBlockEntities { + public static final Supplier> TINY_GARDEN_BLOCK_ENTITY = Services.REGISTRY.register( + BuiltInRegistries.BLOCK_ENTITY_TYPE, + TinyFlowers.id("tiny_garden"), + () -> Services.PLATFORM_REGISTRATION + .createBlockEntityType(TinyGardenBlockEntity::new, ModBlocks.TINY_GARDEN_BLOCK.get())); + + public static void initialize() { + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/block/entity/TinyGardenBlockEntity.java b/common/src/main/java/co/secretonline/tinyflowers/block/entity/TinyGardenBlockEntity.java new file mode 100644 index 00000000..f26a910b --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/block/entity/TinyGardenBlockEntity.java @@ -0,0 +1,242 @@ +package co.secretonline.tinyflowers.block.entity; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import org.jetbrains.annotations.Nullable; + +import co.secretonline.tinyflowers.item.component.GardenContentsComponent; +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.data.Survivable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.component.DataComponentGetter; +import net.minecraft.core.component.DataComponentMap.Builder; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SegmentableBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; +import org.jspecify.annotations.NonNull; + +public class TinyGardenBlockEntity extends BlockEntity implements Survivable { + public static final int NUM_SLOTS = 4; + + @Nullable + private Identifier flower1 = null; + @Nullable + private Identifier flower2 = null; + @Nullable + private Identifier flower3 = null; + @Nullable + private Identifier flower4 = null; + + public TinyGardenBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.TINY_GARDEN_BLOCK_ENTITY.get(), pos, state); + } + + public List getFlowers() { + List list = new ArrayList<>(NUM_SLOTS); + + if (flower1 != null) { + list.add(flower1); + } + if (flower2 != null) { + list.add(flower2); + } + if (flower3 != null) { + list.add(flower3); + } + if (flower4 != null) { + list.add(flower4); + } + + return list; + } + + @Override + public boolean canSurviveOn(LevelReader level, BlockPos pos) { + for (Identifier identifier : this.getFlowers()) { + TinyFlowerData flowerData = TinyFlowerData.findById(level.registryAccess(), identifier); + if (flowerData == null) { + continue; + } + + if (!flowerData.canSurviveOn(level, pos)) { + return false; + } + } + + return true; + } + + @Nullable + public Identifier getFlower(int index) { + return switch (index) { + case 1 -> flower1; + case 2 -> flower2; + case 3 -> flower3; + case 4 -> flower4; + default -> throw new IndexOutOfBoundsException(index); + }; + } + + public void setFlower(int index, @Nullable Identifier id) { + switch (index) { + case 1: + flower1 = id; + break; + case 2: + flower2 = id; + break; + case 3: + flower3 = id; + break; + case 4: + flower4 = id; + break; + default: + throw new IndexOutOfBoundsException(index); + } + + this.markUpdated(); + } + + public boolean addFlower(Identifier newId) { + if (flower1 == null) { + setFlower(1, newId); + return true; + } + if (flower2 == null) { + setFlower(2, newId); + return true; + } + if (flower3 == null) { + setFlower(3, newId); + return true; + } + if (flower4 == null) { + setFlower(4, newId); + return true; + } + + return false; + } + + public boolean isEmpty() { + return flower1 == null && + flower2 == null && + flower3 == null && + flower4 == null; + } + + public boolean isFull() { + return flower1 != null && + flower2 != null && + flower3 != null && + flower4 != null; + } + + @Override + protected void saveAdditional(@NonNull ValueOutput writeView) { + super.saveAdditional(writeView); + + writeView.storeNullable("flower_1", Identifier.CODEC, flower1); + writeView.storeNullable("flower_2", Identifier.CODEC, flower2); + writeView.storeNullable("flower_3", Identifier.CODEC, flower3); + writeView.storeNullable("flower_4", Identifier.CODEC, flower4); + } + + @Override + protected void loadAdditional(@NonNull ValueInput readView) { + super.loadAdditional(readView); + + flower1 = readView.read("flower_1", Identifier.CODEC).orElse(null); + flower2 = readView.read("flower_2", Identifier.CODEC).orElse(null); + flower3 = readView.read("flower_3", Identifier.CODEC).orElse(null); + flower4 = readView.read("flower_4", Identifier.CODEC).orElse(null); + } + + @Override + public @NonNull CompoundTag getUpdateTag(HolderLookup.@NonNull Provider registryLookup) { + return saveWithoutMetadata(registryLookup); + } + + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + protected void applyImplicitComponents(@NonNull DataComponentGetter dataComponentGetter) { + super.applyImplicitComponents(dataComponentGetter); + + GardenContentsComponent gardenComponent = dataComponentGetter.get(ModComponents.GARDEN_CONTENTS.get()); + if (gardenComponent != null) { + setFlower(1, gardenComponent.flower1()); + setFlower(2, gardenComponent.flower2()); + setFlower(3, gardenComponent.flower3()); + setFlower(4, gardenComponent.flower4()); + } else { + TinyFlowerComponent itemComponent = dataComponentGetter.get(ModComponents.TINY_FLOWER.get()); + if (itemComponent != null) { + addFlower(itemComponent.id()); + } + } + } + + @Override + protected void collectImplicitComponents(@NonNull Builder builder) { + super.collectImplicitComponents(builder); + + builder.set(ModComponents.GARDEN_CONTENTS.get(), new GardenContentsComponent(flower1, flower2, flower3, flower4)); + } + + @Override + public void removeComponentsFromTag(ValueOutput valueOutput) { + valueOutput.discard("flower1"); + valueOutput.discard("flower2"); + valueOutput.discard("flower3"); + valueOutput.discard("flower4"); + } + + private void markUpdated() { + this.setChanged(); + Level level = this.getLevel(); + if (level != null) { + level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + } + } + + public boolean setFromPreviousBlockState(RegistryAccess registryAccess, BlockState state) { + Block block = state.getBlock(); + + TinyFlowerData tinyFlowerData = TinyFlowerData.findByOriginalBlock(registryAccess, block); + if (tinyFlowerData == null) { + return false; + } + + Identifier id = tinyFlowerData.id(); + int amount = block instanceof SegmentableBlock segmentedBlock + ? state.getValue(segmentedBlock.getSegmentAmountProperty()) + : NUM_SLOTS; + + setFlower(1, amount >= 1 ? id : null); + setFlower(2, amount >= 2 ? id : null); + setFlower(3, amount >= 3 ? id : null); + setFlower(4, amount >= 4 ? id : null); + + return true; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/ModRegistries.java b/common/src/main/java/co/secretonline/tinyflowers/data/ModRegistries.java new file mode 100644 index 00000000..f1ce0656 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/ModRegistries.java @@ -0,0 +1,10 @@ +package co.secretonline.tinyflowers.data; + +import co.secretonline.tinyflowers.TinyFlowers; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; + +public class ModRegistries { + public static final ResourceKey> TINY_FLOWER = ResourceKey + .createRegistryKey(TinyFlowers.id("tiny_flower")); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/Survivable.java b/common/src/main/java/co/secretonline/tinyflowers/data/Survivable.java new file mode 100644 index 00000000..98773be3 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/Survivable.java @@ -0,0 +1,8 @@ +package co.secretonline.tinyflowers.data; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; + +public interface Survivable { + boolean canSurviveOn(LevelReader level, BlockPos pos); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/TinyFlowerData.java b/common/src/main/java/co/secretonline/tinyflowers/data/TinyFlowerData.java new file mode 100644 index 00000000..ad8cfe9c --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/TinyFlowerData.java @@ -0,0 +1,192 @@ +package co.secretonline.tinyflowers.data; + +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +import co.secretonline.tinyflowers.data.behavior.SturdyPlacementBehavior; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import co.secretonline.tinyflowers.data.behavior.Behavior; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.util.ExtraCodecs.TagOrElementLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.SuspiciousStewEffects; +import net.minecraft.world.item.component.SuspiciousStewEffects.Entry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SuspiciousEffectHolder; + +/** + * Data for a tiny flower variant. + * + * @param id A unique identifier for this vatiant. Usually matches + * the pack namespace and file name. Used for getting + * textures, models, and other things. + * @param originalId The original plant block that is used to create the + * tiny flowers. + * @param isSegmentable Whether an entry is for a block that implements + * {@link net.minecraft.world.level.block.SegmentableBlock + * SegmentableBlock}. This flag affects the behaviour of + * the + * mod in the following ways: + *

    + *
  • Using Florists' Shears on a Tiny Garden with this + * variant will pop the original item, rather than a Tiny + * Flower item. + *
  • The data generation will not create a crafting + * recipe + * for creating Tiny Flowers of this type, as the item + * already exists. + *
+ * @param canSurviveOn Block IDs or #-prefixed tags for what blocks this + * flower + * type can be placed on. This defaults to the + * `#minecraft:supports_vegetation` tag. + * @param suspiciousStewEffects A potion effect for Suspicious Stew. + * @param behaviors Any special features this flower type might have. + */ +public record TinyFlowerData(Identifier id, Identifier originalId, boolean isSegmentable, + @NonNull List canSurviveOn, + @NonNull List suspiciousStewEffects, + @NonNull List behaviors) + implements SuspiciousEffectHolder, Survivable { + + public boolean canSurviveOn(LevelReader level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + + for (Behavior behavior : behaviors) { + if (behavior instanceof SturdyPlacementBehavior && state.isFaceSturdy(level, pos, Direction.UP)) { + return true; + } + } + + Block block = state.getBlock(); + Holder blockHolder = BuiltInRegistries.BLOCK.wrapAsHolder(block); + + for (TagOrElementLocation tagOrElementLocation : canSurviveOn) { + Identifier id = tagOrElementLocation.id(); + if (tagOrElementLocation.tag()) { + if (blockHolder.is(TagKey.create(Registries.BLOCK, id))) { + return true; + } + } else { + if (blockHolder.is(id)) { + return true; + } + } + } + + return false; + } + + @Override + public @NonNull SuspiciousStewEffects getSuspiciousEffects() { + if (this.suspiciousStewEffects() == null) { + return new SuspiciousStewEffects(List.of()); + } + + return new SuspiciousStewEffects(this.suspiciousStewEffects()); + } + + public ItemStack getItemStack(int count) { + // For existing segmented-like flower types, just pop one of those items + // instead. + if (isSegmentable()) { + Optional> item = BuiltInRegistries.ITEM.get(this.originalId); + if (item.isEmpty()) { + // Since this mod is data driven, it's possible that a garden block or tiny + // flower item refers to a flower type that no longer exists (i.e. from a mod + // that has been removed). In this case, pop nothing. + return ItemStack.EMPTY; + } + + return new ItemStack(item.get(), count); + } + + return new ItemStack( + BuiltInRegistries.ITEM.wrapAsHolder(ModItems.TINY_FLOWER_ITEM.get()), + count, + DataComponentPatch.builder() + .set(ModComponents.TINY_FLOWER.get(), new TinyFlowerComponent(this.id())) + .build()); + } + + @Nullable + private static TinyFlowerData ofPredicate(HolderLookup.Provider provider, Predicate predicate) { + return provider.lookupOrThrow(ModRegistries.TINY_FLOWER) + .listElements() + .map(ref -> ref.value()) + .filter(predicate) + .findFirst() + .orElse(null); + } + + @Nullable + public static TinyFlowerData findByOriginalBlock(HolderLookup.Provider provider, Block block) { + return ofPredicate(provider, + flowerData -> flowerData.originalId().equals(BuiltInRegistries.BLOCK.getKey(block))); + } + + @Nullable + public static TinyFlowerData findById(HolderLookup.Provider provider, Identifier id) { + return ofPredicate(provider, flowerData -> flowerData.id().equals(id)); + } + + @Nullable + public static TinyFlowerData findByItemStack(HolderLookup.Provider provider, ItemStack itemStack) { + var key = BuiltInRegistries.ITEM.getKey(itemStack.getItem()); + + return ofPredicate(provider, flowerData -> { + if (flowerData.isSegmentable()) { + // If the block is already segmented, then just check the original block ID. + return key.equals(flowerData.originalId()); + } + + // Ensure the item stack has the right component. + // This does mean that items other than this mod's Tiny Flower item will trigger + // this, but I think that's fine. If someone has gone out of their way to add + // the component to their item, then they probably wanted it to happen. + TinyFlowerComponent component = itemStack.get(ModComponents.TINY_FLOWER.get()); + if (component == null) { + return false; + } + + return component.id().equals(flowerData.id()); + }); + } + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Identifier.CODEC.fieldOf("id").forGetter(TinyFlowerData::id), + Identifier.CODEC.fieldOf("original_id").forGetter(TinyFlowerData::originalId), + Codec.BOOL.optionalFieldOf("is_segmented", false).forGetter(TinyFlowerData::isSegmentable), + ExtraCodecs.TAG_OR_ELEMENT_ID.listOf() + .optionalFieldOf("can_survive_on", + List.of(new TagOrElementLocation(BlockTags.SUPPORTS_VEGETATION.location(), true))) + .forGetter(TinyFlowerData::canSurviveOn), + Entry.CODEC.listOf().optionalFieldOf("suspicious_stew_effects", List.of()) + .forGetter(TinyFlowerData::suspiciousStewEffects), + Behavior.CODEC.listOf().optionalFieldOf("behaviors", List.of()) + .forGetter(TinyFlowerData::behaviors)) + .apply(instance, TinyFlowerData::new)); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/TinyFlowerResources.java b/common/src/main/java/co/secretonline/tinyflowers/data/TinyFlowerResources.java new file mode 100644 index 00000000..daf2dfb6 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/TinyFlowerResources.java @@ -0,0 +1,41 @@ +package co.secretonline.tinyflowers.data; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.resources.Identifier; +import net.minecraft.util.StringRepresentable; +import org.jspecify.annotations.NonNull; + +public record TinyFlowerResources(Identifier id, Identifier itemModel, + TintSource tintSource, + Identifier model1, Identifier model2, Identifier model3, Identifier model4) { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Identifier.CODEC.fieldOf("id").forGetter(TinyFlowerResources::id), + Identifier.CODEC.fieldOf("item_model").forGetter(TinyFlowerResources::itemModel), + TintSource.CODEC.optionalFieldOf("tint_source", TintSource.GRASS).forGetter(TinyFlowerResources::tintSource), + Identifier.CODEC.fieldOf("model1").forGetter(TinyFlowerResources::model1), + Identifier.CODEC.fieldOf("model2").forGetter(TinyFlowerResources::model2), + Identifier.CODEC.fieldOf("model3").forGetter(TinyFlowerResources::model3), + Identifier.CODEC.fieldOf("model4").forGetter(TinyFlowerResources::model4)) + .apply(instance, TinyFlowerResources::new)); + + public enum TintSource implements StringRepresentable { + GRASS("grass"), + DRY_FOLIAGE("dry_foliage"); + + private final String name; + + TintSource(String name) { + this.name = name; + } + + @Override + public @NonNull String getSerializedName() { + return this.name; + } + + public static final Codec CODEC = StringRepresentable.fromEnum(TintSource::values); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/behavior/Behavior.java b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/Behavior.java new file mode 100644 index 00000000..59c9255a --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/Behavior.java @@ -0,0 +1,30 @@ +package co.secretonline.tinyflowers.data.behavior; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; + +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; + +public interface Behavior { + boolean shouldActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel world, BlockPos pos, RandomSource random); + + void onActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel world, BlockPos pos, RandomSource random); + + boolean hasWorldEffect(); + + void doWorldEffect(ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, boolean isRandomTick); + + MapCodec getMapCodec(); + + Codec CODEC = new ExtraCodecs.LateBoundIdMapper>() + .put("transform_day_night", TransformDayNightBehavior.MAP_CODEC) + .put("transform_weather", TransformWeatherBehavior.MAP_CODEC) + .put("sturdy_placement", SturdyPlacementBehavior.MAP_CODEC) + .codec(Codec.STRING) + .dispatch(Behavior::getMapCodec, (mapCodec) -> mapCodec); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/behavior/SturdyPlacementBehavior.java b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/SturdyPlacementBehavior.java new file mode 100644 index 00000000..ab8a4c66 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/SturdyPlacementBehavior.java @@ -0,0 +1,43 @@ +package co.secretonline.tinyflowers.data.behavior; + +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; + +/** + * @param isReallyCool Does nothing, is only here because I couldn't be bothered messing with Codecs. + */ +public record SturdyPlacementBehavior(boolean isReallyCool) implements Behavior { + @Override + public boolean shouldActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + return false; + } + + @Override + public void onActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + } + + @Override + public boolean hasWorldEffect() { + return false; + } + + @Override + public void doWorldEffect(ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, boolean isRandomTick) { + } + + public static final MapCodec MAP_CODEC = RecordCodecBuilder + .mapCodec(instance -> instance + .group( + Codec.BOOL.optionalFieldOf("is_really_cool", true).forGetter(SturdyPlacementBehavior::isReallyCool)) + .apply(instance, SturdyPlacementBehavior::new)); + + public MapCodec getMapCodec() { + return MAP_CODEC; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/behavior/TransformDayNightBehavior.java b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/TransformDayNightBehavior.java new file mode 100644 index 00000000..2db89d44 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/TransformDayNightBehavior.java @@ -0,0 +1,129 @@ +package co.secretonline.tinyflowers.data.behavior; + +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.TrailParticleOption; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.util.StringRepresentable; +import net.minecraft.util.TriState; +import net.minecraft.world.attribute.EnvironmentAttributes; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.NonNull; + +import java.util.Optional; + +/** + * @param when When this tiny flower will transform into + * another type. + * @param turnsInto The identifier of the flower type this one + * will transform into. + * @param particleColor Color of particle to spawn when transforming. + * Set to 0 to disable. + * @param soundEventLong The sound event to play when the change is + * triggered by a random tick. This is referred + * to as the long switch sound by Minecraft. + * @param soundEventShort The sound event to play when the change is + * triggered by a scheduled tick. This is + * referred to as the short switch sound by + * Minecraft. + */ +public record TransformDayNightBehavior(When when, Identifier turnsInto, Integer particleColor, + Optional soundEventLong, + Optional soundEventShort) implements Behavior { + + @Override + public boolean shouldActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + TriState openTriState = level.environmentAttributes().getValue(EnvironmentAttributes.EYEBLOSSOM_OPEN, pos); + if (openTriState == TriState.DEFAULT) { + return false; + } + + return this.when().shouldChange(openTriState); + } + + @Override + public void onActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + entity.setFlower(index, this.turnsInto()); + } + + @Override + public boolean hasWorldEffect() { + return !(this.particleColor == 0 && + this.soundEventShort.isEmpty() && + this.soundEventLong.isEmpty()); + } + + @Override + public void doWorldEffect(ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, boolean isRandomTick) { + if (this.particleColor != 0) { + Vec3 center = blockPos.getCenter(); + double scale = 0.5 + randomSource.nextDouble(); + Vec3 random = new Vec3(randomSource.nextDouble() - 0.5, randomSource.nextDouble() + 1.0, + randomSource.nextDouble() - 0.5); + Vec3 position = center.add(random.scale(scale)); + TrailParticleOption trailParticleOption = new TrailParticleOption(position, this.particleColor, + (int) (20.0 * scale)); + serverLevel.sendParticles(trailParticleOption, center.x, center.y, center.z, 1, 0.0, 0.0, 0.0, 0.0); + } + + Optional soundEventId = isRandomTick ? this.soundEventLong : this.soundEventShort; + soundEventId.flatMap(BuiltInRegistries.SOUND_EVENT::getOptional) + .ifPresent(event -> serverLevel.playSound(null, blockPos, event, SoundSource.BLOCKS, 1.0F, 1.0F)); + } + + public static final MapCodec MAP_CODEC = RecordCodecBuilder + .mapCodec(instance -> instance + .group( + When.CODEC.fieldOf("when").forGetter(TransformDayNightBehavior::when), + Identifier.CODEC.fieldOf("turns_into").forGetter(TransformDayNightBehavior::turnsInto), + Codec.INT.optionalFieldOf("particle_color", 0).forGetter(TransformDayNightBehavior::particleColor), + Identifier.CODEC.optionalFieldOf("sound_event_long") + .forGetter(TransformDayNightBehavior::soundEventLong), + Identifier.CODEC.optionalFieldOf("sound_event_short") + .forGetter(TransformDayNightBehavior::soundEventShort)) + .apply(instance, TransformDayNightBehavior::new)); + + public MapCodec getMapCodec() { + return MAP_CODEC; + } + + public enum When implements StringRepresentable { + ALWAYS("always", TriState.DEFAULT), + DAY("day", TriState.FALSE), + NIGHT("night", TriState.TRUE); + + private final String name; + private final TriState eyeblossomOpen; + + When(String name, TriState eyeblossomOpen) { + this.name = name; + this.eyeblossomOpen = eyeblossomOpen; + } + + @Override + public @NonNull String getSerializedName() { + return this.name; + } + + public boolean shouldChange(TriState eyeblossomOpen) { + if (this.equals(ALWAYS)) { + return true; + } + if (eyeblossomOpen.equals(TriState.DEFAULT)) { + return false; + } + + return this.eyeblossomOpen.equals(eyeblossomOpen); + } + + public static final Codec CODEC = StringRepresentable.fromEnum(When::values); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/data/behavior/TransformWeatherBehavior.java b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/TransformWeatherBehavior.java new file mode 100644 index 00000000..8ed7f66b --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/data/behavior/TransformWeatherBehavior.java @@ -0,0 +1,131 @@ +package co.secretonline.tinyflowers.data.behavior; + +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.TrailParticleOption; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.NonNull; + +import java.util.Optional; + +/** + * @param when When this tiny flower will transform into + * another type. + * @param turnsInto The identifier of the flower type this one + * will transform into. + * @param particleColor Color of particle to spawn when transforming. + * Set to 0 to disable. + * @param soundEventLong The sound event to play when the change is + * triggered by a random tick. This is referred + * to as the long switch sound by Minecraft. + * @param soundEventShort The sound event to play when the change is + * triggered by a scheduled tick. This is + * referred to as the short switch sound by + * Minecraft. + */ +public record TransformWeatherBehavior(When when, Identifier turnsInto, Integer particleColor, + Optional soundEventLong, + Optional soundEventShort) implements Behavior { + + @Override + public boolean shouldActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + return this.when().shouldChange(level, pos); + } + + @Override + public void onActivate(TinyGardenBlockEntity entity, int index, BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + entity.setFlower(index, this.turnsInto()); + } + + @Override + public boolean hasWorldEffect() { + return !(this.particleColor == 0 && + this.soundEventShort.isEmpty() && + this.soundEventLong.isEmpty()); + } + + @Override + public void doWorldEffect(ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, boolean isRandomTick) { + if (this.particleColor != 0) { + Vec3 center = blockPos.getCenter(); + double scale = 0.5 + randomSource.nextDouble(); + Vec3 random = new Vec3(randomSource.nextDouble() - 0.5, randomSource.nextDouble() + 1.0, + randomSource.nextDouble() - 0.5); + Vec3 position = center.add(random.scale(scale)); + TrailParticleOption trailParticleOption = new TrailParticleOption(position, this.particleColor, + (int) (20.0 * scale)); + serverLevel.sendParticles(trailParticleOption, center.x, center.y, center.z, 1, 0.0, 0.0, 0.0, 0.0); + } + + Optional soundEventId = isRandomTick ? this.soundEventLong : this.soundEventShort; + soundEventId.flatMap(BuiltInRegistries.SOUND_EVENT::getOptional) + .ifPresent(event -> serverLevel.playSound(null, blockPos, event, SoundSource.BLOCKS, 1.0F, 1.0F)); + } + + public static final MapCodec MAP_CODEC = RecordCodecBuilder + .mapCodec(instance -> instance + .group( + When.CODEC.fieldOf("when").forGetter(TransformWeatherBehavior::when), + Identifier.CODEC.fieldOf("turns_into").forGetter(TransformWeatherBehavior::turnsInto), + Codec.INT.optionalFieldOf("particle_color", 0).forGetter(TransformWeatherBehavior::particleColor), + Identifier.CODEC.optionalFieldOf("sound_event_long") + .forGetter(TransformWeatherBehavior::soundEventLong), + Identifier.CODEC.optionalFieldOf("sound_event_short") + .forGetter(TransformWeatherBehavior::soundEventShort)) + .apply(instance, TransformWeatherBehavior::new)); + + public MapCodec getMapCodec() { + return MAP_CODEC; + } + + public enum When implements StringRepresentable { + ALWAYS("always"), + RAINING("raining"), + THUNDERING("thundering"), + RAINING_ON("raining_on"), + SNOWING_ON("snowing_on"); + + private final String name; + + When(String name) { + this.name = name; + } + + @Override + public @NonNull String getSerializedName() { + return this.name; + } + + public boolean shouldChange(ServerLevel level, BlockPos pos) { + if (!level.canHaveWeather()) { + return false; + } + + if (this.equals(ALWAYS)) { + return true; + } + + if ((this.equals(RAINING) && level.isRaining()) || + (this.equals(THUNDERING) && level.isThundering())) { + return true; + } + + Biome.Precipitation weatherAtPos = level.precipitationAt(pos); + return (this.equals(RAINING_ON) && weatherAtPos.equals(Biome.Precipitation.RAIN)) || + (this.equals(SNOWING_ON) && weatherAtPos.equals(Biome.Precipitation.SNOW)); + } + + public static final Codec CODEC = StringRepresentable.fromEnum(When::values); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/Flower.java b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/Flower.java new file mode 100644 index 00000000..482b6776 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/Flower.java @@ -0,0 +1,370 @@ +package co.secretonline.tinyflowers.datagen.mods; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import co.secretonline.tinyflowers.data.TinyFlowerResources.TintSource; +import co.secretonline.tinyflowers.data.behavior.Behavior; +import co.secretonline.tinyflowers.data.behavior.SturdyPlacementBehavior; +import co.secretonline.tinyflowers.data.behavior.TransformDayNightBehavior; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.client.data.models.model.ModelInstance; +import net.minecraft.client.data.models.model.TextureSlot; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.util.ExtraCodecs.TagOrElementLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.item.component.SuspiciousStewEffects.Entry; +import net.minecraft.world.level.block.Block; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.*; +import java.util.function.BiConsumer; + +public class Flower { + private static final String MOD_ID_PREFIX = TinyFlowers.MOD_ID + "/"; + private static final String BLOCK_MOD_PREFIX = "block/" + MOD_ID_PREFIX; + + @NonNull + private final Identifier id; + @NonNull + private final Identifier itemTexture; + @NonNull + private final Identifier originalBlockId; + private final boolean isSegmentable; + + @NonNull + private final List suspiciousStewEffects; + @NonNull + private final List canSurviveOn; + @NonNull + private final TintSource tintSource; + @NonNull + private final List behaviors; + + @NonNull + private final ModelPart modelPart1; + @NonNull + private final ModelPart modelPart2; + @NonNull + private final ModelPart modelPart3; + @NonNull + private final ModelPart modelPart4; + + private Flower(@NonNull Identifier id, @NonNull Identifier itemTexture, @NonNull Identifier originalBlockId, boolean isSegmentable, + @NonNull List suspiciousStewEffects, @NonNull List canSurviveOn, + @NonNull TintSource tintSource, @NonNull List behaviors, + @NonNull ModelPart modelPart1, @NonNull ModelPart modelPart2, @NonNull ModelPart modelPart3, @NonNull ModelPart modelPart4) { + this.id = id; + this.itemTexture = itemTexture; + this.originalBlockId = originalBlockId; + this.isSegmentable = isSegmentable; + + this.suspiciousStewEffects = suspiciousStewEffects; + this.canSurviveOn = canSurviveOn; + + this.tintSource = tintSource; + this.behaviors = behaviors; + + this.modelPart1 = modelPart1; + this.modelPart2 = modelPart2; + this.modelPart3 = modelPart3; + this.modelPart4 = modelPart4; + } + + public TinyFlowerData data() { + return new TinyFlowerData(id, originalBlockId, isSegmentable, canSurviveOn, suspiciousStewEffects, behaviors); + } + + public TinyFlowerResources resources() { + return new TinyFlowerResources(id, itemTexture, tintSource, + modelPart1.id().withPrefix(BLOCK_MOD_PREFIX), + modelPart2.id().withPrefix(BLOCK_MOD_PREFIX), + modelPart3.id().withPrefix(BLOCK_MOD_PREFIX), + modelPart4.id().withPrefix(BLOCK_MOD_PREFIX)); + } + + public ModelParts modelParts() { + return new ModelParts( + modelPart1, + modelPart2, + modelPart3, + modelPart4); + } + + public record ModelPart(Identifier id, Identifier parent, Map textures) { + + public JsonElement toJsonElement() { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("parent", parent.toString()); + if (!textures.isEmpty()) { + JsonObject texturesObject = new JsonObject(); + textures.forEach((textureSlot, identifier) -> texturesObject.addProperty(textureSlot, identifier.toString())); + jsonObject.add("textures", texturesObject); + } + + return jsonObject; + } + + public void outputModel(BiConsumer consumer) { + consumer.accept(id.withPrefix(BLOCK_MOD_PREFIX), this::toJsonElement); + } + } + + public record ModelParts(ModelPart part1, ModelPart part2, ModelPart part3, ModelPart part4) { + } + + public static class Builder { + private static final String FLOWERBED_MIDDLE = ("flowerbed_middle"); + private static final String FLOWERBED_UPPER = ("flowerbed_upper"); + + @Nullable + private Identifier id; + @Nullable + private Identifier itemTexture; + @Nullable + private Identifier originalBlockId; + private boolean isSegmentable = false; + @NonNull + private final List suspiciousStewEffects = new ArrayList<>(); + @NonNull + private List canSurviveOn = new ArrayList<>( + List.of(new TagOrElementLocation(BlockTags.SUPPORTS_VEGETATION.location(), true))); + @NonNull + private final List behaviors = new ArrayList<>(); + + private int layers = 0; + private boolean untintedStem = false; + @Nullable + private Identifier stemTexture = null; + @Nullable + private Identifier particleTexture = null; + @NonNull + private final Map textureMap = new HashMap<>(); + @Nullable + private Identifier customModel = null; + @NonNull + private TintSource tintSource = TintSource.GRASS; + + public static Builder ofCustom(Identifier id, Identifier originalBlockId) { + return new Builder() + .id(id) + .itemTexture(id) + .originalBlockId(originalBlockId) + .layers(id); + } + + public static Builder ofSegmented(Identifier originalBlockId) { + return new Builder() + .id(originalBlockId) + .itemTexture(originalBlockId) + .originalBlockId(originalBlockId) + .segmentable() + .layers(originalBlockId); + } + + public static Builder ofStandard(Identifier originalBlockId) { + Identifier id = originalBlockId.withPrefix("tiny_"); + + return new Builder() + .id(id) + .itemTexture(id) + .originalBlockId(originalBlockId) + .layers(id); + } + + public Builder id(Identifier id) { + this.id = id; + return this; + } + + public Builder originalBlockId(Identifier originalBlockId) { + this.originalBlockId = originalBlockId; + return this; + } + + public Builder segmentable() { + this.isSegmentable = true; + return this; + } + + public Builder stewEffect(Holder effect, int ticks) { + this.suspiciousStewEffects.add(new Entry(effect, ticks)); + return this; + } + + public Builder stewEffectSeconds(Holder effect, double seconds) { + return this.stewEffect(effect, Mth.floor(seconds * 20.0f)); + } + + public Builder replaceCanSurviveOn(TagOrElementLocation... canSurviveOn) { + this.canSurviveOn = new ArrayList<>(Arrays.asList(canSurviveOn)); + return this; + } + + public Builder addCanSurviveOn(TagOrElementLocation... canSurviveOn) { + this.canSurviveOn.addAll(Arrays.asList(canSurviveOn)); + return this; + } + + public Builder addCanSurviveOn(Block... blocks) { + for (Block block : blocks) { + var id = BuiltInRegistries.BLOCK.getKey(block); + this.canSurviveOn.add(new TagOrElementLocation(id, false)); + } + return this; + } + + @SafeVarargs + public final Builder addCanSurviveOn(TagKey... tags) { + for (TagKey tag : tags) { + this.canSurviveOn.add(new TagOrElementLocation(tag.location(), true)); + } + return this; + } + + public Builder itemTexture(Identifier itemTexture) { + this.itemTexture = itemTexture.withPrefix("item/"); + return this; + } + + public Builder layers(Identifier flowerbedTexture) { + layers = 1; + textureMap.put(TextureSlot.FLOWERBED.getId(), flowerbedTexture.withPrefix("block/")); + + return this; + } + + public Builder layers(Identifier lowerTexture, Identifier upperTexture) { + layers = 2; + textureMap.put(TextureSlot.FLOWERBED.getId(), lowerTexture.withPrefix("block/")); + textureMap.put(FLOWERBED_UPPER, upperTexture.withPrefix("block/")); + + return this; + } + + public Builder layers(Identifier lowerTexture, Identifier middleTexture, Identifier upperTexture) { + layers = 3; + textureMap.put(TextureSlot.FLOWERBED.getId(), lowerTexture.withPrefix("block/")); + textureMap.put(FLOWERBED_MIDDLE, middleTexture.withPrefix("block/")); + textureMap.put(FLOWERBED_UPPER, upperTexture.withPrefix("block/")); + + return this; + } + + public Builder untintedStem() { + this.untintedStem = true; + return this; + } + + public Builder stemTexture(Identifier stemTexture) { + this.stemTexture = stemTexture.withPrefix("block/"); + return this; + } + + public Builder particleTexture(Identifier particleTexture) { + this.particleTexture = particleTexture.withPrefix("block/"); + return this; + } + + public Builder customModel(Identifier model) { + this.customModel = model.withPrefix("block/"); + return this; + } + + public Builder tintSource(TintSource tintSource) { + this.tintSource = tintSource; + return this; + } + + public Builder addTransformDayNightBehavior(TransformDayNightBehavior.When when, Identifier turnsInto) { + return this.addTransformDayNightBehavior(when, turnsInto, 0, null, null); + } + + public Builder addTransformDayNightBehavior(TransformDayNightBehavior.When when, Identifier turnsInto, + int particleColor, @Nullable SoundEvent soundEventLong, @Nullable SoundEvent soundEventShort) { + Optional longOptional = (soundEventLong == null ? Optional.empty() + : Optional.of(soundEventLong.location())); + Optional shortOptional = (soundEventShort == null ? Optional.empty() + : Optional.of(soundEventShort.location())); + + this.behaviors.add(new TransformDayNightBehavior(when, turnsInto, particleColor, + longOptional, shortOptional)); + + return this; + } + + public Builder addSturdyPlacementBehavior() { + this.behaviors.add(new SturdyPlacementBehavior(true)); + + return this; + } + + public Flower build() { + if (layers == 0 && customModel == null) { + throw new Error("TinyFlowerResources.Builder: layers() or special() must be called once."); + } + + if (id == null) { + throw new Error("TinyFlowerResources.Builder: id is null"); + } + if (itemTexture == null) { + throw new Error("TinyFlowerResources.Builder: itemTexture is null"); + } + if (originalBlockId == null) { + throw new Error("TinyFlowerResources.Builder: originalBlockId is null"); + } + + Identifier parentId = null; + if (customModel != null) { + parentId = customModel; + } else if (layers == 1) { + if (untintedStem) { + parentId = TinyFlowers.id("block/garden_untinted"); + } else { + parentId = TinyFlowers.id("block/garden"); + } + } else if (layers == 2) { + if (untintedStem) { + parentId = TinyFlowers.id("block/garden_double_untinted"); + } else { + parentId = TinyFlowers.id("block/garden_double"); + } + } else if (layers == 3) { + if (untintedStem) { + parentId = TinyFlowers.id("block/garden_triple_untinted"); + } else { + parentId = TinyFlowers.id("block/garden_triple"); + } + } + + if (parentId == null) { + parentId = TinyFlowers.id("block/garden"); + } + + if (this.stemTexture != null) { + textureMap.put("stem", this.stemTexture); + } + if (this.particleTexture != null) { + textureMap.put("particle", this.particleTexture); + } + + ModelPart modelPart1 = new ModelPart(id.withSuffix("_1"), parentId.withSuffix("_1"), textureMap); + ModelPart modelPart2 = new ModelPart(id.withSuffix("_2"), parentId.withSuffix("_2"), textureMap); + ModelPart modelPart3 = new ModelPart(id.withSuffix("_3"), parentId.withSuffix("_3"), textureMap); + ModelPart modelPart4 = new ModelPart(id.withSuffix("_4"), parentId.withSuffix("_4"), textureMap); + + return new Flower(id, itemTexture, originalBlockId, isSegmentable, + suspiciousStewEffects, canSurviveOn, tintSource, behaviors, + modelPart1, modelPart2, modelPart3, modelPart4 + ); + } + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/FlowerProvider.java b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/FlowerProvider.java new file mode 100644 index 00000000..38f5fec0 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/FlowerProvider.java @@ -0,0 +1,65 @@ +package co.secretonline.tinyflowers.datagen.mods; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import co.secretonline.tinyflowers.item.ModItems; +import co.secretonline.tinyflowers.renderer.item.TinyFlowerProperty; +import net.minecraft.client.data.models.ItemModelOutput; +import net.minecraft.client.data.models.model.ItemModelUtils; +import net.minecraft.client.data.models.model.ModelInstance; +import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.model.TextureMapping; +import net.minecraft.client.renderer.item.ItemModel; +import net.minecraft.client.renderer.item.SelectItemModel; +import net.minecraft.resources.Identifier; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +public abstract class FlowerProvider { + public abstract String getModId(); + + public abstract List getFlowers(); + + public void generateBlockStateModels(BiConsumer modelOutput) { + for (Flower tuple : this.getFlowers()) { + Flower.ModelParts models = tuple.modelParts(); + + models.part1().outputModel(modelOutput); + models.part2().outputModel(modelOutput); + models.part3().outputModel(modelOutput); + models.part4().outputModel(modelOutput); + } + } + + public void generateItemModels(ItemModelOutput itemModelOutput, BiConsumer modelOutput) { + List> list = this.getFlowers() + .stream() + .map(Flower::data) + .filter(flowerData -> !flowerData.isSegmentable()) + .map(flowerData -> ItemModelUtils.when( + new TinyFlowerComponent(flowerData.id()), + flatItemForIdentifier(flowerData.id(), modelOutput))) + .collect(Collectors.toList()); + + if (list.isEmpty()) { + return; + } + + itemModelOutput.accept(ModItems.TINY_FLOWER_ITEM.get(), + ItemModelUtils.select( + new TinyFlowerProperty(), + flatItemForIdentifier(TinyFlowers.id("tiny_garden"), modelOutput), + list)); + } + + private ItemModel.Unbaked flatItemForIdentifier(Identifier id, BiConsumer itemModelOutput) { + Identifier prefixed = id.withPrefix("item/"); + + return ItemModelUtils.plainModel(ModelTemplates.FLAT_ITEM.create( + prefixed, + TextureMapping.layer0(prefixed), + itemModelOutput)); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/TinyFlowersFlowerProvider.java b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/TinyFlowersFlowerProvider.java new file mode 100644 index 00000000..445c0ced --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/TinyFlowersFlowerProvider.java @@ -0,0 +1,121 @@ +package co.secretonline.tinyflowers.datagen.mods; + +import java.util.List; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.data.behavior.TransformDayNightBehavior.When; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.block.Blocks; + +public class TinyFlowersFlowerProvider extends FlowerProvider { + @Override + public String getModId() { + return TinyFlowers.MOD_ID; + } + + @Override + public List getFlowers() { + return List.of( + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_dandelion"), Identifier.withDefaultNamespace("dandelion")) + .stewEffectSeconds(MobEffects.SATURATION, 0.35) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_poppy"), Identifier.withDefaultNamespace("poppy")) + .stewEffectSeconds(MobEffects.NIGHT_VISION, 5.0) + .customModel(TinyFlowers.id("garden_tall")) + .stemTexture(TinyFlowers.id("tall_tiny_flower_stem")) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_blue_orchid"), Identifier.withDefaultNamespace("blue_orchid")) + .layers(TinyFlowers.id("tiny_blue_orchid"), + TinyFlowers.id("tiny_blue_orchid_upper")) + .stewEffectSeconds(MobEffects.SATURATION, 0.35) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_allium"), Identifier.withDefaultNamespace("allium")) + .stewEffectSeconds(MobEffects.FIRE_RESISTANCE, 3.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_azure_bluet"), Identifier.withDefaultNamespace("azure_bluet")) + .stewEffectSeconds(MobEffects.BLINDNESS, 11.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_red_tulip"), Identifier.withDefaultNamespace("red_tulip")) + .stewEffectSeconds(MobEffects.WEAKNESS, 7.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_orange_tulip"), Identifier.withDefaultNamespace("orange_tulip")) + .stewEffectSeconds(MobEffects.WEAKNESS, 7.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_white_tulip"), Identifier.withDefaultNamespace("white_tulip")) + .stewEffectSeconds(MobEffects.WEAKNESS, 7.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_pink_tulip"), Identifier.withDefaultNamespace("pink_tulip")) + .stewEffectSeconds(MobEffects.WEAKNESS, 7.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_oxeye_daisy"), Identifier.withDefaultNamespace("oxeye_daisy")) + .stewEffectSeconds(MobEffects.REGENERATION, 7.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_cornflower"), Identifier.withDefaultNamespace("cornflower")) + .stewEffectSeconds(MobEffects.JUMP_BOOST, 5.0) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_lily_of_the_valley"), Identifier.withDefaultNamespace("lily_of_the_valley")) + .stewEffectSeconds(MobEffects.POISON, 11.0) + .layers(TinyFlowers.id("tiny_lily_of_the_valley"), + TinyFlowers.id("tiny_lily_of_the_valley_upper")) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_torchflower"), Identifier.withDefaultNamespace("torchflower")) + .stewEffectSeconds(MobEffects.NIGHT_VISION, 5.0) + .layers(TinyFlowers.id("tiny_torchflower"), + TinyFlowers.id("tiny_torchflower_middle"), + TinyFlowers.id("tiny_torchflower_upper")) + .untintedStem() + .stemTexture(TinyFlowers.id("tiny_torchflower_stem")) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_closed_eyeblossom"), Identifier.withDefaultNamespace("closed_eyeblossom")) + .stewEffectSeconds(MobEffects.NAUSEA, 7.0) + .layers(TinyFlowers.id("tiny_closed_eyeblossom")) + .untintedStem() + .stemTexture(TinyFlowers.id("tiny_eyeblossom_stem")) + .addTransformDayNightBehavior(When.NIGHT, TinyFlowers.id("tiny_open_eyeblossom"), 16545810, + SoundEvents.EYEBLOSSOM_OPEN_LONG, SoundEvents.EYEBLOSSOM_OPEN) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_open_eyeblossom"), Identifier.withDefaultNamespace("open_eyeblossom")) + .stewEffectSeconds(MobEffects.BLINDNESS, 11.0) + .layers(TinyFlowers.id("tiny_open_eyeblossom"), + TinyFlowers.id("tiny_open_eyeblossom_upper")) + .customModel(TinyFlowers.id("garden_double_untinted_glow")) + .untintedStem() + .stemTexture(TinyFlowers.id("tiny_eyeblossom_stem")) + .addTransformDayNightBehavior(When.DAY, TinyFlowers.id("tiny_closed_eyeblossom"), 6250335, + SoundEvents.EYEBLOSSOM_CLOSE_LONG, SoundEvents.EYEBLOSSOM_CLOSE) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_wither_rose"), Identifier.withDefaultNamespace("wither_rose")) + .stewEffectSeconds(MobEffects.WITHER, 7.0) + .addCanSurviveOn(Blocks.NETHERRACK, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .untintedStem() + .stemTexture(TinyFlowers.id("tiny_wither_rose_stem")) + .build(), + Flower.Builder + .ofCustom(TinyFlowers.id("tiny_cactus_flower"), Identifier.withDefaultNamespace("cactus_flower")) + .addCanSurviveOn(BlockTags.SAND) + .addCanSurviveOn(Blocks.SANDSTONE, Blocks.RED_SANDSTONE) + .addSturdyPlacementBehavior() + .customModel(TinyFlowers.id("garden_low_untinted")) + .stemTexture(TinyFlowers.id("tiny_cactus_flower_stem")) + .build()); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/VanillaFlowerProvider.java b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/VanillaFlowerProvider.java new file mode 100644 index 00000000..e9745abd --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/datagen/mods/VanillaFlowerProvider.java @@ -0,0 +1,37 @@ +package co.secretonline.tinyflowers.datagen.mods; + +import java.util.List; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.data.TinyFlowerResources.TintSource; +import net.minecraft.resources.Identifier; + +public class VanillaFlowerProvider extends FlowerProvider { + @Override + public String getModId() { + return Identifier.DEFAULT_NAMESPACE; + } + + @Override + public List getFlowers() { + return List.of( + Flower.Builder + .ofSegmented(Identifier.withDefaultNamespace("pink_petals")) + .customModel(Identifier.withDefaultNamespace("flowerbed")) + .stemTexture(Identifier.withDefaultNamespace("pink_petals_stem")) + .particleTexture(Identifier.withDefaultNamespace("pink_petals")) + .build(), + Flower.Builder + .ofSegmented(Identifier.withDefaultNamespace("wildflowers")) + .customModel(Identifier.withDefaultNamespace("flowerbed")) + .stemTexture(Identifier.withDefaultNamespace("pink_petals_stem")) + .particleTexture(Identifier.withDefaultNamespace("wildflowers")) + .build(), + Flower.Builder + .ofSegmented(Identifier.withDefaultNamespace("leaf_litter")) + .addSturdyPlacementBehavior() + .customModel(TinyFlowers.id("garden_leaf_litter")) + .tintSource(TintSource.DRY_FOLIAGE) + .build()); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/datagen/providers/FloristsShearsRecipeProvider.java b/common/src/main/java/co/secretonline/tinyflowers/datagen/providers/FloristsShearsRecipeProvider.java new file mode 100644 index 00000000..867f8913 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/datagen/providers/FloristsShearsRecipeProvider.java @@ -0,0 +1,60 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStackTemplate; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.DyedItemColor; +import net.minecraft.world.item.crafting.Recipe; + +import java.util.Map; + +public class FloristsShearsRecipeProvider extends RecipeProvider { + private final Map> colorMap; + + public FloristsShearsRecipeProvider(HolderLookup.Provider registries, RecipeOutput output, Map> colorMap) { + super(registries, output); + this.colorMap = colorMap; + } + + @Override + public void buildRecipes() { + // Generate recipes for each colour of shears. + Identifier shearsId = BuiltInRegistries.ITEM.getKey(ModItems.FLORISTS_SHEARS_ITEM.get()); + for (var entry : this.colorMap.entrySet()) { + DyeColor color = entry.getKey(); + TagKey tagKey = entry.getValue(); + ItemStackTemplate stack = new ItemStackTemplate( + BuiltInRegistries.ITEM.wrapAsHolder(ModItems.FLORISTS_SHEARS_ITEM.get()), + 1, + DataComponentPatch.builder() + .set(DataComponents.DYED_COLOR, new DyedItemColor(color.getTextureDiffuseColor())) + .build()); + + ResourceKey> recipeKey = ResourceKey.create( + Registries.RECIPE, + shearsId.withPath((path) -> path + "_" + color.getSerializedName())); + + shapeless(RecipeCategory.TOOLS, stack) + .requires(Items.SHEARS) + .requires(tagKey) + .group("florists_shears") + .unlockedBy(getHasName(Items.SHEARS), has(Items.SHEARS)) + .save(output, recipeKey); + } + + dyedItem(ModItems.FLORISTS_SHEARS_ITEM.get(), "florists_shears_dyed"); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/datagen/providers/PartialModelProvider.java b/common/src/main/java/co/secretonline/tinyflowers/datagen/providers/PartialModelProvider.java new file mode 100644 index 00000000..6f053885 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/datagen/providers/PartialModelProvider.java @@ -0,0 +1,10 @@ +package co.secretonline.tinyflowers.datagen.providers; + +/** + * Minecraft does validation to ensure that model providers provide models for all variations (items, blocks, block states). + * Fabric has a mixin to skip entries not added by the mod, or to skip altogether if not in some strict mode. + * NeoForge has no such mixin, so this interface is here to provide an opportunity to skip that validation. + */ +public interface PartialModelProvider { + boolean shouldValidateAllEntries(); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/helper/FlowerModelHelper.java b/common/src/main/java/co/secretonline/tinyflowers/helper/FlowerModelHelper.java new file mode 100644 index 00000000..7d19600d --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/helper/FlowerModelHelper.java @@ -0,0 +1,50 @@ +package co.secretonline.tinyflowers.helper; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import com.google.gson.JsonObject; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.JsonOps; +import net.minecraft.resources.Identifier; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.GsonHelper; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public final class FlowerModelHelper { + public static Map readResourceFiles(ResourceManager resourceManager) { + Map map = new HashMap<>(); + + var allVariantJsonFiles = resourceManager.listResources( + ModRegistries.TINY_FLOWER.identifier() + .withPrefix(TinyFlowers.MOD_ID + "/") + .getPath(), + identifier -> identifier.getPath().endsWith(".json")); + + allVariantJsonFiles.forEach((identifier, rawResource) -> { + try (var reader = rawResource.openAsReader()) { + JsonObject data = GsonHelper.parse(reader).getAsJsonObject(); + DataResult readResult = TinyFlowerResources.CODEC.parse(JsonOps.INSTANCE, data); + if (readResult.isError()) { + TinyFlowers.LOGGER + .warn("Failed to parse data for tiny flower resource info {}. Skipping", identifier); + return; + } + + TinyFlowerResources resources = readResult.getOrThrow(); + map.put(resources.id(), resources); + } catch (IOException ex) { + TinyFlowers.LOGGER + .warn("Failed to read data for tiny flower resource info {}. Skipping", identifier); + } catch (Exception ex) { + TinyFlowers.LOGGER + .warn("Error while reading tiny flower resource info {}. Skipping", identifier); + } + }); + + return map; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/helper/ItemModelHelper.java b/common/src/main/java/co/secretonline/tinyflowers/helper/ItemModelHelper.java new file mode 100644 index 00000000..074bd5d6 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/helper/ItemModelHelper.java @@ -0,0 +1,39 @@ +package co.secretonline.tinyflowers.helper; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.TinyFlowersClientState; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import co.secretonline.tinyflowers.renderer.item.TinyFlowerProperty; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import net.minecraft.client.data.models.model.ItemModelUtils; +import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.model.TextureMapping; +import net.minecraft.client.renderer.item.ItemModel; +import net.minecraft.client.renderer.item.SelectItemModel; +import net.minecraft.resources.Identifier; + +import java.util.ArrayList; +import java.util.List; + +public final class ItemModelHelper { + + public static ItemModel.Unbaked createTinyFlowerItemModel() { + List> cases = new ArrayList<>(); + + for (var entry : TinyFlowersClientState.RESOURCE_INSTANCES.entrySet()) { + TinyFlowerResources res = entry.getValue(); + cases.add(ItemModelUtils.when( + new TinyFlowerComponent(res.id()), + modelForIdentifier(res.itemModel()))); + } + + return ItemModelUtils.select( + new TinyFlowerProperty(), + modelForIdentifier(TinyFlowers.id("item/tiny_garden")), + cases); + } + + private static ItemModel.Unbaked modelForIdentifier(Identifier id) { + return ItemModelUtils.plainModel(id); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/helper/ParticleHelper.java b/common/src/main/java/co/secretonline/tinyflowers/helper/ParticleHelper.java new file mode 100644 index 00000000..56e1dae9 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/helper/ParticleHelper.java @@ -0,0 +1,55 @@ +package co.secretonline.tinyflowers.helper; + +import co.secretonline.tinyflowers.TinyFlowersClientState; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Util; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +public class ParticleHelper { + public static @Nullable TextureAtlasSprite getOverrideSprite(@NonNull ClientLevel level, @NonNull BlockPos blockPos) { + BlockState blockState = level.getBlockState(blockPos); + if (!(blockState.is(ModBlocks.TINY_GARDEN_BLOCK.get()))) { + return null; + } + + if (!(level.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, don't do anything + return null; + } + + // Select a random flower variant to render as the particle + List flowers = gardenBlockEntity.getFlowers(); + if (flowers.isEmpty()) { + return null; + } + + Identifier flowerId = Util.getRandom(flowers, TinyFlowersClientState.RANDOM); + TinyFlowerData flowerData = TinyFlowerData.findById(level.registryAccess(), flowerId); + if (flowerData == null) { + return null; + } + + Minecraft client = Minecraft.getInstance(); + ItemStack stack = flowerData.getItemStack(1); + + TinyFlowersClientState.ITEM_RENDER_STATE.clear(); + client.getItemModelResolver() + .appendItemLayers(TinyFlowersClientState.ITEM_RENDER_STATE, stack, + ItemDisplayContext.GROUND, level, null, 0); + + return TinyFlowersClientState.ITEM_RENDER_STATE.pickParticleIcon(TinyFlowersClientState.RANDOM); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/helper/SegmentedMixinHelper.java b/common/src/main/java/co/secretonline/tinyflowers/helper/SegmentedMixinHelper.java new file mode 100644 index 00000000..a4dc80d6 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/helper/SegmentedMixinHelper.java @@ -0,0 +1,157 @@ +package co.secretonline.tinyflowers.helper; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.TinyGardenBlock; +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.RegistryAccess; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SegmentableBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.gameevent.GameEvent; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * This class contains common logic for mixins targeting Segmented blocks. + *

+ * As Segmented is an interface, we can't use a mixin to inject into it + * directly. Instead, we need to inject into all classes that implement + * Segmented and call the methods in this class. + */ +public class SegmentedMixinHelper { + public static void shouldAddSegment(BlockState state, BlockPlaceContext context, + IntegerProperty property, CallbackInfoReturnable info) { + // Early exit for cases where no additional items should be placed. + if (context.isSecondaryUseActive() || state.getValue(property) >= SegmentableBlock.MAX_SEGMENT) { + return; + } + + ItemStack stack = context.getItemInHand(); + + // If the placement item is the same as the current block, then we don't want to + // overwrite it. This keeps more vanilla blocks in the world, which I think is + // an admirable goal. + if (stack.is(state.getBlock().asItem())) { + return; + } + + RegistryAccess registryAccess = context.getLevel().registryAccess(); + + TinyFlowerData flowerData = TinyFlowerData.findByItemStack(registryAccess, stack); + if (flowerData == null) { + // The item is not a valid flower variant, so we don't need to do anything. + return; + } + + BlockPos supportingPos = context.getClickedPos().below(); + if (!flowerData.canSurviveOn(context.getLevel(), supportingPos)) { + return; + } + + info.setReturnValue(true); + } + + public static void getPlacementState(BlockPlaceContext context, Block blockBeingUsed, IntegerProperty amountProperty, + EnumProperty directionProperty, CallbackInfoReturnable info) { + Level level = context.getLevel(); + RegistryAccess registryAccess = level.registryAccess(); + BlockPos blockPos = context.getClickedPos(); + + // We need to build a new BlockState if a Segmented block item is being placed + // inside a TinyGardenBlock. + BlockState blockState = level.getBlockState(blockPos); + Block currentBlock = blockState.getBlock(); + BlockPos supportingPos = context.getClickedPos().below(); + + // Early exit if the block being placed is the same as the current block. + // This falls back to the original implementation. + if (currentBlock.equals(blockBeingUsed)) { + return; + } + + // If the current block is not currently a garden but is able to be converted to + // a tiny flower, then we need to convert the current blockstate to a + // TinyGardenBlock to before continuing. + if (!(currentBlock instanceof TinyGardenBlock)) { + TinyFlowerData flowerData = TinyFlowerData.findByOriginalBlock(registryAccess, currentBlock); + if (flowerData != null) { + if (!flowerData.canSurviveOn(level, supportingPos)) { + return; + } + + try { + BlockState prevBockState = blockState; + blockState = ModBlocks.TINY_GARDEN_BLOCK.get().defaultBlockState() + .setValue(TinyGardenBlock.FACING, blockState.getValue(BlockStateProperties.HORIZONTAL_FACING)); + + // Since we also need to update the entity, try to update the world now. + level.setBlockAndUpdate(blockPos, blockState); + + if (!(level.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, try undo the change + level.setBlockAndUpdate(blockPos, prevBockState); + return; + } + + gardenBlockEntity.setFromPreviousBlockState(registryAccess, prevBockState); + + currentBlock = blockState.getBlock(); + } catch (IllegalStateException e) { + // This is expected to occur only if there are new Segmented blocks that don't + // have tiny flowers. If the base game ever ends up doing this, then it's + // probably woth handling this better. For now just spitting out a warning isn't + // the worst thing. + TinyFlowers.LOGGER.warn("Failed to convert blockstate to garden block. Ignoring", e); + } + } + } + + if (currentBlock instanceof TinyGardenBlock) { + if (!(level.getBlockEntity(blockPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + return; + } + if (gardenBlockEntity.isFull()) { + // Can't add flower, so don't replace blockstate. + // This case shouldn't ever be hit, as TinyGardenBlock should have prevented + // replacement. + info.setReturnValue(blockState); + return; + } + + // There's space in the garden, so add a flower. + TinyFlowerData flowerData = TinyFlowerData.findByOriginalBlock(registryAccess, blockBeingUsed); + if (flowerData == null) { + info.setReturnValue(blockState); + return; + } + if (!flowerData.canSurviveOn(level, supportingPos)) { + info.setReturnValue(blockState); + return; + } + + gardenBlockEntity.addFlower(flowerData.id()); + + // Consume item, play sound, and send game event. + Player player = context.getPlayer(); + SoundType soundType = blockState.getSoundType(); + level.playSound(player, blockPos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, blockPos, GameEvent.Context.of(player, blockState)); + context.getItemInHand().consume(1, player); + + info.setReturnValue(blockState); + } + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/helper/TransformHelper.java b/common/src/main/java/co/secretonline/tinyflowers/helper/TransformHelper.java new file mode 100644 index 00000000..0b832e5b --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/helper/TransformHelper.java @@ -0,0 +1,153 @@ +package co.secretonline.tinyflowers.helper; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.Nullable; + +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.data.behavior.Behavior; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.util.TriState; +import net.minecraft.util.Util; +import net.minecraft.world.attribute.EnvironmentAttributes; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; + +public class TransformHelper { + + public static boolean doTransformTick(BlockState currentState, ServerLevel world, BlockPos pos, RandomSource random, + boolean isRandomTick) { + TriState openTriState = world.environmentAttributes().getValue(EnvironmentAttributes.EYEBLOSSOM_OPEN, pos); + if (openTriState == TriState.DEFAULT) { + return false; + } + + boolean didChange = false; + + if (!(world.getBlockEntity(pos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, don't do anything + return false; + } + + List featuresWithWorldEffect = new ArrayList<>(); + for (int i = 1; i <= 4; i++) { + @Nullable + Identifier flowerId = gardenBlockEntity.getFlower(i); + if (flowerId == null) { + continue; + } + + @Nullable + TinyFlowerData flowerData = TinyFlowerData.findById(world.registryAccess(), flowerId); + if (flowerData == null) { + continue; + } + + for (Behavior behavior : flowerData.behaviors()) { + if (behavior.shouldActivate(gardenBlockEntity, i, currentState, world, pos, random)) { + didChange = true; + behavior.onActivate(gardenBlockEntity, i, currentState, world, pos, random); + + if (behavior.hasWorldEffect()) { + featuresWithWorldEffect.add(behavior); + } + } + } + } + + if (didChange) { + world.setBlock(pos, currentState, Block.UPDATE_CLIENTS); + world.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(currentState)); + + TransformHelper.notifyNearbyBlocks(currentState, world, pos, random); + + if (!featuresWithWorldEffect.isEmpty()) { + Behavior randomChange = Util.getRandom(featuresWithWorldEffect, random); + randomChange.doWorldEffect(world, pos, random, isRandomTick); + } + } + + return didChange; + } + + public static void notifyNearbyBlocks(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + TriState openTriState = world.environmentAttributes().getValue(EnvironmentAttributes.EYEBLOSSOM_OPEN, pos); + if (openTriState == TriState.DEFAULT) { + return; + } + + // This is to detect whether the block requesting this notification is an actual + // Eyeblossom. Actual Eyeblossoms will have already done this loop for + // Eyeblossom blocks, so if that's the case then we only need to notify gardens. + // If the origin was not an Eyeblossom, then we need to notify both Eyeblossoms + // and Tiny Gardens. + boolean originIsEyeblossom = state.is(Blocks.CLOSED_EYEBLOSSOM) || state.is(Blocks.OPEN_EYEBLOSSOM); + + // Calculate what the wrong eyeblossom is so we don't have to do it every time + // in the loop. + Block incorrectEyeblossom = openTriState.toBoolean(true) ? Blocks.CLOSED_EYEBLOSSOM : Blocks.OPEN_EYEBLOSSOM; + + BlockPos.betweenClosed(pos.offset(-3, -2, -3), pos.offset(3, 2, 3)).forEach(otherPos -> { + BlockState nearbyBlockState = world.getBlockState(otherPos); + + // Update Eyeblossoms if the source was not an eyeblossom. + if (nearbyBlockState.is(incorrectEyeblossom) && !originIsEyeblossom) { + scheduleBlockTick(world, pos, otherPos, incorrectEyeblossom, random); + return; + } + + // Gardens + if (nearbyBlockState.is(ModBlocks.TINY_GARDEN_BLOCK.get())) { + + if (!(world.getBlockEntity(otherPos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, don't do anything + return; + } + + // Tiny Gardens should also recieve updates if they have eyeblossoms. + boolean didNotify = false; + for (int i = 1; i <= 4; i++) { + @Nullable + Identifier flowerId = gardenBlockEntity.getFlower(i); + if (flowerId == null) { + continue; + } + + @Nullable + TinyFlowerData flowerData = TinyFlowerData.findById(world.registryAccess(), flowerId); + if (flowerData == null) { + continue; + } + + for (Behavior feature : flowerData.behaviors()) { + if (feature.shouldActivate(gardenBlockEntity, i, state, world, pos, random)) { + scheduleBlockTick(world, pos, otherPos, ModBlocks.TINY_GARDEN_BLOCK.get(), random); + didNotify = true; + break; + } + } + if (didNotify) { + break; + } + } + } + }); + } + + private static void scheduleBlockTick(ServerLevel world, BlockPos centerPos, BlockPos otherPos, Block block, + RandomSource random) { + double distance = Math.sqrt(centerPos.distSqr(otherPos)); + int numTicks = random.nextIntBetweenInclusive((int) (distance * 5.0), (int) (distance * + 10.0)); + + world.scheduleTick(otherPos, block, numTicks); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/FloristsShearsItem.java b/common/src/main/java/co/secretonline/tinyflowers/item/FloristsShearsItem.java new file mode 100644 index 00000000..7dd4cc6f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/FloristsShearsItem.java @@ -0,0 +1,146 @@ +package co.secretonline.tinyflowers.item; + +import java.util.Arrays; + +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.TinyGardenBlock; +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SegmentableBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.gameevent.GameEvent.Context; +import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.NonNull; + +public class FloristsShearsItem extends ShearsItem { + private final static Direction[] DIRECTIONS = new Direction[] { + Direction.NORTH, Direction.EAST, + Direction.SOUTH, Direction.WEST, }; + + public FloristsShearsItem(Properties settings) { + super(settings); + } + + @Override + public @NonNull InteractionResult useOn(UseOnContext ctx) { + Level level = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + BlockState prevBockState = level.getBlockState(pos); + + Block prevBlock = prevBockState.getBlock(); + TinyFlowerData prevData = TinyFlowerData.findByOriginalBlock(level.registryAccess(), prevBlock); + if (prevData != null) { + // The block that was clicked on is the original block of a tiny flower variant. + // Try and turn into actual tiny flowers. + + // Ensure the block underneath can support the tiny flower variant. This is + // likely, given the block was previously holding the original block. + BlockPos supportingPos = pos.below(); + if (!prevData.canSurviveOn(level, supportingPos)) { + return InteractionResult.FAIL; + } + + BlockState newBlockState = ModBlocks.TINY_GARDEN_BLOCK.get().defaultBlockState() + .setValue(TinyGardenBlock.FACING, ctx.getHorizontalDirection().getOpposite()); + + level.setBlockAndUpdate(pos, newBlockState); + + if (!(level.getBlockEntity(pos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, try undo the change + level.setBlockAndUpdate(pos, prevBockState); + return InteractionResult.FAIL; + } + + gardenBlockEntity.setFromPreviousBlockState(level.registryAccess(), prevBockState); + + // If the block we converted from is not segmentable, then we're done here. + if (!(prevBlock instanceof SegmentableBlock)) { + if (ctx.getPlayer() != null) { + Player player = ctx.getPlayer(); + ctx.getItemInHand().hurtAndBreak(1, player, ctx.getHand()); + + level.playSound(player, pos, SoundEvents.GROWING_PLANT_CROP, + SoundSource.BLOCKS, 1.0F, 1.0F); + } + + level.gameEvent(GameEvent.BLOCK_CHANGE, pos, Context.of(ctx.getPlayer(), + newBlockState)); + + return InteractionResult.SUCCESS; + } else { + // If the previous block was segmentable, then we actually want to remove a + // flower from it. + // That's handled by the next if statement, but only for Tiny Gardens. Luckily, + // we just did + // the conversion. + prevBockState = newBlockState; + } + } + + if (prevBockState.is(ModBlocks.TINY_GARDEN_BLOCK.get())) { + if (!(level.getBlockEntity(pos) instanceof TinyGardenBlockEntity gardenBlockEntity)) { + // If there's no block entity, don't do anything + return InteractionResult.FAIL; + } + + // Remove flower at certain part of garden. + Vec3 positionInBlock = ctx.getClickLocation().subtract(Vec3.atLowerCornerOf(pos)); + boolean isEast = positionInBlock.x >= 0.5; + boolean isSouth = positionInBlock.z >= 0.5; + + // Convert block quadrant into the correct property. + // Writing this was a little bit of trial and a lot of error. + int index = isSouth ? (isEast ? 2 : 3) : (isEast ? 1 : 0); + index = Arrays.asList(DIRECTIONS).indexOf(prevBockState.getValue(TinyGardenBlock.FACING)) - + index; + index = (index + 4) % 4; + int oneIndexed = index + 1; + + Identifier idAtIndex = gardenBlockEntity.getFlower(oneIndexed); + if (idAtIndex == null) { + // This spot has no flower. + return InteractionResult.TRY_WITH_EMPTY_HAND; + } + TinyFlowerData flowerData = TinyFlowerData.findById(level.registryAccess(), idAtIndex); + // This condition fails if the garden has an identifier in this spot, but it is + // no longer registered. This usually happens when a mod is removed. In that + // case, don't pop an item, but do do the rest. + if (flowerData != null) { + Block.popResource(level, pos, flowerData.getItemStack(1)); + } + + if (ctx.getPlayer() != null) { + Player player = ctx.getPlayer(); + ctx.getItemInHand().hurtAndBreak(1, player, ctx.getHand()); + + level.playSound(player, pos, SoundEvents.GROWING_PLANT_CROP, + SoundSource.BLOCKS, 1.0F, 1.0F); + } + + gardenBlockEntity.setFlower(oneIndexed, null); + + if (gardenBlockEntity.isEmpty()) { + level.removeBlock(pos, false); + } + + level.gameEvent(GameEvent.BLOCK_CHANGE, pos, Context.of(ctx.getPlayer(), + prevBockState)); + + return InteractionResult.SUCCESS; + } + + return super.useOn(ctx); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/ModCreativeModeTabs.java b/common/src/main/java/co/secretonline/tinyflowers/item/ModCreativeModeTabs.java new file mode 100644 index 00000000..3855e22f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/ModCreativeModeTabs.java @@ -0,0 +1,69 @@ +package co.secretonline.tinyflowers.item; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.platform.Services; +import net.minecraft.client.Minecraft; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class ModCreativeModeTabs { + private static final Identifier TINY_FLOWERS_TAB_ID = TinyFlowers.id("tiny_flowers"); + public static final ResourceKey TINY_FLOWERS_TAB_KEY = ResourceKey + .create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), TINY_FLOWERS_TAB_ID); + + public static final Supplier TINY_FLOWERS_TAB = Services.REGISTRY.register( + BuiltInRegistries.CREATIVE_MODE_TAB, + TINY_FLOWERS_TAB_ID, + () -> CreativeModeTab + .builder(CreativeModeTab.Row.TOP, 0) + .title(Component.translatable("itemGroup." + TinyFlowers.MOD_ID)) + .icon(() -> new ItemStack(ModItems.TINY_FLOWER_ITEM.get())) + .build()); + + private static final List orderedFlowerData = new ArrayList<>(); + + public static void collectFlowerData(Iterable displayStacks) { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level == null) return; + RegistryAccess registryAccess = minecraft.level.registryAccess(); + + for (ItemStack itemStack : displayStacks) { + if (itemStack.getItem() instanceof BlockItem blockItem) { + Block block = blockItem.getBlock(); + TinyFlowerData flowerData = TinyFlowerData.findByOriginalBlock(registryAccess, block); + if (flowerData != null) { + orderedFlowerData.add(flowerData); + } + } + } + } + + public static void addCollectedFlowers( + Collection currentEntries, + Consumer consumer + ) { + for (TinyFlowerData tinyFlowerData : orderedFlowerData) { + ItemStack newStack = tinyFlowerData.getItemStack(1); + if (!currentEntries.contains(newStack)) { + consumer.accept(newStack); + } + } + orderedFlowerData.clear(); + } + + public static void initialize(){} +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/ModItems.java b/common/src/main/java/co/secretonline/tinyflowers/item/ModItems.java new file mode 100644 index 00000000..3c67276a --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/ModItems.java @@ -0,0 +1,43 @@ +package co.secretonline.tinyflowers.item; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.platform.Services; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.item.component.DyedItemColor; + +import java.util.function.Supplier; + +public class ModItems { + + public static final Identifier FLORISTS_SHEARS_ID = TinyFlowers.id("florists_shears"); + public static final Supplier FLORISTS_SHEARS_ITEM = Services.REGISTRY.register( + BuiltInRegistries.ITEM, + FLORISTS_SHEARS_ID, + () -> new FloristsShearsItem( + new Item.Properties() + .setId(ResourceKey.create(Registries.ITEM, FLORISTS_SHEARS_ID)) + .stacksTo(1) + .durability(238) + .component(DataComponents.TOOL, ShearsItem.createToolProperties()) + .component(DataComponents.DYED_COLOR, + new DyedItemColor(DyeColor.RED.getTextureDiffuseColor())))); + + public static final Identifier TINY_FLOWER_ID = TinyFlowers.id("tiny_flower"); + public static final Supplier TINY_FLOWER_ITEM = Services.REGISTRY.register( + BuiltInRegistries.ITEM, + TINY_FLOWER_ID, + () -> new TinyFlowerItem( + new Item.Properties() + .setId(ResourceKey.create(Registries.ITEM, TINY_FLOWER_ID)) + .useBlockDescriptionPrefix())); + + public static void initialize() { + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/TinyFlowerItem.java b/common/src/main/java/co/secretonline/tinyflowers/item/TinyFlowerItem.java new file mode 100644 index 00000000..1a92be73 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/TinyFlowerItem.java @@ -0,0 +1,78 @@ +package co.secretonline.tinyflowers.item; + +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.TinyGardenBlock; +import co.secretonline.tinyflowers.item.component.GardenContentsComponent; +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.Optional; + +public class TinyFlowerItem extends BlockItem { + public TinyFlowerItem(Item.Properties properties) { + super(ModBlocks.TINY_GARDEN_BLOCK.get(), properties); + } + + @Override + protected @Nullable BlockState getPlacementState(@NonNull BlockPlaceContext blockPlaceContext) { + BlockState newBlockState = super.getPlacementState(blockPlaceContext); + if (newBlockState == null || newBlockState.isAir()) { + return null; + } + + if (!this.checkSupportingBlock(blockPlaceContext)) { + return null; + } + + BlockState currentBlockState = blockPlaceContext.getLevel().getBlockState(blockPlaceContext.getClickedPos()); + Optional currentDirection = currentBlockState.getOptionalValue(TinyGardenBlock.FACING); + Direction newDirection = currentDirection.orElse(blockPlaceContext.getHorizontalDirection().getOpposite()); + + return newBlockState.setValue(TinyGardenBlock.FACING, newDirection); + } + + private boolean checkSupportingBlock(BlockPlaceContext context) { + Level level = context.getLevel(); + ItemStack itemStack = context.getItemInHand(); + BlockPos supportingPos = context.getClickedPos().below(); + + GardenContentsComponent gardenComponent = itemStack.get(ModComponents.GARDEN_CONTENTS.get()); + if (gardenComponent != null) { + return gardenComponent.canSurviveOn(level, supportingPos); + } + + TinyFlowerComponent tinyFlowerComponent = itemStack.get(ModComponents.TINY_FLOWER.get()); + if (tinyFlowerComponent != null) { + return tinyFlowerComponent.canSurviveOn(level, supportingPos); + } + + return false; + } + + @Override + public @NonNull Component getName(ItemStack itemStack) { + GardenContentsComponent gardenComponent = itemStack.get(ModComponents.GARDEN_CONTENTS.get()); + if (gardenComponent != null) { + return Component.translatable(GardenContentsComponent.GARDEN_TEXT); + } + + TinyFlowerComponent tinyFlowerComponent = itemStack.get(ModComponents.TINY_FLOWER.get()); + if (tinyFlowerComponent != null) { + return Component.translatable(tinyFlowerComponent.getTranslationKey()); + } + + return super.getName(itemStack); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/component/GardenContentsComponent.java b/common/src/main/java/co/secretonline/tinyflowers/item/component/GardenContentsComponent.java new file mode 100644 index 00000000..d98348b8 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/component/GardenContentsComponent.java @@ -0,0 +1,74 @@ +package co.secretonline.tinyflowers.item.component; + +import java.util.Optional; +import java.util.function.Consumer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.data.Survivable; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponentGetter; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Util; +import net.minecraft.world.item.Item.TooltipContext; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipProvider; +import net.minecraft.world.level.LevelReader; +import org.jspecify.annotations.NonNull; + +public record GardenContentsComponent(Identifier flower1, Identifier flower2, Identifier flower3, Identifier flower4) + implements TooltipProvider, Survivable { + public static final String GARDEN_TEXT = "block.tiny_flowers.tiny_garden"; + public static final String EMPTY_TEXT = "block.tiny_flowers.tiny_garden.empty"; + + @Override + public boolean canSurviveOn(LevelReader level, BlockPos pos) { + for (Identifier identifier : new Identifier[] { flower1, flower2, flower3, flower4 }) { + if (identifier == null) { + continue; + } + + TinyFlowerData flowerData = TinyFlowerData.findById(level.registryAccess(), identifier); + if (flowerData == null) { + continue; + } + + if (!flowerData.canSurviveOn(level, pos)) { + return false; + } + } + + return true; + } + + @Override + public void addToTooltip(@NonNull TooltipContext tooltipContext, @NonNull Consumer consumer, @NonNull TooltipFlag tooltipFlag, + @NonNull DataComponentGetter dataComponentGetter) { + + for (Identifier id : new Identifier[] { flower1, flower2, flower3, flower4 }) { + if (id == null) { + MutableComponent empty = Component.translatable(EMPTY_TEXT); + empty.withStyle(ChatFormatting.GRAY); + consumer.accept(empty); + continue; + } + + MutableComponent text = Component.translatable(Util.makeDescriptionId("block", id)); + consumer.accept(text); + } + } + + public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( + Identifier.CODEC.optionalFieldOf("flower_1").forGetter((value) -> Optional.ofNullable(value.flower1())), + Identifier.CODEC.optionalFieldOf("flower_2").forGetter((value) -> Optional.ofNullable(value.flower2())), + Identifier.CODEC.optionalFieldOf("flower_3").forGetter((value) -> Optional.ofNullable(value.flower3())), + Identifier.CODEC.optionalFieldOf("flower_4").forGetter((value) -> Optional.ofNullable(value.flower4()))) + .apply(builder, + (optional1, optional2, optional3, optional4) -> new GardenContentsComponent( + optional1.orElse(null), optional2.orElse(null), optional3.orElse(null), optional4.orElse(null)))); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/component/ModComponents.java b/common/src/main/java/co/secretonline/tinyflowers/item/component/ModComponents.java new file mode 100644 index 00000000..10d54869 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/component/ModComponents.java @@ -0,0 +1,27 @@ +package co.secretonline.tinyflowers.item.component; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.platform.Services; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.BuiltInRegistries; + +import java.util.function.Supplier; + +public class ModComponents { + public static final Supplier> TINY_FLOWER = Services.REGISTRY.register( + BuiltInRegistries.DATA_COMPONENT_TYPE, + TinyFlowers.id("tiny_flower"), + () -> DataComponentType.builder() + .persistent(TinyFlowerComponent.CODEC) + .build()); + + public static final Supplier> GARDEN_CONTENTS = Services.REGISTRY.register( + BuiltInRegistries.DATA_COMPONENT_TYPE, + TinyFlowers.id("garden_contents"), + () -> DataComponentType.builder() + .persistent(GardenContentsComponent.CODEC) + .build()); + + public static void initialize() { + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/component/TinyFlowerComponent.java b/common/src/main/java/co/secretonline/tinyflowers/item/component/TinyFlowerComponent.java new file mode 100644 index 00000000..437066da --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/component/TinyFlowerComponent.java @@ -0,0 +1,29 @@ +package co.secretonline.tinyflowers.item.component; + +import com.mojang.serialization.Codec; + +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.data.Survivable; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Util; +import net.minecraft.world.level.LevelReader; + +public record TinyFlowerComponent(Identifier id) implements Survivable { + public String getTranslationKey() { + return Util.makeDescriptionId("block", this.id()); + } + + @Override + public boolean canSurviveOn(LevelReader level, BlockPos pos) { + TinyFlowerData flowerData = TinyFlowerData.findById(level.registryAccess(), id); + if (flowerData == null) { + return true; + } + + return flowerData.canSurviveOn(level, pos); + } + + public static final Codec CODEC = Identifier.CODEC.xmap(TinyFlowerComponent::new, + TinyFlowerComponent::id); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/crafting/CustomRecipeWithProvider.java b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/CustomRecipeWithProvider.java new file mode 100644 index 00000000..7a79e653 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/CustomRecipeWithProvider.java @@ -0,0 +1,22 @@ +package co.secretonline.tinyflowers.item.crafting; + +import org.apache.commons.lang3.NotImplementedException; + +import net.minecraft.core.HolderLookup; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CustomRecipe; +import org.jspecify.annotations.NonNull; + +public abstract class CustomRecipeWithProvider extends CustomRecipe { + @Override + public @NonNull ItemStack assemble(CraftingInput input) { + throw new NotImplementedException( + "assemble(CraftingInput input) should not be called for CustomRecipeWithLevel. Is a mixin missing?"); + } + + /** + * A version of {@see Recipe.assemble} that takes a HolderLookup.Provider + */ + public abstract ItemStack assemble(CraftingInput input, HolderLookup.Provider provider); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/crafting/ModRecipeSerializers.java b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/ModRecipeSerializers.java new file mode 100644 index 00000000..fa5c1cd5 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/ModRecipeSerializers.java @@ -0,0 +1,23 @@ +package co.secretonline.tinyflowers.item.crafting; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.platform.Services; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.crafting.RecipeSerializer; + +import java.util.function.Supplier; + +public class ModRecipeSerializers { + public static final Supplier> TINY_FLOWER_STEW = Services.REGISTRY.register( + BuiltInRegistries.RECIPE_SERIALIZER, + TinyFlowers.id("crafting_special_tiny_flower_stew"), + () -> TinyFlowerStewRecipe.SERIALIZER); + + public static final Supplier> SHEAR_TINY_FLOWERS = Services.REGISTRY.register( + BuiltInRegistries.RECIPE_SERIALIZER, + TinyFlowers.id("crafting_special_shear_tiny_flowers"), + () -> ShearTinyFlowersRecipe.SERIALIZER); + + public static void initialize() { + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/crafting/ShearTinyFlowersRecipe.java b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/ShearTinyFlowersRecipe.java new file mode 100644 index 00000000..a32ab801 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/ShearTinyFlowersRecipe.java @@ -0,0 +1,130 @@ +package co.secretonline.tinyflowers.item.crafting; + +import org.jspecify.annotations.NonNull; + +import com.mojang.serialization.MapCodec; + +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.core.HolderLookup.Provider; +import net.minecraft.core.NonNullList; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemStackTemplate; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +public class ShearTinyFlowersRecipe extends CustomRecipeWithProvider { + public static final ShearTinyFlowersRecipe INSTANCE = new ShearTinyFlowersRecipe(); + public static final MapCodec MAP_CODEC = MapCodec.unit(INSTANCE); + public static final StreamCodec STREAM_CODEC = StreamCodec + .unit(INSTANCE); + public static final RecipeSerializer SERIALIZER = new RecipeSerializer<>(MAP_CODEC, + STREAM_CODEC); + + @Override + public boolean matches(CraftingInput recipeInput, @NonNull Level level) { + // Quick size check. The recipe only supports florists' shears and a single + // flower type. + if (recipeInput.ingredientCount() != 2) { + return false; + } + + boolean hasFloristsShears = false; + boolean hasFlower = false; + + for (ItemStack itemStack : recipeInput.items()) { + // Ensure exactly one of each of Florists' Shears and a flower are present + if (itemStack.isEmpty()) { + continue; + } + + if (itemStack.is(ModItems.FLORISTS_SHEARS_ITEM.get())) { + if (hasFloristsShears) { + return false; + } + + hasFloristsShears = true; + continue; + } + + if (itemStack.getItem() instanceof BlockItem blockItem) { + Block block = blockItem.getBlock(); + TinyFlowerData flowerData = TinyFlowerData.findByOriginalBlock(level.registryAccess(), block); + if (flowerData == null) { + return false; + } + if (hasFlower) { + return false; + } + if (flowerData.isSegmentable()) { + // Prevent duplication of segmentable types + return false; + } + + hasFlower = true; + continue; + } + + return false; + } + + return hasFloristsShears && hasFlower; + } + + @Override + public ItemStack assemble(CraftingInput recipeInput, Provider provider) { + + for (ItemStack itemStack : recipeInput.items()) { + if (itemStack.getItem() instanceof BlockItem blockItem) { + Block block = blockItem.getBlock(); + TinyFlowerData flowerData = TinyFlowerData.findByOriginalBlock(provider, block); + if (flowerData == null) { + continue; + } + + return flowerData.getItemStack(4); + } + } + + return ItemStack.EMPTY; + } + + @Override + public @NonNull NonNullList getRemainingItems(CraftingInput craftingInput) { + NonNullList nonNullList = NonNullList.withSize(craftingInput.size(), ItemStack.EMPTY); + + for (int i = 0; i < nonNullList.size(); i++) { + ItemStack itemStack = craftingInput.getItem(i); + + // Florists' shears should be damaged. This can't be a regular recipe + // remainder otherwise it the shears duplicate when combining or dyeing. + if (itemStack.is(ModItems.FLORISTS_SHEARS_ITEM.get())) { + if (itemStack.getDamageValue() < itemStack.getMaxDamage() - 1) { + ItemStack moreDamaged = itemStack.copy(); + moreDamaged.setDamageValue(itemStack.getDamageValue() + 1); + + nonNullList.set(i, moreDamaged); + } else { + nonNullList.set(i, ItemStack.EMPTY); + } + } else { + ItemStackTemplate remainder = itemStack.getItem().getCraftingRemainder(); + if (remainder != null) { + nonNullList.set(i, remainder.create()); + } + } + } + + return nonNullList; + } + + @Override + public @NonNull RecipeSerializer getSerializer() { + return ModRecipeSerializers.SHEAR_TINY_FLOWERS.get(); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/item/crafting/TinyFlowerStewRecipe.java b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/TinyFlowerStewRecipe.java new file mode 100644 index 00000000..d4c77465 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/item/crafting/TinyFlowerStewRecipe.java @@ -0,0 +1,142 @@ +package co.secretonline.tinyflowers.item.crafting; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import com.mojang.serialization.MapCodec; + +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.HolderLookup.Provider; +import net.minecraft.core.HolderLookup.RegistryLookup; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.SuspiciousStewEffects; +import net.minecraft.world.item.component.SuspiciousStewEffects.Entry; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import org.jspecify.annotations.NonNull; + +public class TinyFlowerStewRecipe extends CustomRecipeWithProvider { + public static final TinyFlowerStewRecipe INSTANCE = new TinyFlowerStewRecipe(); + public static final MapCodec MAP_CODEC = MapCodec.unit(INSTANCE); + public static final StreamCodec STREAM_CODEC = StreamCodec + .unit(INSTANCE); + public static final RecipeSerializer SERIALIZER = new RecipeSerializer<>(MAP_CODEC, + STREAM_CODEC); + + @Override + public boolean matches(CraftingInput recipeInput, @NonNull Level level) { + // Quick size check, since the recipe needs a bowl, the two shrooms, and at + // least one tiny flower. + if (recipeInput.ingredientCount() < 4) { + return false; + } + + boolean hasBowl = false; + boolean hasBrownMushroom = false; + boolean hasRedMushroom = false; + boolean hasAtLeastOneTinyFlower = false; + + for (ItemStack itemStack : recipeInput.items()) { + // Ensure exactly one of each of bowl, red shroom, and brown shroom are in the + // list. + if (itemStack.isEmpty()) { + continue; + } + + if (itemStack.is(Items.BOWL)) { + if (hasBowl) { + return false; + } + + hasBowl = true; + continue; + } + if (itemStack.is(Items.BROWN_MUSHROOM)) { + if (hasBrownMushroom) { + return false; + } + + hasBrownMushroom = true; + continue; + } + if (itemStack.is(Items.RED_MUSHROOM)) { + if (hasRedMushroom) { + return false; + } + + hasRedMushroom = true; + continue; + } + + if (!itemStack.is(ModItems.TINY_FLOWER_ITEM.get())) { + return false; + } + + hasAtLeastOneTinyFlower = true; + } + + return hasBowl && hasBrownMushroom && hasRedMushroom && hasAtLeastOneTinyFlower; + } + + @Override + public ItemStack assemble(CraftingInput recipeInput, Provider provider) { + RegistryLookup registry = provider.lookupOrThrow(ModRegistries.TINY_FLOWER); + Map, Integer> effectMap = new HashMap<>(); + + for (ItemStack itemStack : recipeInput.items()) { + if (!itemStack.is(ModItems.TINY_FLOWER_ITEM.get())) { + continue; + } + + TinyFlowerComponent tinyFlowerComponent = itemStack.get(ModComponents.TINY_FLOWER.get()); + if (tinyFlowerComponent == null) { + continue; + } + + Optional> result = registry.get( + ResourceKey.create(ModRegistries.TINY_FLOWER, tinyFlowerComponent.id())); + if (result.isEmpty()) { + continue; + } + + TinyFlowerData tinyFlowerData = result.get().value(); + for (Entry entry : tinyFlowerData.getSuspiciousEffects().effects()) { + effectMap.merge(entry.effect(), entry.duration(), Integer::sum); + } + } + + List effectList = effectMap.entrySet() + .stream() + .map((entry) -> new Entry(entry.getKey(), entry.getValue())) + .toList(); + SuspiciousStewEffects effects = new SuspiciousStewEffects(effectList); + + ItemStack output = new ItemStack(Items.SUSPICIOUS_STEW); + output.applyComponents(DataComponentPatch.builder() + .set(DataComponents.SUSPICIOUS_STEW_EFFECTS, effects) + .build()); + + return output; + } + + @Override + public @NonNull RecipeSerializer getSerializer() { + return ModRecipeSerializers.TINY_FLOWER_STEW.get(); + } +} diff --git a/src/main/java/co/secretonline/tinyflowers/mixin/EyeblossomBlockMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/block/EyeblossomBlockMixin.java similarity index 83% rename from src/main/java/co/secretonline/tinyflowers/mixin/EyeblossomBlockMixin.java rename to common/src/main/java/co/secretonline/tinyflowers/mixin/block/EyeblossomBlockMixin.java index f6a818c4..df2e5940 100644 --- a/src/main/java/co/secretonline/tinyflowers/mixin/EyeblossomBlockMixin.java +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/block/EyeblossomBlockMixin.java @@ -1,11 +1,11 @@ -package co.secretonline.tinyflowers.mixin; +package co.secretonline.tinyflowers.mixin.block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import co.secretonline.tinyflowers.helper.EyeblossomHelper; +import co.secretonline.tinyflowers.helper.TransformHelper; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; @@ -22,6 +22,6 @@ public void returnUpdateStateAndNotifyOthers(BlockState state, ServerLevel world return; } - EyeblossomHelper.notifyNearbyEyeblossoms(state, world, pos, random); + TransformHelper.notifyNearbyBlocks(state, world, pos, random); } } diff --git a/src/main/java/co/secretonline/tinyflowers/mixin/FlowerbedBlockMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/block/FlowerbedBlockMixin.java similarity index 96% rename from src/main/java/co/secretonline/tinyflowers/mixin/FlowerbedBlockMixin.java rename to common/src/main/java/co/secretonline/tinyflowers/mixin/block/FlowerbedBlockMixin.java index 5ef47d0f..e74f6668 100644 --- a/src/main/java/co/secretonline/tinyflowers/mixin/FlowerbedBlockMixin.java +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/block/FlowerbedBlockMixin.java @@ -1,4 +1,4 @@ -package co.secretonline.tinyflowers.mixin; +package co.secretonline.tinyflowers.mixin.block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/co/secretonline/tinyflowers/mixin/LeafLitterBlockMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/block/LeafLitterBlockMixin.java similarity index 96% rename from src/main/java/co/secretonline/tinyflowers/mixin/LeafLitterBlockMixin.java rename to common/src/main/java/co/secretonline/tinyflowers/mixin/block/LeafLitterBlockMixin.java index b4eb9339..549c9ea2 100644 --- a/src/main/java/co/secretonline/tinyflowers/mixin/LeafLitterBlockMixin.java +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/block/LeafLitterBlockMixin.java @@ -1,4 +1,4 @@ -package co.secretonline.tinyflowers.mixin; +package co.secretonline.tinyflowers.mixin.block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CrafterBlockMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CrafterBlockMixin.java new file mode 100644 index 00000000..73ec218f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CrafterBlockMixin.java @@ -0,0 +1,53 @@ +package co.secretonline.tinyflowers.mixin.crafting; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import co.secretonline.tinyflowers.item.crafting.CustomRecipeWithProvider; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeInput; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.CrafterBlock; + +@Mixin(CrafterBlock.class) +public class CrafterBlockMixin { + + @Unique + private static final ThreadLocal LEVEL_LOCAL = new ThreadLocal<>(); + + @Inject(method = "dispenseFrom(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;)V", at = @At("HEAD")) + private void captureLevel(BlockState state, ServerLevel level, BlockPos pos, CallbackInfo ci) { + LEVEL_LOCAL.set(level); + } + + @Inject(method = "dispenseFrom(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;)V", at = @At("RETURN")) + private void onMethodReturn(CallbackInfo ci) { + LEVEL_LOCAL.remove(); + } + + @WrapOperation(method = "dispenseFrom(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/crafting/CraftingRecipe;assemble(Lnet/minecraft/world/item/crafting/RecipeInput;)Lnet/minecraft/world/item/ItemStack;")) + private ItemStack redirectAssemble(CraftingRecipe recipe, RecipeInput input, + Operation original) { + ServerLevel level = LEVEL_LOCAL.get(); + if (level == null) { + return original.call(recipe, input); + } + + if (recipe instanceof CustomRecipeWithProvider customRecipeWithLevel + && input instanceof CraftingInput craftingInput) { + return customRecipeWithLevel.assemble(craftingInput, level.registryAccess()); + } + + return original.call(recipe, input); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CrafterMenuMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CrafterMenuMixin.java new file mode 100644 index 00000000..abf4c87f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CrafterMenuMixin.java @@ -0,0 +1,54 @@ +package co.secretonline.tinyflowers.mixin.crafting; + +import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import co.secretonline.tinyflowers.item.crafting.CustomRecipeWithProvider; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.inventory.CrafterMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeInput; + +@Mixin(CrafterMenu.class) +public class CrafterMenuMixin { + + @Unique + private static final ThreadLocal LEVEL_LOCAL = new ThreadLocal<>(); + + @WrapOperation(method = "refreshRecipeResult()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/CrafterBlock;getPotentialResults(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/item/crafting/CraftingInput;)Ljava/util/Optional;")) + private Optional captureAndGetPotentialResults(ServerLevel level, CraftingInput input, + Operation> original) { + LEVEL_LOCAL.set(level); + return original.call(level, input); + } + + @Inject(method = "refreshRecipeResult()V", at = @At("RETURN")) + private void onMethodReturn(CallbackInfo ci) { + LEVEL_LOCAL.remove(); + } + + @WrapOperation(method = "lambda$refreshRecipeResult$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/crafting/CraftingRecipe;assemble(Lnet/minecraft/world/item/crafting/RecipeInput;)Lnet/minecraft/world/item/ItemStack;")) + private static ItemStack redirectAssemble(CraftingRecipe recipe, RecipeInput input, Operation original) { + ServerLevel level = LEVEL_LOCAL.get(); + if (level == null) { + return original.call(recipe, input); + } + + if (recipe instanceof CustomRecipeWithProvider customRecipeWithLevel + && input instanceof CraftingInput craftingInput) { + return customRecipeWithLevel.assemble(craftingInput, level.registryAccess()); + } + + return original.call(recipe, input); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CraftingMenuMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CraftingMenuMixin.java new file mode 100644 index 00000000..3e02471c --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/CraftingMenuMixin.java @@ -0,0 +1,58 @@ +package co.secretonline.tinyflowers.mixin.crafting; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import co.secretonline.tinyflowers.item.crafting.CustomRecipeWithProvider; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.inventory.ResultContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeInput; + +@Mixin(CraftingMenu.class) +public class CraftingMenuMixin { + + @Unique + private static final ThreadLocal LEVEL_LOCAL = new ThreadLocal<>(); + + @Inject(method = "slotChangedCraftingGrid(Lnet/minecraft/world/inventory/AbstractContainerMenu;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/inventory/CraftingContainer;Lnet/minecraft/world/inventory/ResultContainer;Lnet/minecraft/world/item/crafting/RecipeHolder;)V", at = @At("HEAD")) + private static void captureLevel(AbstractContainerMenu menu, ServerLevel level, Player player, + CraftingContainer container, ResultContainer resultSlots, RecipeHolder recipeHint, + CallbackInfo ci) { + LEVEL_LOCAL.set(level); + } + + @Inject(method = "slotChangedCraftingGrid(Lnet/minecraft/world/inventory/AbstractContainerMenu;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/inventory/CraftingContainer;Lnet/minecraft/world/inventory/ResultContainer;Lnet/minecraft/world/item/crafting/RecipeHolder;)V", at = @At("RETURN")) + private static void onMethodReturn(CallbackInfo ci) { + LEVEL_LOCAL.remove(); + } + + @WrapOperation(method = "slotChangedCraftingGrid(Lnet/minecraft/world/inventory/AbstractContainerMenu;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/inventory/CraftingContainer;Lnet/minecraft/world/inventory/ResultContainer;Lnet/minecraft/world/item/crafting/RecipeHolder;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/crafting/CraftingRecipe;assemble(Lnet/minecraft/world/item/crafting/RecipeInput;)Lnet/minecraft/world/item/ItemStack;")) + private static ItemStack redirectAssemble(CraftingRecipe recipe, RecipeInput input, + Operation original) { + ServerLevel level = LEVEL_LOCAL.get(); + if (level == null) { + return original.call(recipe, input); + } + + if (recipe instanceof CustomRecipeWithProvider customRecipeWithLevel + && input instanceof CraftingInput craftingInput) { + return customRecipeWithLevel.assemble(craftingInput, level.registryAccess()); + } + + return original.call(recipe, input); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/DyeColorMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/DyeColorMixin.java new file mode 100644 index 00000000..e2f6070f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/crafting/DyeColorMixin.java @@ -0,0 +1,53 @@ +package co.secretonline.tinyflowers.mixin.crafting; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import co.secretonline.tinyflowers.item.crafting.CustomRecipeWithProvider; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeInput; + +@Mixin(DyeColor.class) +public class DyeColorMixin { + + @Unique + private static final ThreadLocal LEVEL_LOCAL = new ThreadLocal<>(); + + @Inject(method = "findColorMixInRecipes(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/item/DyeColor;)Lnet/minecraft/world/item/DyeColor;", at = @At("HEAD")) + private static void captureLevel(ServerLevel level, DyeColor dyeColor1, DyeColor dyeColor2, + CallbackInfoReturnable cir) { + LEVEL_LOCAL.set(level); + } + + @Inject(method = "findColorMixInRecipes(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/item/DyeColor;)Lnet/minecraft/world/item/DyeColor;", at = @At("RETURN")) + private static void onMethodReturn(ServerLevel level, DyeColor dyeColor1, DyeColor dyeColor2, + CallbackInfoReturnable cir) { + LEVEL_LOCAL.remove(); + } + + @WrapOperation(method = "findColorMixInRecipes(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/item/DyeColor;)Lnet/minecraft/world/item/DyeColor;", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/crafting/CraftingRecipe;assemble(Lnet/minecraft/world/item/crafting/RecipeInput;)Lnet/minecraft/world/item/ItemStack;")) + private static ItemStack redirectAssemble(CraftingRecipe recipe, RecipeInput input, + Operation original) { + ServerLevel level = LEVEL_LOCAL.get(); + if (level == null) { + return original.call(recipe, input); + } + + if (recipe instanceof CustomRecipeWithProvider customRecipeWithLevel + && input instanceof CraftingInput craftingInput) { + return customRecipeWithLevel.assemble(craftingInput, level.registryAccess()); + } + + return original.call(recipe, input); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/datagen/ModelProviderMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/datagen/ModelProviderMixin.java new file mode 100644 index 00000000..da75b77e --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/datagen/ModelProviderMixin.java @@ -0,0 +1,29 @@ +package co.secretonline.tinyflowers.mixin.datagen; + +import co.secretonline.tinyflowers.datagen.providers.PartialModelProvider; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import net.minecraft.client.data.models.ModelProvider; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ModelProvider.class) +public class ModelProviderMixin { + + @WrapWithCondition(method = "run",at = @At(value = "INVOKE", target = "Lnet/minecraft/client/data/models/ModelProvider$BlockStateGeneratorCollector;validate()V")) + private boolean wrapRunBlockGenerate(ModelProvider.BlockStateGeneratorCollector instance) { + if (this instanceof PartialModelProvider provider) { + return provider.shouldValidateAllEntries(); + } + + return true; + } + + @WrapWithCondition(method = "run",at = @At(value = "INVOKE", target = "Lnet/minecraft/client/data/models/ModelProvider$ItemInfoCollector;finalizeAndValidate()V")) + private boolean wrapRunBlockGenerate(ModelProvider.ItemInfoCollector instance) { + if (this instanceof PartialModelProvider provider) { + return provider.shouldValidateAllEntries(); + } + + return true; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/item/CreativeModeTabsMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/item/CreativeModeTabsMixin.java new file mode 100644 index 00000000..dc30c68a --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/item/CreativeModeTabsMixin.java @@ -0,0 +1,23 @@ +package co.secretonline.tinyflowers.mixin.item; + +import java.util.stream.Stream; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; + +@Mixin(CreativeModeTabs.class) +public class CreativeModeTabsMixin { + + @ModifyReturnValue(method = "streamAllTabs", at = @At("RETURN")) + private static Stream sortStreamAllTabs(Stream tabStream) { + return tabStream.sorted((a, b) -> Boolean.compare( + a.getIconItem().is(ModItems.TINY_FLOWER_ITEM.get()), + b.getIconItem().is(ModItems.TINY_FLOWER_ITEM.get()))); + } +} diff --git a/src/main/java/co/secretonline/tinyflowers/mixin/ItemStackMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/item/ItemStackMixin.java similarity index 89% rename from src/main/java/co/secretonline/tinyflowers/mixin/ItemStackMixin.java rename to common/src/main/java/co/secretonline/tinyflowers/mixin/item/ItemStackMixin.java index a77c7433..cfd3e937 100644 --- a/src/main/java/co/secretonline/tinyflowers/mixin/ItemStackMixin.java +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/item/ItemStackMixin.java @@ -1,4 +1,4 @@ -package co.secretonline.tinyflowers.mixin; +package co.secretonline.tinyflowers.mixin.item; import java.util.function.Consumer; import net.minecraft.network.chat.Component; @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import co.secretonline.tinyflowers.components.ModComponents; +import co.secretonline.tinyflowers.item.component.ModComponents; @Mixin(ItemStack.class) public class ItemStackMixin { @@ -25,7 +25,7 @@ private void injectCustomTooltip( Consumer textConsumer, CallbackInfo ci) { ((ItemStack) (Object) this).addToTooltip( - ModComponents.TINY_FLOWERS_COMPONENT_TYPE, + ModComponents.GARDEN_CONTENTS.get(), context, displayComponent, textConsumer, diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/item/ModelBakeryMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/item/ModelBakeryMixin.java new file mode 100644 index 00000000..08ced1b3 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/item/ModelBakeryMixin.java @@ -0,0 +1,38 @@ +package co.secretonline.tinyflowers.mixin.item; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.helper.ItemModelHelper; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.renderer.item.ItemModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.resources.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ModelBakery.class) +public class ModelBakeryMixin { + @Unique + private final static Identifier TINY_FLOWER_ID = TinyFlowers.id("tiny_flower"); + + /** + * Intercept item model baking to replace the tiny_flower item model with + * our dynamic select model. + */ + @WrapOperation(method = "lambda$bakeModels$1", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/item/ItemModel$Unbaked;bake(Lnet/minecraft/client/renderer/item/ItemModel$BakingContext;)Lnet/minecraft/client/renderer/item/ItemModel;")) + private ItemModel tinyFlowers_modifyItemModel( + ItemModel.Unbaked unbakedModel, + ItemModel.BakingContext bakeContext, + Operation operation, + @Local(argsOnly = true) Identifier itemId) { + if (itemId.equals(TINY_FLOWER_ID)) { + ItemModel.Unbaked customModel = ItemModelHelper.createTinyFlowerItemModel(); + return customModel.bake(bakeContext); + } + return operation.call(unbakedModel, bakeContext); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/mixin/particle/TerrainParticleMixin.java b/common/src/main/java/co/secretonline/tinyflowers/mixin/particle/TerrainParticleMixin.java new file mode 100644 index 00000000..11ea311a --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/mixin/particle/TerrainParticleMixin.java @@ -0,0 +1,33 @@ +package co.secretonline.tinyflowers.mixin.particle; + +import co.secretonline.tinyflowers.helper.ParticleHelper; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.SingleQuadParticle; +import net.minecraft.client.particle.TerrainParticle; +import net.minecraft.client.renderer.block.BlockModelShaper; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import org.jspecify.annotations.NonNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(TerrainParticle.class) +abstract class TerrainParticleMixin extends SingleQuadParticle { + protected TerrainParticleMixin(ClientLevel level, double x, double y, double z, TextureAtlasSprite sprite) { + super(level, x, y, z, sprite); + throw new Error("Should not directly instantiate mixin"); + } + + @WrapOperation(method = "(Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/block/BlockModelShaper;getParticleIcon(Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;")) + private static @NonNull TextureAtlasSprite replaceSprite(BlockModelShaper instance, BlockState blockState, Operation original, + @Local(argsOnly = true) ClientLevel level, @Local(argsOnly = true) BlockPos blockPos) { + TextureAtlasSprite overrideSprite = ParticleHelper.getOverrideSprite(level, blockPos); + return overrideSprite == null + ? original.call(instance, blockState) + : overrideSprite; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/platform/AccessHelper.java b/common/src/main/java/co/secretonline/tinyflowers/platform/AccessHelper.java new file mode 100644 index 00000000..f38aff15 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/platform/AccessHelper.java @@ -0,0 +1,16 @@ +package co.secretonline.tinyflowers.platform; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.function.BiFunction; + +/** + * Some Minecraft methods are private, but loaders have their own ways of achieving the same thing. + */ +public interface AccessHelper { + BlockEntityType createBlockEntityType(BiFunction entityFactory, Block... blocks); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/platform/DeferredRegistryObject.java b/common/src/main/java/co/secretonline/tinyflowers/platform/DeferredRegistryObject.java new file mode 100644 index 00000000..6f8ead8f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/platform/DeferredRegistryObject.java @@ -0,0 +1,7 @@ +package co.secretonline.tinyflowers.platform; + +import java.util.function.Supplier; + +public interface DeferredRegistryObject extends Supplier { + T get(); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/platform/FlowerModelHelper.java b/common/src/main/java/co/secretonline/tinyflowers/platform/FlowerModelHelper.java new file mode 100644 index 00000000..bb95dd19 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/platform/FlowerModelHelper.java @@ -0,0 +1,15 @@ +package co.secretonline.tinyflowers.platform; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.resources.Identifier; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +public interface FlowerModelHelper { + void registerModel(@NonNull Identifier id, @NonNull T context); + + void clear(); + + @Nullable BlockStateModel getModel(@NonNull Minecraft client, @NonNull Identifier id); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/platform/RegistryHelper.java b/common/src/main/java/co/secretonline/tinyflowers/platform/RegistryHelper.java new file mode 100644 index 00000000..ebd6c6cf --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/platform/RegistryHelper.java @@ -0,0 +1,13 @@ +package co.secretonline.tinyflowers.platform; + +import net.minecraft.core.Registry; +import net.minecraft.resources.Identifier; + +import java.util.function.Supplier; + +/** + * Both (Neo)Forge and Fabric have their own ways of registering things to the registry, with not much overlap. + */ +public interface RegistryHelper { + DeferredRegistryObject register(Registry objRegistry, Identifier id, Supplier objSupplier); +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/platform/Services.java b/common/src/main/java/co/secretonline/tinyflowers/platform/Services.java new file mode 100644 index 00000000..d0af174d --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/platform/Services.java @@ -0,0 +1,18 @@ +package co.secretonline.tinyflowers.platform; + +import java.util.ServiceLoader; + +public class Services { + + public static final AccessHelper PLATFORM_REGISTRATION = load(AccessHelper.class); + + public static final RegistryHelper REGISTRY = load(RegistryHelper.class); + + public static final FlowerModelHelper FLOWER_MODELS = load(FlowerModelHelper.class); + + public static T load(Class clazz) { + return ServiceLoader.load(clazz, clazz.getClassLoader()) + .findFirst() + .orElseThrow(() -> new NullPointerException("Failed to load service for " + clazz.getName())); + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/ModBlockEntityRenderers.java b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/ModBlockEntityRenderers.java new file mode 100644 index 00000000..408293c5 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/ModBlockEntityRenderers.java @@ -0,0 +1,21 @@ +package co.secretonline.tinyflowers.renderer.blockentity; + +import co.secretonline.tinyflowers.block.entity.ModBlockEntities; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class ModBlockEntityRenderers { + public static void registerClient(Consumer> register) { + register.accept(new BlockEntityRenderInfo<>(ModBlockEntities.TINY_GARDEN_BLOCK_ENTITY, TinyGardenBlockEntityRenderer::new)); + } + + public record BlockEntityRenderInfo( + Supplier> typeSupplier, + BlockEntityRendererProvider renderer) { + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenBlockEntityRenderState.java b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenBlockEntityRenderState.java new file mode 100644 index 00000000..78b6080e --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenBlockEntityRenderState.java @@ -0,0 +1,67 @@ +package co.secretonline.tinyflowers.renderer.blockentity; + +import org.jspecify.annotations.Nullable; + +import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; +import net.minecraft.core.Direction; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.EmptyBlockAndTintGetter; + +public class TinyGardenBlockEntityRenderState extends BlockEntityRenderState { + private Direction direction = Direction.NORTH; + + @Nullable + private Identifier flower1 = null; + @Nullable + private Identifier flower2 = null; + @Nullable + private Identifier flower3 = null; + @Nullable + private Identifier flower4 = null; + @Nullable + private BlockAndTintGetter blockAndTintGetter = null; + + public Direction getDirection() { + return direction; + } + + public @Nullable Identifier getFlower1() { + return flower1; + } + + public @Nullable Identifier getFlower2() { + return flower2; + } + + public @Nullable Identifier getFlower3() { + return flower3; + } + + public @Nullable Identifier getFlower4() { + return flower4; + } + + public BlockAndTintGetter getBlockAndTintGetter() { + if (blockAndTintGetter == null) { + return EmptyBlockAndTintGetter.INSTANCE; + } + + return blockAndTintGetter; + } + + public void setDirection(Direction direction) { + this.direction = direction; + } + + public void setFlowers(Identifier flower1, Identifier flower2, Identifier flower3, Identifier flower4) { + this.flower1 = flower1; + this.flower2 = flower2; + this.flower3 = flower3; + this.flower4 = flower4; + } + + public void setBlockAndTintGetter(@Nullable BlockAndTintGetter getter) { + this.blockAndTintGetter = getter; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenBlockEntityRenderer.java b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenBlockEntityRenderer.java new file mode 100644 index 00000000..5492b90a --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenBlockEntityRenderer.java @@ -0,0 +1,125 @@ +package co.secretonline.tinyflowers.renderer.blockentity; + +import co.secretonline.tinyflowers.TinyFlowersClientState; +import co.secretonline.tinyflowers.block.TinyGardenBlock; +import co.secretonline.tinyflowers.block.entity.TinyGardenBlockEntity; +import co.secretonline.tinyflowers.platform.Services; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer.CrumblingOverlay; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.state.CameraRenderState; +import net.minecraft.core.Direction; +import net.minecraft.resources.Identifier; +import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.Optional; + +public class TinyGardenBlockEntityRenderer + implements BlockEntityRenderer { + + public TinyGardenBlockEntityRenderer(BlockEntityRendererProvider.Context context) { + } + + @Override + public TinyGardenBlockEntityRenderState createRenderState() { + return new TinyGardenBlockEntityRenderState(); + } + + @Override + public void extractRenderState(TinyGardenBlockEntity blockEntity, + TinyGardenBlockEntityRenderState state, float tickProgress, @NonNull Vec3 cameraPos, + @Nullable CrumblingOverlay crumblingOverlay) { + BlockEntityRenderer.super.extractRenderState(blockEntity, state, tickProgress, cameraPos, crumblingOverlay); + + Optional facingDirection = state.blockState.getOptionalValue(TinyGardenBlock.FACING); + if (facingDirection.isPresent()) { + state.setDirection(facingDirection.get()); + } + + state.setFlowers(blockEntity.getFlower(1), blockEntity.getFlower(2), + blockEntity.getFlower(3), blockEntity.getFlower(4)); + + state.setBlockAndTintGetter(blockEntity.getLevel()); + } + + @Override + public void submit(TinyGardenBlockEntityRenderState blockEntityRenderState, PoseStack poseStack, + @NonNull SubmitNodeCollector submitNodeCollector, @NonNull CameraRenderState cameraRenderState) { + poseStack.pushPose(); + + poseStack.translate(0.5, 0, 0.5); + float rotationDegrees = Direction.getYRot(blockEntityRenderState.getDirection()); + poseStack.mulPose(Axis.YP.rotationDegrees(180 - rotationDegrees)); + poseStack.translate(-0.5, 0, -0.5); + + submitPartForFlowerIndex(blockEntityRenderState, poseStack, submitNodeCollector, 1); + submitPartForFlowerIndex(blockEntityRenderState, poseStack, submitNodeCollector, 2); + submitPartForFlowerIndex(blockEntityRenderState, poseStack, submitNodeCollector, 3); + submitPartForFlowerIndex(blockEntityRenderState, poseStack, submitNodeCollector, 4); + + poseStack.popPose(); + } + + private void submitPartForFlowerIndex(TinyGardenBlockEntityRenderState state, PoseStack poseStack, + SubmitNodeCollector submitNodeCollector, int index) { + Identifier id = switch (index) { + case 1 -> state.getFlower1(); + case 2 -> state.getFlower2(); + case 3 -> state.getFlower3(); + case 4 -> state.getFlower4(); + default -> throw new IllegalArgumentException("Invalid flower index " + index); + }; + if (id == null) { + return; + } + + TinyFlowerResources resources = TinyFlowersClientState.RESOURCE_INSTANCES.get(id); + if (resources == null) { + return; + } + + Identifier partId = switch (index) { + case 1 -> resources.model1(); + case 2 -> resources.model2(); + case 3 -> resources.model3(); + case 4 -> resources.model4(); + default -> throw new IllegalArgumentException("Invalid flower index " + index); + }; + if (partId == null) { + return; + } + + Minecraft minecraft = Minecraft.getInstance(); + BlockStateModel model = Services.FLOWER_MODELS.getModel(minecraft, partId); + if (model == null) { + return; + } + + int packedTint = TinyGardenColorProvider.getColor(state.blockState, state.getBlockAndTintGetter(), state.blockPos, resources.tintSource()); + float r = ((packedTint & 0xFF0000) >> 16) / 255f; + float g = ((packedTint & 0xFF00) >> 8) / 255f; + float b = (packedTint & 0xFF) / 255f; + + submitNodeCollector.submitBlockModel(poseStack, RenderTypes.cutoutMovingBlock(), model, + r, g, b, + state.lightCoords, 0, 0); + } + + @Override + public int getViewDistance() { + // Hopefully this is far enough? + // I know the whole reason this exists is for performance, but I think it's a + // bit sad if distant gardens aren't rendered in. Expecially since these are + // mean to be part of the world, which usually doesn't distance culling. + return 256; + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenColorProvider.java b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenColorProvider.java new file mode 100644 index 00000000..73b9895f --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/renderer/blockentity/TinyGardenColorProvider.java @@ -0,0 +1,40 @@ +package co.secretonline.tinyflowers.renderer.blockentity; + +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.DryFoliageColor; +import net.minecraft.world.level.GrassColor; +import net.minecraft.world.level.block.state.BlockState; + +public class TinyGardenColorProvider { + public static int getColor(@NonNull BlockState state, @Nullable BlockAndTintGetter world, @Nullable BlockPos pos, TinyFlowerResources.TintSource source) { + // Loosely based on Pink Petals in net.minecraft.client.color.block.BlockColors + + boolean useDefaultColors = world == null || pos == null; + + switch (source) { + case TinyFlowerResources.TintSource.GRASS -> { + if (useDefaultColors) { + return GrassColor.getDefaultColor(); + } else { + return BiomeColors.getAverageGrassColor(world, pos); + } + } + case TinyFlowerResources.TintSource.DRY_FOLIAGE -> { + if (useDefaultColors) { + return DryFoliageColor.get(0.5, 1.0); + } else { + return BiomeColors.getAverageDryFoliageColor(world, pos); + } + } + default -> { + return -1; + } + } + } +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/renderer/item/ModSelectItemModelProperties.java b/common/src/main/java/co/secretonline/tinyflowers/renderer/item/ModSelectItemModelProperties.java new file mode 100644 index 00000000..61bdd852 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/renderer/item/ModSelectItemModelProperties.java @@ -0,0 +1,10 @@ +package co.secretonline.tinyflowers.renderer.item; + +import co.secretonline.tinyflowers.TinyFlowers; +import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty; +import net.minecraft.resources.Identifier; + +public class ModSelectItemModelProperties { + public static final Identifier TINY_FLOWER_PROPERTY_ID = TinyFlowers.id("tiny_flower"); + public static final SelectItemModelProperty.Type TINY_FLOWER_PROPERTY = TinyFlowerProperty.TYPE; +} diff --git a/common/src/main/java/co/secretonline/tinyflowers/renderer/item/TinyFlowerProperty.java b/common/src/main/java/co/secretonline/tinyflowers/renderer/item/TinyFlowerProperty.java new file mode 100644 index 00000000..e48a0fd3 --- /dev/null +++ b/common/src/main/java/co/secretonline/tinyflowers/renderer/item/TinyFlowerProperty.java @@ -0,0 +1,41 @@ +package co.secretonline.tinyflowers.renderer.item; + +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; + +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.component.TinyFlowerComponent; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; + +public record TinyFlowerProperty() implements SelectItemModelProperty { + public static final Codec VALUE_CODEC = Identifier.CODEC.xmap( + TinyFlowerComponent::new, + TinyFlowerComponent::id); + public static final SelectItemModelProperty.Type TYPE = Type + .create(MapCodec.unit(new TinyFlowerProperty()), VALUE_CODEC); + + @Override + public @Nullable TinyFlowerComponent get(ItemStack itemStack, @Nullable ClientLevel clientLevel, + @Nullable LivingEntity entity, int i, @NonNull ItemDisplayContext ctx) { + return itemStack.get(ModComponents.TINY_FLOWER.get()); + } + + @Override + public @NonNull Type, TinyFlowerComponent> type() { + return TYPE; + } + + @Override + public @NonNull Codec valueCodec() { + return VALUE_CODEC; + } + +} diff --git a/common/src/main/resources/META-INF/accesstransformer.cfg b/common/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..c78140c9 --- /dev/null +++ b/common/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,3 @@ +public net.minecraft.client.resources.model.ModelBakery$ModelBakerImpl +public net.minecraft.client.data.models.ModelProvider$BlockStateGeneratorCollector +public net.minecraft.client.data.models.ModelProvider$ItemInfoCollector diff --git a/src/main/resources/assets/tiny-flowers/icon.png b/common/src/main/resources/assets/tiny_flowers/icon.png similarity index 100% rename from src/main/resources/assets/tiny-flowers/icon.png rename to common/src/main/resources/assets/tiny_flowers/icon.png diff --git a/common/src/main/resources/assets/tiny_flowers/lang/de_at.json b/common/src/main/resources/assets/tiny_flowers/lang/de_at.json new file mode 100644 index 00000000..fbd0c664 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/lang/de_at.json @@ -0,0 +1,25 @@ +{ + "modmenu.descriptionTranslation.tiny_flowers": "Fügt winzige Varianten aller Vanilla-Blumen hinzu.", + "itemGroup.tiny_flowers": "Winzige Blumen", + "item.tiny_flowers.florists_shears": "Floristenschere", + "block.tiny_flowers.tiny_garden": "Winziger Garten", + "block.tiny_flowers.tiny_garden.empty": "Leer", + "block.tiny_flowers.tiny_flower": "Winzige Blume", + "block.tiny_flowers.tiny_cactus_flower": "Winzige Kaktusblüte", + "block.tiny_flowers.tiny_dandelion": "Winziger Löwenzahn", + "block.tiny_flowers.tiny_poppy": "Winziger Mohn", + "block.tiny_flowers.tiny_blue_orchid": "Winzige blaue Orchidee", + "block.tiny_flowers.tiny_allium": "Winziger Zierlauch", + "block.tiny_flowers.tiny_azure_bluet": "Winzige Porzellansternchen", + "block.tiny_flowers.tiny_red_tulip": "Winzige rote Tulpe", + "block.tiny_flowers.tiny_orange_tulip": "Winzige orange Tulpe", + "block.tiny_flowers.tiny_white_tulip": "Winzige weiße Tulpe", + "block.tiny_flowers.tiny_pink_tulip": "Winzige rosa Tulpe", + "block.tiny_flowers.tiny_oxeye_daisy": "Winzige Margerite", + "block.tiny_flowers.tiny_cornflower": "Winzige Kornblume", + "block.tiny_flowers.tiny_lily_of_the_valley": "Winziges Maiglöckchen", + "block.tiny_flowers.tiny_torchflower": "Winzige Fackellilie", + "block.tiny_flowers.tiny_open_eyeblossom": "Winzige geöffnete Augenblüte", + "block.tiny_flowers.tiny_closed_eyeblossom": "Winzige geschlossene Augenblüte", + "block.tiny_flowers.tiny_wither_rose": "Winzige Wither-Rose" +} diff --git a/common/src/main/resources/assets/tiny_flowers/lang/de_ch.json b/common/src/main/resources/assets/tiny_flowers/lang/de_ch.json new file mode 100644 index 00000000..fbd0c664 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/lang/de_ch.json @@ -0,0 +1,25 @@ +{ + "modmenu.descriptionTranslation.tiny_flowers": "Fügt winzige Varianten aller Vanilla-Blumen hinzu.", + "itemGroup.tiny_flowers": "Winzige Blumen", + "item.tiny_flowers.florists_shears": "Floristenschere", + "block.tiny_flowers.tiny_garden": "Winziger Garten", + "block.tiny_flowers.tiny_garden.empty": "Leer", + "block.tiny_flowers.tiny_flower": "Winzige Blume", + "block.tiny_flowers.tiny_cactus_flower": "Winzige Kaktusblüte", + "block.tiny_flowers.tiny_dandelion": "Winziger Löwenzahn", + "block.tiny_flowers.tiny_poppy": "Winziger Mohn", + "block.tiny_flowers.tiny_blue_orchid": "Winzige blaue Orchidee", + "block.tiny_flowers.tiny_allium": "Winziger Zierlauch", + "block.tiny_flowers.tiny_azure_bluet": "Winzige Porzellansternchen", + "block.tiny_flowers.tiny_red_tulip": "Winzige rote Tulpe", + "block.tiny_flowers.tiny_orange_tulip": "Winzige orange Tulpe", + "block.tiny_flowers.tiny_white_tulip": "Winzige weiße Tulpe", + "block.tiny_flowers.tiny_pink_tulip": "Winzige rosa Tulpe", + "block.tiny_flowers.tiny_oxeye_daisy": "Winzige Margerite", + "block.tiny_flowers.tiny_cornflower": "Winzige Kornblume", + "block.tiny_flowers.tiny_lily_of_the_valley": "Winziges Maiglöckchen", + "block.tiny_flowers.tiny_torchflower": "Winzige Fackellilie", + "block.tiny_flowers.tiny_open_eyeblossom": "Winzige geöffnete Augenblüte", + "block.tiny_flowers.tiny_closed_eyeblossom": "Winzige geschlossene Augenblüte", + "block.tiny_flowers.tiny_wither_rose": "Winzige Wither-Rose" +} diff --git a/common/src/main/resources/assets/tiny_flowers/lang/de_de.json b/common/src/main/resources/assets/tiny_flowers/lang/de_de.json new file mode 100644 index 00000000..fbd0c664 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/lang/de_de.json @@ -0,0 +1,25 @@ +{ + "modmenu.descriptionTranslation.tiny_flowers": "Fügt winzige Varianten aller Vanilla-Blumen hinzu.", + "itemGroup.tiny_flowers": "Winzige Blumen", + "item.tiny_flowers.florists_shears": "Floristenschere", + "block.tiny_flowers.tiny_garden": "Winziger Garten", + "block.tiny_flowers.tiny_garden.empty": "Leer", + "block.tiny_flowers.tiny_flower": "Winzige Blume", + "block.tiny_flowers.tiny_cactus_flower": "Winzige Kaktusblüte", + "block.tiny_flowers.tiny_dandelion": "Winziger Löwenzahn", + "block.tiny_flowers.tiny_poppy": "Winziger Mohn", + "block.tiny_flowers.tiny_blue_orchid": "Winzige blaue Orchidee", + "block.tiny_flowers.tiny_allium": "Winziger Zierlauch", + "block.tiny_flowers.tiny_azure_bluet": "Winzige Porzellansternchen", + "block.tiny_flowers.tiny_red_tulip": "Winzige rote Tulpe", + "block.tiny_flowers.tiny_orange_tulip": "Winzige orange Tulpe", + "block.tiny_flowers.tiny_white_tulip": "Winzige weiße Tulpe", + "block.tiny_flowers.tiny_pink_tulip": "Winzige rosa Tulpe", + "block.tiny_flowers.tiny_oxeye_daisy": "Winzige Margerite", + "block.tiny_flowers.tiny_cornflower": "Winzige Kornblume", + "block.tiny_flowers.tiny_lily_of_the_valley": "Winziges Maiglöckchen", + "block.tiny_flowers.tiny_torchflower": "Winzige Fackellilie", + "block.tiny_flowers.tiny_open_eyeblossom": "Winzige geöffnete Augenblüte", + "block.tiny_flowers.tiny_closed_eyeblossom": "Winzige geschlossene Augenblüte", + "block.tiny_flowers.tiny_wither_rose": "Winzige Wither-Rose" +} diff --git a/common/src/main/resources/assets/tiny_flowers/lang/en_us.json b/common/src/main/resources/assets/tiny_flowers/lang/en_us.json new file mode 100644 index 00000000..d2c53c77 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/lang/en_us.json @@ -0,0 +1,25 @@ +{ + "modmenu.descriptionTranslation.tiny_flowers": "Add tiny variants of all Vanilla flowers.", + "itemGroup.tiny_flowers": "Tiny Flowers", + "item.tiny_flowers.florists_shears": "Florists' Shears", + "block.tiny_flowers.tiny_garden": "Tiny Garden", + "block.tiny_flowers.tiny_garden.empty": "Empty", + "block.tiny_flowers.tiny_flower": "Tiny Flower", + "block.tiny_flowers.tiny_cactus_flower": "Tiny Cactus Flower", + "block.tiny_flowers.tiny_dandelion": "Tiny Dandelion", + "block.tiny_flowers.tiny_poppy": "Tiny Poppy", + "block.tiny_flowers.tiny_blue_orchid": "Tiny Blue Orchid", + "block.tiny_flowers.tiny_allium": "Tiny Allium", + "block.tiny_flowers.tiny_azure_bluet": "Tiny Azure Bluet", + "block.tiny_flowers.tiny_red_tulip": "Tiny Red Tulip", + "block.tiny_flowers.tiny_orange_tulip": "Tiny Orange Tulip", + "block.tiny_flowers.tiny_white_tulip": "Tiny White Tulip", + "block.tiny_flowers.tiny_pink_tulip": "Tiny Pink Tulip", + "block.tiny_flowers.tiny_oxeye_daisy": "Tiny Oxeye Daisy", + "block.tiny_flowers.tiny_cornflower": "Tiny Cornflower", + "block.tiny_flowers.tiny_lily_of_the_valley": "Tiny Lily of the Valley", + "block.tiny_flowers.tiny_torchflower": "Tiny Torchflower", + "block.tiny_flowers.tiny_open_eyeblossom": "Tiny Open Eyeblossom", + "block.tiny_flowers.tiny_closed_eyeblossom": "Tiny Closed Eyeblossom", + "block.tiny_flowers.tiny_wither_rose": "Tiny Wither Rose" +} diff --git a/common/src/main/resources/assets/tiny_flowers/lang/zh_cn.json b/common/src/main/resources/assets/tiny_flowers/lang/zh_cn.json new file mode 100644 index 00000000..beefddd2 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/lang/zh_cn.json @@ -0,0 +1,25 @@ +{ + "modmenu.descriptionTranslation.tiny_flowers": "为所有原版花卉添加微缩变种。", + "itemGroup.tiny_flowers": "微缩花卉", + "item.tiny_flowers.florists_shears": "花匠剪刀", + "block.tiny_flowers.tiny_garden": "微缩花园", + "block.tiny_flowers.tiny_garden.empty": "空", + "block.tiny_flowers.tiny_flower": "微缩花", + "block.tiny_flowers.tiny_cactus_flower": "微缩仙人掌花", + "block.tiny_flowers.tiny_dandelion": "微缩蒲公英", + "block.tiny_flowers.tiny_poppy": "微缩虞美人", + "block.tiny_flowers.tiny_blue_orchid": "微缩兰花", + "block.tiny_flowers.tiny_allium": "微缩绒球葱", + "block.tiny_flowers.tiny_azure_bluet": "微缩蓝花美耳草", + "block.tiny_flowers.tiny_red_tulip": "微缩红色郁金香", + "block.tiny_flowers.tiny_orange_tulip": "微缩橙色郁金香", + "block.tiny_flowers.tiny_white_tulip": "微缩白色郁金香", + "block.tiny_flowers.tiny_pink_tulip": "微缩粉红色郁金香", + "block.tiny_flowers.tiny_oxeye_daisy": "微缩滨菊", + "block.tiny_flowers.tiny_cornflower": "微缩矢车菊", + "block.tiny_flowers.tiny_lily_of_the_valley": "微缩铃兰", + "block.tiny_flowers.tiny_torchflower": "微缩火把花", + "block.tiny_flowers.tiny_open_eyeblossom": "张开的微缩眼眸花", + "block.tiny_flowers.tiny_closed_eyeblossom": "闭合的微缩眼眸花", + "block.tiny_flowers.tiny_wither_rose": "微缩凋灵玫瑰" +} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_1.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_1.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_1.json index b9667fa5..b8445daf 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_1.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_1.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "minecraft:block/pink_petals_stem" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_2.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_2.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_2.json index dc63747c..b6a29365 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_2.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_2.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "minecraft:block/pink_petals_stem" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_3.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_3.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_3.json index af2ece66..0bdace09 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_3.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_3.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "minecraft:block/pink_petals_stem" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_4.json similarity index 94% rename from src/client/resources/assets/tiny-flowers/models/block/garden_4.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_4.json index aedac18e..5de649f0 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_4.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_4.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "minecraft:block/pink_petals_stem" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_1.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_1.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_1.json index 2ed410e2..cfe28653 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_1.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_1.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_2.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_2.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_2.json index 3f16b6d3..ad9389b8 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_2.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_2.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_3.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_3.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_3.json index 7b9ed89d..679084e8 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_3.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_3.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_4.json similarity index 94% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_4.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_4.json index f7f4c90f..29a632ac 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_4.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_4.json @@ -1,5 +1,9 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_1.json similarity index 97% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_1.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_1.json index 2111e335..66583798 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_1.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_1.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_2.json similarity index 98% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_2.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_2.json index eaaf1bf5..58ec9949 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_2.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_2.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_3.json similarity index 98% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_3.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_3.json index c9dbd9ee..740f5df5 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_3.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_3.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_4.json similarity index 97% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_4.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_4.json index ba514d1b..e3b0ec43 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_4.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_4.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_1.json similarity index 98% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_1.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_1.json index 52e95b73..ed2e3f3f 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_1.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_1.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_2.json similarity index 98% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_2.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_2.json index a97548ab..7ea8eb34 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_2.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_2.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_3.json similarity index 98% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_3.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_3.json index 9ebda53e..cccda321 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_3.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_3.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_4.json similarity index 97% rename from src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_4.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_4.json index c8abb90e..82529f5d 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_double_untinted_glow_4.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_double_untinted_glow_4.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower_upper", diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_1.json new file mode 100644 index 00000000..711121ae --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_1.json @@ -0,0 +1,17 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [0, 0.25, 0], + "to": [8, 0.25, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed", "tintindex": 2 }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed", "tintindex": 2 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_2.json new file mode 100644 index 00000000..01f9c5ea --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_2.json @@ -0,0 +1,17 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [0, 0.25, 8], + "to": [8, 0.25, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed", "tintindex": 2 }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed", "tintindex": 2 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_3.json new file mode 100644 index 00000000..76fe28e9 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_3.json @@ -0,0 +1,21 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [8, 0.25, 8], + "to": [16, 0.25, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed", "tintindex": 2 }, + "down": { + "uv": [8, 16, 16, 8], + "texture": "#flowerbed", + "tintindex": 2 + } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_4.json new file mode 100644 index 00000000..ec591048 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_leaf_litter_4.json @@ -0,0 +1,17 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [8, 0.25, 0], + "to": [16, 0.25, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed", "tintindex": 2 }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed", "tintindex": 2 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_1.json new file mode 100644 index 00000000..8fd4ff0c --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_1.json @@ -0,0 +1,77 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [0, 1, 0], + "to": [8, 1, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [3.75, 0, -2.1], + "to": [4.75, 1, -2.1], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 6, 1, 7], "texture": "#stem" }, + "south": { "uv": [0, 6, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [4.25, 0, -2.6], + "to": [4.25, 1, -1.6], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 6, 1, 7], "texture": "#stem" }, + "west": { "uv": [0, 6, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [4.4, 0, 2.8], + "to": [5.4, 1, 2.8], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 5, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 5, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [4.9, 0, 2.3], + "to": [4.9, 1, 3.3], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 5, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 5, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem3_ns", + "from": [8.65, 0, 0.05], + "to": [9.65, 1, 0.05], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem3_ew", + "from": [9.15, 0, -0.45], + "to": [9.15, 1, 0.55], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_2.json new file mode 100644 index 00000000..f003279a --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_2.json @@ -0,0 +1,77 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [0, 1, 8], + "to": [8, 1, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [11.15, 0, 3.25], + "to": [12.15, 1, 3.25], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [11.65, 0, 2.75], + "to": [11.65, 1, 3.75], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [8.15, 0, 5.25], + "to": [9.15, 1, 5.25], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [8.65, 0, 4.75], + "to": [8.65, 1, 5.75], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem3_ns", + "from": [10.15, 0, 8.25], + "to": [11.15, 1, 8.25], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem3_ew", + "from": [10.65, 0, 7.75], + "to": [10.65, 1, 8.75], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_3.json new file mode 100644 index 00000000..66aa873d --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_3.json @@ -0,0 +1,77 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [8, 1, 8], + "to": [16, 1, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [12.9, 0, 0], + "to": [13.9, 1, 0], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [13.4, 0, -0.5], + "to": [13.4, 1, 0.5], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [17.15, 0, -2.85], + "to": [18.15, 1, -2.85], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 5, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 5, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [17.65, 0, -3.35], + "to": [17.65, 1, -2.35], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 5, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 5, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem3_ns", + "from": [17.65, 0, 1.9], + "to": [18.65, 1, 1.9], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem3_ew", + "from": [18.15, 0, 1.4], + "to": [18.15, 1, 2.4], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_4.json new file mode 100644 index 00000000..307dacfb --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_low_untinted_4.json @@ -0,0 +1,57 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower", + "from": [8, 1, 0], + "to": [16, 1, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [13.9, 0, -8.2], + "to": [14.9, 1, -8.2], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "north": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [14.4, 0, -8.7], + "to": [14.4, 1, -7.7], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "east": { "uv": [0, 4, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 4, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [10.9, 0, -5.2], + "to": [11.9, 1, -5.2], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "north": { "uv": [0, 5, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 5, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [11.4, 0, -5.7], + "to": [11.4, 1, -4.7], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "east": { "uv": [0, 5, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 5, 1, 6], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_1.json new file mode 100644 index 00000000..ac2a6de0 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_1.json @@ -0,0 +1,78 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower", + "from": [0, 6, 0], + "to": [8, 6, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [3.75, 0, -2.1], + "to": [4.75, 6, -2.1], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [4.25, 0, -2.6], + "to": [4.25, 6, -1.6], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [4.4, 0, 2.8], + "to": [5.4, 6, 2.8], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [4.9, 0, 2.3], + "to": [4.9, 6, 3.3], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ns", + "from": [8.65, 0, 0.05], + "to": [9.65, 6, 0.05], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ew", + "from": [9.15, 0, -0.45], + "to": [9.15, 6, 0.55], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_2.json new file mode 100644 index 00000000..552451b7 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_2.json @@ -0,0 +1,78 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower", + "from": [0, 4, 8], + "to": [8, 4, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [11.15, 0, 3.25], + "to": [12.15, 4, 3.25], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "north": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [11.65, 0, 2.75], + "to": [11.65, 4, 3.75], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "east": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [8.15, 0, 5.25], + "to": [9.15, 4, 5.25], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "north": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [8.65, 0, 4.75], + "to": [8.65, 4, 5.75], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "east": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ns", + "from": [10.15, 0, 8.25], + "to": [11.15, 4, 8.25], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "north": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ew", + "from": [10.65, 0, 7.75], + "to": [10.65, 4, 8.75], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "east": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_3.json new file mode 100644 index 00000000..8d0207b4 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_3.json @@ -0,0 +1,78 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower", + "from": [8, 5, 8], + "to": [16, 5, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [12.9, 0, 0], + "to": [13.9, 5, 0], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [13.4, 0, -0.5], + "to": [13.4, 5, 0.5], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [17.15, 0, -2.85], + "to": [18.15, 5, -2.85], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [17.65, 0, -3.35], + "to": [17.65, 5, -2.35], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ns", + "from": [17.65, 0, 1.9], + "to": [18.65, 5, 1.9], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "north": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ew", + "from": [18.15, 0, 1.4], + "to": [18.15, 5, 2.4], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "east": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_4.json new file mode 100644 index 00000000..6f0d878f --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_tall_4.json @@ -0,0 +1,58 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower", + "from": [8, 5, 0], + "to": [16, 5, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [13.9, 0, -8.2], + "to": [14.9, 5, -8.2], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "north": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [14.4, 0, -8.7], + "to": [14.4, 5, -7.7], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "east": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [10.9, 0, -5.2], + "to": [11.9, 5, -5.2], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "north": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [11.4, 0, -5.7], + "to": [11.4, 5, -4.7], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "east": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_1.json new file mode 100644 index 00000000..434c53bc --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_1.json @@ -0,0 +1,96 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower_upper", + "from": [0, 5, 0], + "to": [8, 5, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed_upper" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [0, 4, 0], + "to": [8, 4, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed_middle" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [0, 3, 0], + "to": [8, 3, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [3.75, 0, -2.1], + "to": [4.75, 5, -2.1], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [4.25, 0, -2.6], + "to": [4.25, 5, -1.6], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [4.4, 0, 2.8], + "to": [5.4, 5, 2.8], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [4.9, 0, 2.3], + "to": [4.9, 5, 3.3], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ns", + "from": [8.65, 0, 0.05], + "to": [9.65, 5, 0.05], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ew", + "from": [9.15, 0, -0.45], + "to": [9.15, 5, 0.55], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 7], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_2.json new file mode 100644 index 00000000..b632d083 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_2.json @@ -0,0 +1,96 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower_upper", + "from": [0, 3, 8], + "to": [8, 3, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed_upper" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [0, 2, 8], + "to": [8, 2, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed_middle" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [0, 1, 8], + "to": [8, 1, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [11.15, 0, 3.25], + "to": [12.15, 3, 3.25], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "north": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [11.65, 0, 2.75], + "to": [11.65, 3, 3.75], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "east": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [8.15, 0, 5.25], + "to": [9.15, 3, 5.25], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "north": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [8.65, 0, 4.75], + "to": [8.65, 3, 5.75], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "east": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ns", + "from": [10.15, 0, 8.25], + "to": [11.15, 3, 8.25], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "north": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ew", + "from": [10.65, 0, 7.75], + "to": [10.65, 3, 8.75], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "east": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 5], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_3.json new file mode 100644 index 00000000..de5064cb --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_3.json @@ -0,0 +1,96 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower_upper", + "from": [8, 4, 8], + "to": [16, 4, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed_upper" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [8, 3, 8], + "to": [16, 3, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed_middle" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [8, 2, 8], + "to": [16, 2, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [12.9, 0, 0], + "to": [13.9, 4, 0], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [13.4, 0, -0.5], + "to": [13.4, 4, 0.5], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [17.15, 0, -2.85], + "to": [18.15, 4, -2.85], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [17.65, 0, -3.35], + "to": [17.65, 4, -2.35], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ns", + "from": [17.65, 0, 1.9], + "to": [18.65, 4, 1.9], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem3_ew", + "from": [18.15, 0, 1.4], + "to": [18.15, 4, 2.4], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_4.json new file mode 100644 index 00000000..a9ce501c --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_4.json @@ -0,0 +1,76 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + }, + "elements": [ + { + "name": "flower_upper", + "from": [8, 4, 0], + "to": [16, 4, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed_upper" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [8, 3, 0], + "to": [16, 3, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed_middle" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [8, 2, 0], + "to": [16, 2, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [13.9, 0, -8.2], + "to": [14.9, 4, -8.2], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem1_ew", + "from": [14.4, 0, -8.7], + "to": [14.4, 4, -7.7], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ns", + "from": [10.9, 0, -5.2], + "to": [11.9, 4, -5.2], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + }, + { + "name": "stem2_ew", + "from": [11.4, 0, -5.7], + "to": [11.4, 4, -4.7], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem", "tintindex": 1 } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_1.json new file mode 100644 index 00000000..dda7f0d5 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_1.json @@ -0,0 +1,95 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower_upper", + "from": [0, 5, 0], + "to": [8, 5, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed_upper" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [0, 4, 0], + "to": [8, 4, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed_middle" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [0, 3, 0], + "to": [8, 3, 8], + "faces": { + "up": { "uv": [0, 0, 8, 8], "texture": "#flowerbed" }, + "down": { "uv": [0, 8, 8, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [3.75, 0, -2.1], + "to": [4.75, 5, -2.1], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 7], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [4.25, 0, -2.6], + "to": [4.25, 5, -1.6], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 7], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [4.4, 0, 2.8], + "to": [5.4, 5, 2.8], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 7], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [4.9, 0, 2.3], + "to": [4.9, 5, 3.3], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 7], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem3_ns", + "from": [8.65, 0, 0.05], + "to": [9.65, 5, 0.05], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 7], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 7], "texture": "#stem" } + } + }, + { + "name": "stem3_ew", + "from": [9.15, 0, -0.45], + "to": [9.15, 5, 0.55], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 7], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 7], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_2.json new file mode 100644 index 00000000..80703dc1 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_2.json @@ -0,0 +1,95 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower_upper", + "from": [0, 3, 8], + "to": [8, 3, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed_upper" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [0, 2, 8], + "to": [8, 2, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed_middle" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [0, 1, 8], + "to": [8, 1, 16], + "faces": { + "up": { "uv": [0, 8, 8, 16], "texture": "#flowerbed" }, + "down": { "uv": [0, 16, 8, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [11.15, 0, 3.25], + "to": [12.15, 3, 3.25], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "north": { "uv": [0, 2, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [11.65, 0, 2.75], + "to": [11.65, 3, 3.75], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -1] }, + "faces": { + "east": { "uv": [0, 2, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [8.15, 0, 5.25], + "to": [9.15, 3, 5.25], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "north": { "uv": [0, 2, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [8.65, 0, 4.75], + "to": [8.65, 3, 5.75], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, 1] }, + "faces": { + "east": { "uv": [0, 2, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem3_ns", + "from": [10.15, 0, 8.25], + "to": [11.15, 3, 8.25], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "north": { "uv": [0, 2, 1, 5], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 5], "texture": "#stem" } + } + }, + { + "name": "stem3_ew", + "from": [10.65, 0, 7.75], + "to": [10.65, 3, 8.75], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 4] }, + "faces": { + "east": { "uv": [0, 2, 1, 5], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 5], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_3.json new file mode 100644 index 00000000..52951846 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_3.json @@ -0,0 +1,95 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower_upper", + "from": [8, 4, 8], + "to": [16, 4, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed_upper" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [8, 3, 8], + "to": [16, 3, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed_middle" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [8, 2, 8], + "to": [16, 2, 16], + "faces": { + "up": { "uv": [8, 8, 16, 16], "texture": "#flowerbed" }, + "down": { "uv": [8, 16, 16, 8], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [12.9, 0, 0], + "to": [13.9, 4, 0], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [13.4, 0, -0.5], + "to": [13.4, 4, 0.5], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [17.15, 0, -2.85], + "to": [18.15, 4, -2.85], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [17.65, 0, -3.35], + "to": [17.65, 4, -2.35], + "rotation": { "angle": -45, "axis": "y", "origin": [0, 0, 0] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem3_ns", + "from": [17.65, 0, 1.9], + "to": [18.65, 4, 1.9], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem3_ew", + "from": [18.15, 0, 1.4], + "to": [18.15, 4, 2.4], + "rotation": { "angle": -45, "axis": "y", "origin": [0.5, 0, 0.5] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + } + ] +} diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_4.json new file mode 100644 index 00000000..a7d722ef --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_triple_untinted_4.json @@ -0,0 +1,75 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, + "elements": [ + { + "name": "flower_upper", + "from": [8, 4, 0], + "to": [16, 4, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed_upper" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed_upper" } + } + }, + { + "name": "flower_middle", + "from": [8, 3, 0], + "to": [16, 3, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed_middle" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed_middle" } + } + }, + { + "name": "flower_lower", + "from": [8, 2, 0], + "to": [16, 2, 8], + "faces": { + "up": { "uv": [8, 0, 16, 8], "texture": "#flowerbed" }, + "down": { "uv": [8, 8, 16, 0], "texture": "#flowerbed" } + } + }, + { + "name": "stem1_ns", + "from": [13.9, 0, -8.2], + "to": [14.9, 4, -8.2], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem1_ew", + "from": [14.4, 0, -8.7], + "to": [14.4, 4, -7.7], + "rotation": { "angle": -45, "axis": "y", "origin": [1, 0, -4] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ns", + "from": [10.9, 0, -5.2], + "to": [11.9, 4, -5.2], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "north": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "south": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + }, + { + "name": "stem2_ew", + "from": [11.4, 0, -5.7], + "to": [11.4, 4, -4.7], + "rotation": { "angle": -45, "axis": "y", "origin": [-2, 0, -1] }, + "faces": { + "east": { "uv": [0, 2, 1, 6], "texture": "#stem" }, + "west": { "uv": [0, 2, 1, 6], "texture": "#stem" } + } + } + ] +} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_1.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_1.json similarity index 97% rename from src/client/resources/assets/tiny-flowers/models/block/garden_untinted_1.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_1.json index f6a6ce68..e4f8de24 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_1.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_1.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_2.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_2.json similarity index 97% rename from src/client/resources/assets/tiny-flowers/models/block/garden_untinted_2.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_2.json index 169c44fd..f003279a 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_2.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_2.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_3.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_3.json similarity index 97% rename from src/client/resources/assets/tiny-flowers/models/block/garden_untinted_3.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_3.json index 9c8aa72d..1955a3cf 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_3.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_3.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower", diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_4.json b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_4.json similarity index 96% rename from src/client/resources/assets/tiny-flowers/models/block/garden_untinted_4.json rename to common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_4.json index a34101fa..1492137b 100644 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_untinted_4.json +++ b/common/src/main/resources/assets/tiny_flowers/models/block/garden_untinted_4.json @@ -1,5 +1,8 @@ { "ambientocclusion": false, + "textures": { + "particle": "#flowerbed" + }, "elements": [ { "name": "flower", diff --git a/common/src/main/resources/assets/tiny_flowers/models/block/tiny_garden.json b/common/src/main/resources/assets/tiny_flowers/models/block/tiny_garden.json new file mode 100644 index 00000000..112f8129 --- /dev/null +++ b/common/src/main/resources/assets/tiny_flowers/models/block/tiny_garden.json @@ -0,0 +1,7 @@ +{ + "ambientocclusion": false, + "elements": [], + "textures": { + "particle": "tiny_flowers:item/tiny_garden" + } +} diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tall_tiny_flower_stem.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tall_tiny_flower_stem.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tall_tiny_flower_stem.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tall_tiny_flower_stem.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_allium.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_allium.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_allium.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_allium.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_azure_bluet.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_azure_bluet.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_azure_bluet.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_azure_bluet.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_blue_orchid.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_blue_orchid.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_blue_orchid.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_blue_orchid.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_blue_orchid_upper.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_blue_orchid_upper.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_blue_orchid_upper.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_blue_orchid_upper.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_cactus_flower.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_cactus_flower.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_cactus_flower.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_cactus_flower.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_cactus_flower_stem.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_cactus_flower_stem.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_cactus_flower_stem.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_cactus_flower_stem.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_closed_eyeblossom.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_closed_eyeblossom.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_closed_eyeblossom.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_closed_eyeblossom.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_cornflower.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_cornflower.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_cornflower.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_cornflower.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_dandelion.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_dandelion.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_dandelion.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_dandelion.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_eyeblossom_stem.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_eyeblossom_stem.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_eyeblossom_stem.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_eyeblossom_stem.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_lily_of_the_valley.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_lily_of_the_valley.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_lily_of_the_valley.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_lily_of_the_valley.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_lily_of_the_valley_upper.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_lily_of_the_valley_upper.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_lily_of_the_valley_upper.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_lily_of_the_valley_upper.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_open_eyeblossom.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_open_eyeblossom.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_open_eyeblossom.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_open_eyeblossom.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_open_eyeblossom_upper.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_open_eyeblossom_upper.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_open_eyeblossom_upper.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_open_eyeblossom_upper.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_orange_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_orange_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_orange_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_orange_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_oxeye_daisy.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_oxeye_daisy.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_oxeye_daisy.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_oxeye_daisy.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_pink_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_pink_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_pink_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_pink_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_poppy.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_poppy.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_poppy.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_poppy.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_red_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_red_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_red_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_red_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower_middle.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower_middle.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower_middle.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower_middle.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower_stem.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower_stem.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower_stem.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower_stem.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower_upper.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower_upper.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_torchflower_upper.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_torchflower_upper.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_white_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_white_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_white_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_white_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_wither_rose.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_wither_rose.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_wither_rose.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_wither_rose.png diff --git a/src/client/resources/assets/tiny-flowers/textures/block/tiny_wither_rose_stem.png b/common/src/main/resources/assets/tiny_flowers/textures/block/tiny_wither_rose_stem.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/block/tiny_wither_rose_stem.png rename to common/src/main/resources/assets/tiny_flowers/textures/block/tiny_wither_rose_stem.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/florists_shears.png b/common/src/main/resources/assets/tiny_flowers/textures/item/florists_shears.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/florists_shears.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/florists_shears.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/florists_shears_handle.png b/common/src/main/resources/assets/tiny_flowers/textures/item/florists_shears_handle.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/florists_shears_handle.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/florists_shears_handle.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_allium.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_allium.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_allium.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_allium.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_azure_bluet.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_azure_bluet.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_azure_bluet.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_azure_bluet.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_blue_orchid.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_blue_orchid.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_blue_orchid.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_blue_orchid.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_cactus_flower.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_cactus_flower.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_cactus_flower.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_cactus_flower.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_closed_eyeblossom.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_closed_eyeblossom.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_closed_eyeblossom.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_closed_eyeblossom.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_cornflower.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_cornflower.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_cornflower.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_cornflower.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_dandelion.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_dandelion.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_dandelion.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_dandelion.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_garden.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_garden.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_garden.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_garden.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_lily_of_the_valley.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_lily_of_the_valley.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_lily_of_the_valley.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_lily_of_the_valley.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_open_eyeblossom.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_open_eyeblossom.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_open_eyeblossom.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_open_eyeblossom.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_orange_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_orange_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_orange_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_orange_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_oxeye_daisy.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_oxeye_daisy.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_oxeye_daisy.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_oxeye_daisy.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_pink_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_pink_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_pink_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_pink_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_poppy.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_poppy.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_poppy.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_poppy.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_red_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_red_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_red_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_red_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_torchflower.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_torchflower.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_torchflower.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_torchflower.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_white_tulip.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_white_tulip.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_white_tulip.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_white_tulip.png diff --git a/src/client/resources/assets/tiny-flowers/textures/item/tiny_wither_rose.png b/common/src/main/resources/assets/tiny_flowers/textures/item/tiny_wither_rose.png similarity index 100% rename from src/client/resources/assets/tiny-flowers/textures/item/tiny_wither_rose.png rename to common/src/main/resources/assets/tiny_flowers/textures/item/tiny_wither_rose.png diff --git a/common/src/main/resources/data/tiny_flowers/recipe/shear_tiny_flowers.json b/common/src/main/resources/data/tiny_flowers/recipe/shear_tiny_flowers.json new file mode 100644 index 00000000..263085a3 --- /dev/null +++ b/common/src/main/resources/data/tiny_flowers/recipe/shear_tiny_flowers.json @@ -0,0 +1,4 @@ +{ + "type": "tiny_flowers:crafting_special_shear_tiny_flowers", + "category": "misc" +} diff --git a/common/src/main/resources/data/tiny_flowers/recipe/suspicious_stew_from_tiny_flowers.json b/common/src/main/resources/data/tiny_flowers/recipe/suspicious_stew_from_tiny_flowers.json new file mode 100644 index 00000000..b76ec84d --- /dev/null +++ b/common/src/main/resources/data/tiny_flowers/recipe/suspicious_stew_from_tiny_flowers.json @@ -0,0 +1,4 @@ +{ + "type": "tiny_flowers:crafting_special_tiny_flower_stew", + "category": "misc" +} diff --git a/common/src/main/resources/pack.mcmeta b/common/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..52854ec4 --- /dev/null +++ b/common/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "${mod_name}", + "pack_format": 8 + } +} \ No newline at end of file diff --git a/common/src/main/resources/tiny_flowers.classtweaker b/common/src/main/resources/tiny_flowers.classtweaker new file mode 100644 index 00000000..6e40f45b --- /dev/null +++ b/common/src/main/resources/tiny_flowers.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 official +accessible class net/minecraft/client/resources/model/ModelBakery$ModelBakerImpl +accessible class net/minecraft/client/data/models/ModelProvider$BlockStateGeneratorCollector +accessible class net/minecraft/client/data/models/ModelProvider$ItemInfoCollector diff --git a/common/src/main/resources/tiny_flowers.mixins.json b/common/src/main/resources/tiny_flowers.mixins.json new file mode 100644 index 00000000..b47a4fb7 --- /dev/null +++ b/common/src/main/resources/tiny_flowers.mixins.json @@ -0,0 +1,22 @@ +{ + "required": true, + "package": "co.secretonline.tinyflowers.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [ + "block.EyeblossomBlockMixin", + "block.FlowerbedBlockMixin", + "block.LeafLitterBlockMixin", + "crafting.CrafterBlockMixin", + "crafting.CrafterMenuMixin", + "crafting.CraftingMenuMixin", + "crafting.DyeColorMixin", + "datagen.ModelProviderMixin", + "item.CreativeModeTabsMixin", + "item.ItemStackMixin", + "item.ModelBakeryMixin", + "particle.TerrainParticleMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric/build.gradle b/fabric/build.gradle new file mode 100644 index 00000000..99d0ad82 --- /dev/null +++ b/fabric/build.gradle @@ -0,0 +1,55 @@ +plugins { + id 'multiloader-loader' + id 'net.fabricmc.fabric-loom' +} +dependencies { + minecraft "com.mojang:minecraft:${minecraft_version}" + implementation "net.fabricmc:fabric-loader:${fabric_loader_version}" + implementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" +} + +loom { + def aw = project(':common').file("src/main/resources/${mod_id}.classtweaker") + if (aw.exists()) { + accessWidenerPath.set(aw) + } + runs { + client { + client() + setConfigName('Fabric Client') + ideConfigGenerated(true) + runDir('runs/client') + } + server { + server() + setConfigName('Fabric Server') + ideConfigGenerated(true) + runDir('runs/server') + } + } +} + +fabricApi { + configureDataGeneration() { + client = true + } +} + +// Implement mcgradleconventions loader attribute +def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements', 'includeInternal', 'modCompileClasspath', 'compileClasspath'].each { variant -> + configurations.named("$variant") { + attributes { + attribute(loaderAttribute, 'fabric') + } + } +} +sourceSets.configureEach { + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName].each { variant-> + configurations.named("$variant") { + attributes { + attribute(loaderAttribute, 'fabric') + } + } + } +} diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_1.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_1.json new file mode 100644 index 00000000..e3e8e898 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_1", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_2.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_2.json new file mode 100644 index 00000000..c8a59afe --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_2", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_3.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_3.json new file mode 100644 index 00000000..4d629909 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_3", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_4.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_4.json new file mode 100644 index 00000000..47bbe2f3 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/leaf_litter_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_4", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_1.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_1.json new file mode 100644 index 00000000..5cf80b2d --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_1", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_2.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_2.json new file mode 100644 index 00000000..b18bf9a1 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_2", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_3.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_3.json new file mode 100644 index 00000000..4df3c7fc --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_3", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_4.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_4.json new file mode 100644 index 00000000..4e6bc7af --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/pink_petals_4.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_4", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_1.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_1.json new file mode 100644 index 00000000..21fab7d9 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_1", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_2.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_2.json new file mode 100644 index 00000000..f93475d8 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_2", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_3.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_3.json new file mode 100644 index 00000000..dbd39196 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_3", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_4.json b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_4.json new file mode 100644 index 00000000..310adb5d --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/models/block/tiny_flowers/wildflowers_4.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_4", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/leaf_litter.json b/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/leaf_litter.json new file mode 100644 index 00000000..39a2e5a6 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/leaf_litter.json @@ -0,0 +1,9 @@ +{ + "id": "minecraft:leaf_litter", + "item_model": "minecraft:item/leaf_litter", + "model1": "minecraft:block/tiny_flowers/leaf_litter_1", + "model2": "minecraft:block/tiny_flowers/leaf_litter_2", + "model3": "minecraft:block/tiny_flowers/leaf_litter_3", + "model4": "minecraft:block/tiny_flowers/leaf_litter_4", + "tint_source": "dry_foliage" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/pink_petals.json b/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/pink_petals.json new file mode 100644 index 00000000..c74cede3 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/pink_petals.json @@ -0,0 +1,8 @@ +{ + "id": "minecraft:pink_petals", + "item_model": "minecraft:item/pink_petals", + "model1": "minecraft:block/tiny_flowers/pink_petals_1", + "model2": "minecraft:block/tiny_flowers/pink_petals_2", + "model3": "minecraft:block/tiny_flowers/pink_petals_3", + "model4": "minecraft:block/tiny_flowers/pink_petals_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/wildflowers.json b/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/wildflowers.json new file mode 100644 index 00000000..65d2acb9 --- /dev/null +++ b/fabric/src/main/generated/assets/minecraft/tiny_flowers/tiny_flower/wildflowers.json @@ -0,0 +1,8 @@ +{ + "id": "minecraft:wildflowers", + "item_model": "minecraft:item/wildflowers", + "model1": "minecraft:block/tiny_flowers/wildflowers_1", + "model2": "minecraft:block/tiny_flowers/wildflowers_2", + "model3": "minecraft:block/tiny_flowers/wildflowers_3", + "model4": "minecraft:block/tiny_flowers/wildflowers_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/blockstates/tiny_garden.json b/fabric/src/main/generated/assets/tiny_flowers/blockstates/tiny_garden.json new file mode 100644 index 00000000..72d16ff2 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/blockstates/tiny_garden.json @@ -0,0 +1,36 @@ +{ + "multipart": [ + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "north" + } + }, + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "east" + } + }, + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "south" + } + }, + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "west" + } + } + ] +} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/florists_shears.json b/fabric/src/main/generated/assets/tiny_flowers/items/florists_shears.json similarity index 81% rename from src/main/generated/assets/tiny-flowers/items/florists_shears.json rename to fabric/src/main/generated/assets/tiny_flowers/items/florists_shears.json index e0a7eea0..cfb0ffed 100644 --- a/src/main/generated/assets/tiny-flowers/items/florists_shears.json +++ b/fabric/src/main/generated/assets/tiny_flowers/items/florists_shears.json @@ -1,7 +1,7 @@ { "model": { "type": "minecraft:model", - "model": "tiny-flowers:item/florists_shears", + "model": "tiny_flowers:item/florists_shears", "tints": [ { "type": "minecraft:constant", diff --git a/fabric/src/main/generated/assets/tiny_flowers/items/tiny_flower.json b/fabric/src/main/generated/assets/tiny_flowers/items/tiny_flower.json new file mode 100644 index 00000000..1e6296bd --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/items/tiny_flower.json @@ -0,0 +1,131 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_dandelion" + }, + "when": "tiny_flowers:tiny_dandelion" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_poppy" + }, + "when": "tiny_flowers:tiny_poppy" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_blue_orchid" + }, + "when": "tiny_flowers:tiny_blue_orchid" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_allium" + }, + "when": "tiny_flowers:tiny_allium" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_azure_bluet" + }, + "when": "tiny_flowers:tiny_azure_bluet" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_red_tulip" + }, + "when": "tiny_flowers:tiny_red_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_orange_tulip" + }, + "when": "tiny_flowers:tiny_orange_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_white_tulip" + }, + "when": "tiny_flowers:tiny_white_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_pink_tulip" + }, + "when": "tiny_flowers:tiny_pink_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_oxeye_daisy" + }, + "when": "tiny_flowers:tiny_oxeye_daisy" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_cornflower" + }, + "when": "tiny_flowers:tiny_cornflower" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_lily_of_the_valley" + }, + "when": "tiny_flowers:tiny_lily_of_the_valley" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_torchflower" + }, + "when": "tiny_flowers:tiny_torchflower" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_closed_eyeblossom" + }, + "when": "tiny_flowers:tiny_closed_eyeblossom" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_open_eyeblossom" + }, + "when": "tiny_flowers:tiny_open_eyeblossom" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_wither_rose" + }, + "when": "tiny_flowers:tiny_wither_rose" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_cactus_flower" + }, + "when": "tiny_flowers:tiny_cactus_flower" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_garden" + }, + "property": "tiny_flowers:tiny_flower" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_1.json new file mode 100644 index 00000000..0a262662 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_2.json new file mode 100644 index 00000000..be537a6b --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_3.json new file mode 100644 index 00000000..7188ec9d --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_4.json new file mode 100644 index 00000000..52a6d273 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_1.json new file mode 100644 index 00000000..1f9a1309 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_2.json new file mode 100644 index 00000000..5e77621b --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_3.json new file mode 100644 index 00000000..1e4331bb --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_4.json new file mode 100644 index 00000000..7a607fe6 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_1.json new file mode 100644 index 00000000..ca740ce1 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_2.json new file mode 100644 index 00000000..734e8055 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_3.json new file mode 100644 index 00000000..c319b966 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_4.json new file mode 100644 index 00000000..a5d7a3f9 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_1.json new file mode 100644 index 00000000..0c077aec --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_2.json new file mode 100644 index 00000000..54a28449 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_3.json new file mode 100644 index 00000000..e39e70c0 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_4.json new file mode 100644 index 00000000..4489f25c --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_1.json new file mode 100644 index 00000000..90c23b87 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_2.json new file mode 100644 index 00000000..9540b9ac --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_3.json new file mode 100644 index 00000000..c74247d2 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_4.json new file mode 100644 index 00000000..c46b2f07 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_1.json new file mode 100644 index 00000000..6c6790c5 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_2.json new file mode 100644 index 00000000..3e76c5fb --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_3.json new file mode 100644 index 00000000..720258f7 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_4.json new file mode 100644 index 00000000..2fceb925 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_1.json new file mode 100644 index 00000000..da40ce8f --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_2.json new file mode 100644 index 00000000..6cb89951 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_3.json new file mode 100644 index 00000000..7bb7ffaa --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_4.json new file mode 100644 index 00000000..7967ac12 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_1.json new file mode 100644 index 00000000..b901dc9b --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_2.json new file mode 100644 index 00000000..1845d3a6 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_3.json new file mode 100644 index 00000000..d46e8718 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_4.json new file mode 100644 index 00000000..1be7c6fd --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_1.json new file mode 100644 index 00000000..8298cfad --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_1.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_2.json new file mode 100644 index 00000000..78a71b76 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_2.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_3.json new file mode 100644 index 00000000..6e035066 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_3.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_4.json new file mode 100644 index 00000000..49a8e259 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_4.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_1.json new file mode 100644 index 00000000..173dcfe7 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_2.json new file mode 100644 index 00000000..c2f9e24e --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_3.json new file mode 100644 index 00000000..6526965a --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_4.json new file mode 100644 index 00000000..65938913 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_1.json new file mode 100644 index 00000000..5d187a78 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_2.json new file mode 100644 index 00000000..524a8b40 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_3.json new file mode 100644 index 00000000..80a97e30 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_4.json new file mode 100644 index 00000000..11a78daa --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_1.json new file mode 100644 index 00000000..4270d103 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_2.json new file mode 100644 index 00000000..6db104e4 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_3.json new file mode 100644 index 00000000..7cd84189 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_4.json new file mode 100644 index 00000000..10623e71 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_1.json new file mode 100644 index 00000000..135db333 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_2.json new file mode 100644 index 00000000..08b871ea --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_3.json new file mode 100644 index 00000000..f2e460fe --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_4.json new file mode 100644 index 00000000..0803b170 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_1.json new file mode 100644 index 00000000..378695a6 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_2.json new file mode 100644 index 00000000..d2ea1723 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_3.json new file mode 100644 index 00000000..6f17dbfa --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_4.json new file mode 100644 index 00000000..474586e8 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_1.json new file mode 100644 index 00000000..16343245 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_1.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_2.json new file mode 100644 index 00000000..289184ad --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_2.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_3.json new file mode 100644 index 00000000..492124af --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_3.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_4.json new file mode 100644 index 00000000..b11af91c --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_4.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_1.json new file mode 100644 index 00000000..87babbc2 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_2.json new file mode 100644 index 00000000..b1c0f247 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_3.json new file mode 100644 index 00000000..0554540d --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_4.json new file mode 100644 index 00000000..22c47686 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_1.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_1.json new file mode 100644 index 00000000..037f5081 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_2.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_2.json new file mode 100644 index 00000000..e27a3237 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_3.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_3.json new file mode 100644 index 00000000..ec824f11 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_4.json b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_4.json new file mode 100644 index 00000000..aa170ead --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/models/item/florists_shears.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/florists_shears.json new file mode 100644 index 00000000..f5687db0 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/florists_shears.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/florists_shears", + "layer1": "tiny_flowers:item/florists_shears_handle" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_allium.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_allium.json similarity index 57% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_allium.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_allium.json index 3bb71e50..7203632b 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_allium.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_allium.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_allium" + "layer0": "tiny_flowers:item/tiny_allium" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_azure_bluet.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_azure_bluet.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_azure_bluet.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_azure_bluet.json index 0c50f76e..35490b90 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_azure_bluet.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_azure_bluet.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_azure_bluet" + "layer0": "tiny_flowers:item/tiny_azure_bluet" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_blue_orchid.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_blue_orchid.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_blue_orchid.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_blue_orchid.json index e60b4a26..548f45bd 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_blue_orchid.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_blue_orchid.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_blue_orchid" + "layer0": "tiny_flowers:item/tiny_blue_orchid" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_cactus_flower.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_cactus_flower.json similarity index 54% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_cactus_flower.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_cactus_flower.json index d54553d0..f10e3100 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_cactus_flower.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_cactus_flower.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_cactus_flower" + "layer0": "tiny_flowers:item/tiny_cactus_flower" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_closed_eyeblossom.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_closed_eyeblossom.json similarity index 52% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_closed_eyeblossom.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_closed_eyeblossom.json index 9d6aba23..68db64a5 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_closed_eyeblossom.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_closed_eyeblossom.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_closed_eyeblossom" + "layer0": "tiny_flowers:item/tiny_closed_eyeblossom" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_cornflower.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_cornflower.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_cornflower.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_cornflower.json index b212b289..d04d5990 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_cornflower.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_cornflower.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_cornflower" + "layer0": "tiny_flowers:item/tiny_cornflower" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_dandelion.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_dandelion.json similarity index 56% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_dandelion.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_dandelion.json index 1ec2717d..1220da9d 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_dandelion.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_dandelion.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_dandelion" + "layer0": "tiny_flowers:item/tiny_dandelion" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_garden.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_garden.json similarity index 57% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_garden.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_garden.json index a15272b2..e9eaec2a 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_garden.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_garden.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_garden" + "layer0": "tiny_flowers:item/tiny_garden" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_lily_of_the_valley.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_lily_of_the_valley.json similarity index 52% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_lily_of_the_valley.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_lily_of_the_valley.json index fff926b2..8130511f 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_lily_of_the_valley.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_lily_of_the_valley.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_lily_of_the_valley" + "layer0": "tiny_flowers:item/tiny_lily_of_the_valley" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_open_eyeblossom.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_open_eyeblossom.json similarity index 53% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_open_eyeblossom.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_open_eyeblossom.json index ff010068..8f524882 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_open_eyeblossom.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_open_eyeblossom.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_open_eyeblossom" + "layer0": "tiny_flowers:item/tiny_open_eyeblossom" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_orange_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_orange_tulip.json similarity index 54% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_orange_tulip.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_orange_tulip.json index 8eb13e5f..5ac75668 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_orange_tulip.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_orange_tulip.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_orange_tulip" + "layer0": "tiny_flowers:item/tiny_orange_tulip" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_oxeye_daisy.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_oxeye_daisy.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_oxeye_daisy.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_oxeye_daisy.json index 2235fed2..337ed4ef 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_oxeye_daisy.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_oxeye_daisy.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_oxeye_daisy" + "layer0": "tiny_flowers:item/tiny_oxeye_daisy" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_pink_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_pink_tulip.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_pink_tulip.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_pink_tulip.json index 159c36a8..26f46632 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_pink_tulip.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_pink_tulip.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_pink_tulip" + "layer0": "tiny_flowers:item/tiny_pink_tulip" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_poppy.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_poppy.json similarity index 58% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_poppy.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_poppy.json index 61b47688..74b0010f 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_poppy.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_poppy.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_poppy" + "layer0": "tiny_flowers:item/tiny_poppy" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_red_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_red_tulip.json similarity index 56% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_red_tulip.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_red_tulip.json index 109331ab..c1ede6f4 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_red_tulip.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_red_tulip.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_red_tulip" + "layer0": "tiny_flowers:item/tiny_red_tulip" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_torchflower.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_torchflower.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_torchflower.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_torchflower.json index d820ef43..c4de06d6 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_torchflower.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_torchflower.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_torchflower" + "layer0": "tiny_flowers:item/tiny_torchflower" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_white_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_white_tulip.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_white_tulip.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_white_tulip.json index 49a2fee2..2b7db320 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_white_tulip.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_white_tulip.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_white_tulip" + "layer0": "tiny_flowers:item/tiny_white_tulip" } } \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/tiny_wither_rose.json b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_wither_rose.json similarity index 55% rename from src/main/generated/assets/tiny-flowers/models/item/tiny_wither_rose.json rename to fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_wither_rose.json index 3970eba7..a633ea95 100644 --- a/src/main/generated/assets/tiny-flowers/models/item/tiny_wither_rose.json +++ b/fabric/src/main/generated/assets/tiny_flowers/models/item/tiny_wither_rose.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "tiny-flowers:item/tiny_wither_rose" + "layer0": "tiny_flowers:item/tiny_wither_rose" } } \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json new file mode 100644 index 00000000..6af68673 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_allium", + "item_model": "tiny_flowers:item/tiny_allium", + "model1": "tiny_flowers:block/tiny_flowers/tiny_allium_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_allium_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_allium_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_allium_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json new file mode 100644 index 00000000..669a8e9c --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_azure_bluet", + "item_model": "tiny_flowers:item/tiny_azure_bluet", + "model1": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json new file mode 100644 index 00000000..a613ad0b --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_blue_orchid", + "item_model": "tiny_flowers:item/tiny_blue_orchid", + "model1": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json new file mode 100644 index 00000000..e524e133 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_cactus_flower", + "item_model": "tiny_flowers:item/tiny_cactus_flower", + "model1": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json new file mode 100644 index 00000000..55e4f082 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_closed_eyeblossom", + "item_model": "tiny_flowers:item/tiny_closed_eyeblossom", + "model1": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json new file mode 100644 index 00000000..d10858ae --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_cornflower", + "item_model": "tiny_flowers:item/tiny_cornflower", + "model1": "tiny_flowers:block/tiny_flowers/tiny_cornflower_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_cornflower_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_cornflower_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_cornflower_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json new file mode 100644 index 00000000..40b120b0 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_dandelion", + "item_model": "tiny_flowers:item/tiny_dandelion", + "model1": "tiny_flowers:block/tiny_flowers/tiny_dandelion_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_dandelion_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_dandelion_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_dandelion_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json new file mode 100644 index 00000000..9c68832f --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_lily_of_the_valley", + "item_model": "tiny_flowers:item/tiny_lily_of_the_valley", + "model1": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json new file mode 100644 index 00000000..877663ed --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_open_eyeblossom", + "item_model": "tiny_flowers:item/tiny_open_eyeblossom", + "model1": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json new file mode 100644 index 00000000..f70f72d9 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_orange_tulip", + "item_model": "tiny_flowers:item/tiny_orange_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json new file mode 100644 index 00000000..94f664fb --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_oxeye_daisy", + "item_model": "tiny_flowers:item/tiny_oxeye_daisy", + "model1": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json new file mode 100644 index 00000000..de54f3c9 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_pink_tulip", + "item_model": "tiny_flowers:item/tiny_pink_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json new file mode 100644 index 00000000..8313d5d0 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_poppy", + "item_model": "tiny_flowers:item/tiny_poppy", + "model1": "tiny_flowers:block/tiny_flowers/tiny_poppy_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_poppy_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_poppy_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_poppy_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json new file mode 100644 index 00000000..93fe8aad --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_red_tulip", + "item_model": "tiny_flowers:item/tiny_red_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json new file mode 100644 index 00000000..efe28931 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_torchflower", + "item_model": "tiny_flowers:item/tiny_torchflower", + "model1": "tiny_flowers:block/tiny_flowers/tiny_torchflower_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_torchflower_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_torchflower_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_torchflower_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json new file mode 100644 index 00000000..2a8b2c96 --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_white_tulip", + "item_model": "tiny_flowers:item/tiny_white_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json new file mode 100644 index 00000000..8609323f --- /dev/null +++ b/fabric/src/main/generated/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_wither_rose", + "item_model": "tiny_flowers:item/tiny_wither_rose", + "model1": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_4" +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/c/tags/block/flowers.json b/fabric/src/main/generated/data/c/tags/block/flowers.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/fabric/src/main/generated/data/c/tags/block/flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/c/tags/item/tools/shear.json b/fabric/src/main/generated/data/c/tags/item/tools/shear.json new file mode 100644 index 00000000..ca1c98e4 --- /dev/null +++ b/fabric/src/main/generated/data/c/tags/item/tools/shear.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:florists_shears" + ] +} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_allium.json b/fabric/src/main/generated/data/minecraft/advancement/recipes/misc/florists_shears_dyed.json similarity index 76% rename from src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_allium.json rename to fabric/src/main/generated/data/minecraft/advancement/recipes/misc/florists_shears_dyed.json index 55c1c101..d468a06a 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_allium.json +++ b/fabric/src/main/generated/data/minecraft/advancement/recipes/misc/florists_shears_dyed.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "tiny-flowers:florists_shears" + "items": "tiny_flowers:florists_shears" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:tiny_allium" + "recipe": "minecraft:florists_shears_dyed" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:tiny_allium" + "minecraft:florists_shears_dyed" ] } } \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/recipe/florists_shears_dyed.json b/fabric/src/main/generated/data/minecraft/recipe/florists_shears_dyed.json new file mode 100644 index 00000000..59601c8a --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/recipe/florists_shears_dyed.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_dye", + "category": "misc", + "dye": "#minecraft:dyes", + "group": "florists_shears_dyed", + "result": { + "id": "tiny_flowers:florists_shears" + }, + "target": "tiny_flowers:florists_shears" +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tags/block/bee_attractive.json b/fabric/src/main/generated/data/minecraft/tags/block/bee_attractive.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tags/block/bee_attractive.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tags/block/flowers.json b/fabric/src/main/generated/data/minecraft/tags/block/flowers.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tags/block/flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tags/block/inside_step_sound_blocks.json b/fabric/src/main/generated/data/minecraft/tags/block/inside_step_sound_blocks.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tags/block/inside_step_sound_blocks.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tags/item/bee_food.json b/fabric/src/main/generated/data/minecraft/tags/item/bee_food.json new file mode 100644 index 00000000..79df3f3f --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tags/item/bee_food.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_flower" + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tags/item/flowers.json b/fabric/src/main/generated/data/minecraft/tags/item/flowers.json new file mode 100644 index 00000000..79df3f3f --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tags/item/flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_flower" + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/leaf_litter.json b/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/leaf_litter.json new file mode 100644 index 00000000..80047306 --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/leaf_litter.json @@ -0,0 +1,10 @@ +{ + "behaviors": [ + { + "type": "sturdy_placement" + } + ], + "id": "minecraft:leaf_litter", + "is_segmented": true, + "original_id": "minecraft:leaf_litter" +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/pink_petals.json b/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/pink_petals.json new file mode 100644 index 00000000..cac36e68 --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/pink_petals.json @@ -0,0 +1,5 @@ +{ + "id": "minecraft:pink_petals", + "is_segmented": true, + "original_id": "minecraft:pink_petals" +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/wildflowers.json b/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/wildflowers.json new file mode 100644 index 00000000..57c76788 --- /dev/null +++ b/fabric/src/main/generated/data/minecraft/tiny_flowers/tiny_flower/wildflowers.json @@ -0,0 +1,5 @@ +{ + "id": "minecraft:wildflowers", + "is_segmented": true, + "original_id": "minecraft:wildflowers" +} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_black.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_black.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_black.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_black.json index ecb94cc0..fdddac57 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_black.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_black.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_black" + "recipe": "tiny_flowers:florists_shears_black" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_black" + "tiny_flowers:florists_shears_black" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_blue.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_blue.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_blue.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_blue.json index bbd2d89a..fe84302b 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_blue.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_blue.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_blue" + "recipe": "tiny_flowers:florists_shears_blue" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_blue" + "tiny_flowers:florists_shears_blue" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_brown.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_brown.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_brown.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_brown.json index f14d31dd..5eebf202 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_brown.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_brown.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_brown" + "recipe": "tiny_flowers:florists_shears_brown" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_brown" + "tiny_flowers:florists_shears_brown" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_cyan.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_cyan.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_cyan.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_cyan.json index 62e29b32..1a6fd9ab 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_cyan.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_cyan.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_cyan" + "recipe": "tiny_flowers:florists_shears_cyan" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_cyan" + "tiny_flowers:florists_shears_cyan" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_gray.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_gray.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_gray.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_gray.json index 31441598..03dd04f0 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_gray.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_gray.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_gray" + "recipe": "tiny_flowers:florists_shears_gray" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_gray" + "tiny_flowers:florists_shears_gray" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_green.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_green.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_green.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_green.json index 26fab54f..b6fb26cc 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_green.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_green.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_green" + "recipe": "tiny_flowers:florists_shears_green" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_green" + "tiny_flowers:florists_shears_green" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_light_blue.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_blue.json similarity index 81% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_light_blue.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_blue.json index 458489f7..da38bf4a 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_light_blue.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_blue.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_light_blue" + "recipe": "tiny_flowers:florists_shears_light_blue" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_light_blue" + "tiny_flowers:florists_shears_light_blue" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_light_gray.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_gray.json similarity index 81% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_light_gray.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_gray.json index 2ee04643..930a05c8 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_light_gray.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_gray.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_light_gray" + "recipe": "tiny_flowers:florists_shears_light_gray" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_light_gray" + "tiny_flowers:florists_shears_light_gray" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_lime.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_lime.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_lime.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_lime.json index 5c7e9d1e..8f91972b 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_lime.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_lime.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_lime" + "recipe": "tiny_flowers:florists_shears_lime" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_lime" + "tiny_flowers:florists_shears_lime" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_magenta.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_magenta.json similarity index 82% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_magenta.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_magenta.json index 577ff651..2edcab53 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_magenta.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_magenta.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_magenta" + "recipe": "tiny_flowers:florists_shears_magenta" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_magenta" + "tiny_flowers:florists_shears_magenta" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_orange.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_orange.json similarity index 82% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_orange.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_orange.json index c7b147bc..33e6e955 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_orange.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_orange.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_orange" + "recipe": "tiny_flowers:florists_shears_orange" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_orange" + "tiny_flowers:florists_shears_orange" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_pink.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_pink.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_pink.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_pink.json index 948c2869..ff34ec6d 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_pink.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_pink.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_pink" + "recipe": "tiny_flowers:florists_shears_pink" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_pink" + "tiny_flowers:florists_shears_pink" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_purple.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_purple.json similarity index 82% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_purple.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_purple.json index 6d030a5c..fc3d7c21 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_purple.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_purple.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_purple" + "recipe": "tiny_flowers:florists_shears_purple" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_purple" + "tiny_flowers:florists_shears_purple" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_red.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_red.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_red.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_red.json index af86346e..b392b1c5 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_red.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_red.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_red" + "recipe": "tiny_flowers:florists_shears_red" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_red" + "tiny_flowers:florists_shears_red" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_white.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_white.json similarity index 83% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_white.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_white.json index 5ad85bc6..f24a1020 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_white.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_white.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_white" + "recipe": "tiny_flowers:florists_shears_white" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_white" + "tiny_flowers:florists_shears_white" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_yellow.json b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_yellow.json similarity index 82% rename from src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_yellow.json rename to fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_yellow.json index 4eea322d..c80f402e 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/tools/florists_shears_yellow.json +++ b/fabric/src/main/generated/data/tiny_flowers/advancement/recipes/tools/florists_shears_yellow.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:florists_shears_yellow" + "recipe": "tiny_flowers:florists_shears_yellow" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:florists_shears_yellow" + "tiny_flowers:florists_shears_yellow" ] } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_black.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_black.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_black.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_black.json index e9f8ba4d..b83c6c5c 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_black.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_black.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -14869215 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_blue.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_blue.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_blue.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_blue.json index a2094445..e16974ee 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_blue.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_blue.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -12827478 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_brown.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_brown.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_brown.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_brown.json index 0549dabf..ebfadd3e 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_brown.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_brown.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -8170446 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_cyan.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_cyan.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_cyan.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_cyan.json index 8c1a636c..c0dc913f 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_cyan.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_cyan.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -15295332 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_gray.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_gray.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_gray.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_gray.json index 91647527..a0ec0617 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_gray.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_gray.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -12103854 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_green.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_green.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_green.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_green.json index dea12ba5..929982ab 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_green.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_green.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -10585066 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_light_blue.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_light_blue.json similarity index 82% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_light_blue.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_light_blue.json index bc2a362c..5a81b8ce 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_light_blue.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_light_blue.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -12930086 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_light_gray.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_light_gray.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_light_gray.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_light_gray.json index 707c0b45..472c8660 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_light_gray.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_light_gray.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -6447721 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_lime.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_lime.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_lime.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_lime.json index 0157bf8b..2c75f127 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_lime.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_lime.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -8337633 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_magenta.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_magenta.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_magenta.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_magenta.json index ef0faa8c..0c8bd3d5 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_magenta.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_magenta.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -3715395 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_orange.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_orange.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_orange.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_orange.json index c86cc607..5aeb3cf9 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_orange.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_orange.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -425955 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_pink.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_pink.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_pink.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_pink.json index 5701894a..8415f7bf 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_pink.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_pink.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -816214 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_purple.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_purple.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_purple.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_purple.json index 01288c21..43e55bcf 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_purple.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_purple.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -7785800 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_red.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_red.json similarity index 63% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_red.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_red.json index d8aec3e7..2832e60a 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_red.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_red.json @@ -7,7 +7,9 @@ "#c:dyes/red" ], "result": { - "count": 1, - "id": "tiny-flowers:florists_shears" + "components": { + "minecraft:dyed_color": -5231066 + }, + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_white.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_white.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_white.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_white.json index 7c651ec2..2012459f 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_white.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_white.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -393218 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/florists_shears_yellow.json b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_yellow.json similarity index 81% rename from src/main/generated/data/tiny-flowers/recipe/florists_shears_yellow.json rename to fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_yellow.json index 9dfdc439..d6450e6c 100644 --- a/src/main/generated/data/tiny-flowers/recipe/florists_shears_yellow.json +++ b/fabric/src/main/generated/data/tiny_flowers/recipe/florists_shears_yellow.json @@ -10,7 +10,6 @@ "components": { "minecraft:dyed_color": -75715 }, - "count": 1, - "id": "tiny-flowers:florists_shears" + "id": "tiny_flowers:florists_shears" } } \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json new file mode 100644 index 00000000..85eafce5 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_allium", + "original_id": "minecraft:allium", + "suspicious_stew_effects": [ + { + "duration": 60, + "id": "minecraft:fire_resistance" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json new file mode 100644 index 00000000..b059bbf7 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_azure_bluet", + "original_id": "minecraft:azure_bluet", + "suspicious_stew_effects": [ + { + "duration": 220, + "id": "minecraft:blindness" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json new file mode 100644 index 00000000..071f8758 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_blue_orchid", + "original_id": "minecraft:blue_orchid", + "suspicious_stew_effects": [ + { + "duration": 7, + "id": "minecraft:saturation" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json new file mode 100644 index 00000000..e656f8ee --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json @@ -0,0 +1,15 @@ +{ + "behaviors": [ + { + "type": "sturdy_placement" + } + ], + "can_survive_on": [ + "#minecraft:supports_vegetation", + "#minecraft:sand", + "minecraft:sandstone", + "minecraft:red_sandstone" + ], + "id": "tiny_flowers:tiny_cactus_flower", + "original_id": "minecraft:cactus_flower" +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json new file mode 100644 index 00000000..748079ff --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json @@ -0,0 +1,20 @@ +{ + "behaviors": [ + { + "type": "transform_day_night", + "particle_color": 16545810, + "sound_event_long": "minecraft:block.eyeblossom.open_long", + "sound_event_short": "minecraft:block.eyeblossom.open", + "turns_into": "tiny_flowers:tiny_open_eyeblossom", + "when": "night" + } + ], + "id": "tiny_flowers:tiny_closed_eyeblossom", + "original_id": "minecraft:closed_eyeblossom", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:nausea" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json new file mode 100644 index 00000000..2f38171d --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_cornflower", + "original_id": "minecraft:cornflower", + "suspicious_stew_effects": [ + { + "duration": 100, + "id": "minecraft:jump_boost" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json new file mode 100644 index 00000000..ef8560ef --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_dandelion", + "original_id": "minecraft:dandelion", + "suspicious_stew_effects": [ + { + "duration": 7, + "id": "minecraft:saturation" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json new file mode 100644 index 00000000..3c822b6f --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_lily_of_the_valley", + "original_id": "minecraft:lily_of_the_valley", + "suspicious_stew_effects": [ + { + "duration": 220, + "id": "minecraft:poison" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json new file mode 100644 index 00000000..1c668fa6 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json @@ -0,0 +1,20 @@ +{ + "behaviors": [ + { + "type": "transform_day_night", + "particle_color": 6250335, + "sound_event_long": "minecraft:block.eyeblossom.close_long", + "sound_event_short": "minecraft:block.eyeblossom.close", + "turns_into": "tiny_flowers:tiny_closed_eyeblossom", + "when": "day" + } + ], + "id": "tiny_flowers:tiny_open_eyeblossom", + "original_id": "minecraft:open_eyeblossom", + "suspicious_stew_effects": [ + { + "duration": 220, + "id": "minecraft:blindness" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json new file mode 100644 index 00000000..4ec1d048 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_orange_tulip", + "original_id": "minecraft:orange_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json new file mode 100644 index 00000000..00ef33ed --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_oxeye_daisy", + "original_id": "minecraft:oxeye_daisy", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:regeneration" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json new file mode 100644 index 00000000..e49c50b3 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_pink_tulip", + "original_id": "minecraft:pink_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json new file mode 100644 index 00000000..cb9e651f --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_poppy", + "original_id": "minecraft:poppy", + "suspicious_stew_effects": [ + { + "duration": 100, + "id": "minecraft:night_vision" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json new file mode 100644 index 00000000..024e2999 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_red_tulip", + "original_id": "minecraft:red_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json new file mode 100644 index 00000000..155ccd12 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_torchflower", + "original_id": "minecraft:torchflower", + "suspicious_stew_effects": [ + { + "duration": 100, + "id": "minecraft:night_vision" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json new file mode 100644 index 00000000..bf1fc221 --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_white_tulip", + "original_id": "minecraft:white_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json new file mode 100644 index 00000000..36be9bbf --- /dev/null +++ b/fabric/src/main/generated/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json @@ -0,0 +1,16 @@ +{ + "can_survive_on": [ + "#minecraft:supports_vegetation", + "minecraft:netherrack", + "minecraft:soul_sand", + "minecraft:soul_soil" + ], + "id": "tiny_flowers:tiny_wither_rose", + "original_id": "minecraft:wither_rose", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:wither" + } + ] +} \ No newline at end of file diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/FabricCreativeTabHandler.java b/fabric/src/main/java/co/secretonline/tinyflowers/FabricCreativeTabHandler.java new file mode 100644 index 00000000..84dceba0 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/FabricCreativeTabHandler.java @@ -0,0 +1,38 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.item.ModCreativeModeTabs; +import co.secretonline.tinyflowers.item.ModItems; +import net.fabricmc.fabric.api.creativetab.v1.CreativeModeTabEvents; +import net.fabricmc.fabric.api.event.Event; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.CreativeModeTabs; + +public class FabricCreativeTabHandler { + + public static void addShearsItems() { + CreativeModeTabEvents.modifyOutputEvent(CreativeModeTabs.TOOLS_AND_UTILITIES) + .register((itemGroup) -> itemGroup.accept(ModItems.FLORISTS_SHEARS_ITEM.get())); + CreativeModeTabEvents.modifyOutputEvent(ModCreativeModeTabs.TINY_FLOWERS_TAB_KEY) + .register((itemGroup) -> itemGroup.accept(ModItems.FLORISTS_SHEARS_ITEM.get())); + } + + public static void addTinyFlowerItems() { + // Tiny flowers should be added in the order they original flowers are in their + // own tabs. Thanks to the CreativeModeTabsMixin, we can be pretty certain that + // the tiny flowers group will be at the end. This means we can build up a list + // of the original flowers in order, which we can then use to make all of the + // tiny variants in our final tab. + // We do also need to wait for other mods to add their own + Identifier afterDefaultPhase = TinyFlowers.id("after_default"); + CreativeModeTabEvents.MODIFY_OUTPUT_ALL.addPhaseOrdering(Event.DEFAULT_PHASE, afterDefaultPhase); + + CreativeModeTabEvents.MODIFY_OUTPUT_ALL.register(afterDefaultPhase, (tab, entries) -> { + if (tab.equals(ModCreativeModeTabs.TINY_FLOWERS_TAB.get())) { + ModCreativeModeTabs.addCollectedFlowers(entries.getDisplayStacks(), entries::accept); + return; + } + + ModCreativeModeTabs.collectFlowerData(entries.getDisplayStacks()); + }); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/FabricTinyFlowers.java b/fabric/src/main/java/co/secretonline/tinyflowers/FabricTinyFlowers.java new file mode 100644 index 00000000..88092137 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/FabricTinyFlowers.java @@ -0,0 +1,30 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.block.entity.ModBlockEntities; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.item.ModCreativeModeTabs; +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.item.ModItems; +import co.secretonline.tinyflowers.item.crafting.ModRecipeSerializers; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.registry.DynamicRegistries; + +public class FabricTinyFlowers implements ModInitializer { + + @Override + public void onInitialize() { + ModBlocks.initialize(); + ModBlockEntities.initialize(); + ModComponents.initialize(); + ModItems.initialize(); + ModRecipeSerializers.initialize(); + ModCreativeModeTabs.initialize(); + + DynamicRegistries.registerSynced(ModRegistries.TINY_FLOWER, TinyFlowerData.CODEC); + + FabricCreativeTabHandler.addShearsItems(); + FabricCreativeTabHandler.addTinyFlowerItems(); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/FabricTinyFlowersClient.java b/fabric/src/main/java/co/secretonline/tinyflowers/FabricTinyFlowersClient.java new file mode 100644 index 00000000..291856e8 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/FabricTinyFlowersClient.java @@ -0,0 +1,25 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.block.entity.ModBlockEntities; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.renderer.blockentity.TinyGardenBlockEntityRenderer; +import co.secretonline.tinyflowers.renderer.item.ModSelectItemModelProperties; +import co.secretonline.tinyflowers.resources.FabricFlowerModelDataLoader; +import co.secretonline.tinyflowers.resources.FabricFlowerModelLoadingPlugin; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.rendering.v1.ChunkSectionLayerMap; +import net.fabricmc.fabric.impl.client.model.loading.ModelLoadingPluginManager; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperties; + +public class FabricTinyFlowersClient implements ClientModInitializer { + @Override + public void onInitializeClient() { + SelectItemModelProperties.ID_MAPPER.put(ModSelectItemModelProperties.TINY_FLOWER_PROPERTY_ID, ModSelectItemModelProperties.TINY_FLOWER_PROPERTY); + BlockEntityRenderers.register(ModBlockEntities.TINY_GARDEN_BLOCK_ENTITY.get(), TinyGardenBlockEntityRenderer::new); + ChunkSectionLayerMap.putBlock(ModBlocks.TINY_GARDEN_BLOCK.get(), ChunkSectionLayer.CUTOUT); + + ModelLoadingPluginManager.registerPlugin(new FabricFlowerModelDataLoader(), new FabricFlowerModelLoadingPlugin()); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/FabricTinyFlowersDataGenerator.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/FabricTinyFlowersDataGenerator.java new file mode 100644 index 00000000..d4bdc8a5 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/FabricTinyFlowersDataGenerator.java @@ -0,0 +1,30 @@ +package co.secretonline.tinyflowers.datagen; + +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.TinyFlowersFlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.VanillaFlowerProvider; +import co.secretonline.tinyflowers.datagen.providers.*; +import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; +import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; + +import java.util.List; + +public class FabricTinyFlowersDataGenerator implements DataGeneratorEntrypoint { + @Override + public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { + FabricDataGenerator.Pack pack = fabricDataGenerator.createPack(); + + pack.addProvider(FabricItemTagProvider::new); + pack.addProvider(FabricBlockTagProvider::new); + pack.addProvider(FabricFloristsShearsRecipeProvider::new); + pack.addProvider(FabricDefaultModelProvider::new); + + List mods = List.of( + new TinyFlowersFlowerProvider(), + new VanillaFlowerProvider()); + for (FlowerProvider mod : mods) { + pack.addProvider((output,_) -> new FabricModFlowersProvider(mod, output)); + pack.addProvider((output,_) -> new FabricModModelProvider(mod, output)); + } + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricBlockTagProvider.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricBlockTagProvider.java new file mode 100644 index 00000000..ebfcc26e --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricBlockTagProvider.java @@ -0,0 +1,26 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import java.util.concurrent.CompletableFuture; + +import co.secretonline.tinyflowers.block.ModBlocks; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagsProvider; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalBlockTags; +import net.minecraft.core.HolderLookup; +import net.minecraft.tags.BlockTags; +import org.jspecify.annotations.NonNull; + +public class FabricBlockTagProvider extends FabricTagsProvider.BlockTagsProvider { + public FabricBlockTagProvider(FabricPackOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected void addTags(HolderLookup.@NonNull Provider wrapperLookup) { + valueLookupBuilder(BlockTags.FLOWERS).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + valueLookupBuilder(BlockTags.BEE_ATTRACTIVE).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + valueLookupBuilder(BlockTags.INSIDE_STEP_SOUND_BLOCKS).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + valueLookupBuilder(ConventionalBlockTags.FLOWERS).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + } + +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricDefaultModelProvider.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricDefaultModelProvider.java new file mode 100644 index 00000000..11bb8aeb --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricDefaultModelProvider.java @@ -0,0 +1,53 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.TinyGardenBlock; +import co.secretonline.tinyflowers.item.ModItems; +import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.minecraft.client.color.item.Dye; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.blockstates.MultiPartGenerator; +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import org.jspecify.annotations.NonNull; + +public class FabricDefaultModelProvider extends FabricModelProvider { + private final static Direction[] DIRECTIONS = new Direction[] { + Direction.NORTH, Direction.EAST, + Direction.SOUTH, Direction.WEST, }; + + public FabricDefaultModelProvider(FabricPackOutput generator) { + super(generator); + } + + @Override + public void generateBlockStateModels(@NonNull BlockModelGenerators blockStateModelGenerator) { + MultiPartGenerator definitionCreator = MultiPartGenerator + .multiPart(ModBlocks.TINY_GARDEN_BLOCK.get()); + + for (Direction direction : DIRECTIONS) { + definitionCreator = definitionCreator.with( + BlockModelGenerators.condition() + .term(TinyGardenBlock.FACING, direction), + BlockModelGenerators.plainVariant(TinyFlowers.id("block/tiny_garden"))); + } + + blockStateModelGenerator.blockStateOutput.accept(definitionCreator); + } + + @Override + public void generateItemModels(ItemModelGenerators itemModelGenerator) { + itemModelGenerator.generateItemWithTintedOverlay( + ModItems.FLORISTS_SHEARS_ITEM.get(), + "_handle", + new Dye(DyeColor.RED.getTextureDiffuseColor())); + } + + @Override + public @NonNull String getName() { + return "FloristsShearsItemModelProvider"; + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricFloristsShearsRecipeProvider.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricFloristsShearsRecipeProvider.java new file mode 100644 index 00000000..afe47754 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricFloristsShearsRecipeProvider.java @@ -0,0 +1,49 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import org.jspecify.annotations.NonNull; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class FabricFloristsShearsRecipeProvider extends FabricRecipeProvider { + private static final Map> COLOR_TAGS = Map.ofEntries( + Map.entry(DyeColor.WHITE, ConventionalItemTags.WHITE_DYES), + Map.entry(DyeColor.ORANGE, ConventionalItemTags.ORANGE_DYES), + Map.entry(DyeColor.MAGENTA, ConventionalItemTags.MAGENTA_DYES), + Map.entry(DyeColor.LIGHT_BLUE, ConventionalItemTags.LIGHT_BLUE_DYES), + Map.entry(DyeColor.YELLOW, ConventionalItemTags.YELLOW_DYES), + Map.entry(DyeColor.LIME, ConventionalItemTags.LIME_DYES), + Map.entry(DyeColor.PINK, ConventionalItemTags.PINK_DYES), + Map.entry(DyeColor.GRAY, ConventionalItemTags.GRAY_DYES), + Map.entry(DyeColor.LIGHT_GRAY, ConventionalItemTags.LIGHT_GRAY_DYES), + Map.entry(DyeColor.CYAN, ConventionalItemTags.CYAN_DYES), + Map.entry(DyeColor.PURPLE, ConventionalItemTags.PURPLE_DYES), + Map.entry(DyeColor.BLUE, ConventionalItemTags.BLUE_DYES), + Map.entry(DyeColor.BROWN, ConventionalItemTags.BROWN_DYES), + Map.entry(DyeColor.GREEN, ConventionalItemTags.GREEN_DYES), + Map.entry(DyeColor.RED, ConventionalItemTags.RED_DYES), + Map.entry(DyeColor.BLACK, ConventionalItemTags.BLACK_DYES)); + + public FabricFloristsShearsRecipeProvider(FabricPackOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected @NonNull RecipeProvider createRecipeProvider(HolderLookup.@NonNull Provider registryLookup, @NonNull RecipeOutput exporter) { + return new FloristsShearsRecipeProvider(registryLookup, exporter, COLOR_TAGS); + } + + @Override + public @NonNull String getName() { + return "FloristsShearsRecipeProvider"; + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricItemTagProvider.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricItemTagProvider.java new file mode 100644 index 00000000..46782e24 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricItemTagProvider.java @@ -0,0 +1,25 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import java.util.concurrent.CompletableFuture; + +import co.secretonline.tinyflowers.item.ModItems; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagsProvider; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; +import net.minecraft.core.HolderLookup; +import net.minecraft.tags.ItemTags; +import org.jspecify.annotations.NonNull; + +public class FabricItemTagProvider extends FabricTagsProvider.ItemTagsProvider { + public FabricItemTagProvider(FabricPackOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected void addTags(HolderLookup.@NonNull Provider wrapperLookup) { + valueLookupBuilder(ItemTags.BEE_FOOD).add(ModItems.TINY_FLOWER_ITEM.get()); + valueLookupBuilder(ItemTags.FLOWERS).add(ModItems.TINY_FLOWER_ITEM.get()); + + valueLookupBuilder(ConventionalItemTags.SHEAR_TOOLS).add(ModItems.FLORISTS_SHEARS_ITEM.get()); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricModFlowersProvider.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricModFlowersProvider.java new file mode 100644 index 00000000..6237a78a --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricModFlowersProvider.java @@ -0,0 +1,60 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.Flower; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.Identifier; +import org.jspecify.annotations.NonNull; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class FabricModFlowersProvider implements DataProvider { + private final FlowerProvider modData; + + private final PackOutput.PathProvider tinyFlowersData; + private final PackOutput.PathProvider tinyFlowersResources; + + public FabricModFlowersProvider(FlowerProvider modData, + FabricPackOutput packOutput) { + + this.tinyFlowersData = packOutput.createRegistryElementsPathProvider(ModRegistries.TINY_FLOWER); + this.tinyFlowersResources = packOutput.createPathProvider(PackOutput.Target.RESOURCE_PACK, + Registries.elementsDirPath(ModRegistries.TINY_FLOWER)); + + this.modData = modData; + } + + @Override + public @NonNull String getName() { + return "Mod flowers provider [" + this.modData.getModId() + "]"; + } + + @Override + public @NonNull CompletableFuture run(@NonNull CachedOutput cachedOutput) { + + Map flowerVariantData = new HashMap<>(); + Map flowerVariantResources = new HashMap<>(); + + for (Flower tuple : this.modData.getFlowers()) { + TinyFlowerData data = tuple.data(); + TinyFlowerResources resources = tuple.resources(); + + flowerVariantData.put(data.id(), data); + flowerVariantResources.put(resources.id(), resources); + } + + return CompletableFuture.allOf( + DataProvider.saveAll(cachedOutput, TinyFlowerData.CODEC, this.tinyFlowersData, flowerVariantData), + DataProvider.saveAll(cachedOutput, TinyFlowerResources.CODEC, this.tinyFlowersResources, + flowerVariantResources)); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricModModelProvider.java b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricModModelProvider.java new file mode 100644 index 00000000..83f28d3b --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/datagen/providers/FabricModModelProvider.java @@ -0,0 +1,38 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import org.jspecify.annotations.NonNull; + +public class FabricModModelProvider extends FabricModelProvider implements PartialModelProvider { + private final FlowerProvider modData; + + public FabricModModelProvider(FlowerProvider modData, FabricPackOutput output) { + super(output); + + this.modData = modData; + } + + @Override + public void generateBlockStateModels(BlockModelGenerators blockModelGenerators) { + this.modData.generateBlockStateModels(blockModelGenerators.modelOutput); + } + + @Override + public void generateItemModels(ItemModelGenerators itemModelGenerators) { + this.modData.generateItemModels(itemModelGenerators.itemModelOutput, itemModelGenerators.modelOutput); + } + + @Override + public @NonNull String getName() { + return "Mod models provider [" + this.modData.getModId() + "]"; + } + + @Override + public boolean shouldValidateAllEntries() { + return false; + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricAccessHelper.java b/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricAccessHelper.java new file mode 100644 index 00000000..327a6cc9 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricAccessHelper.java @@ -0,0 +1,17 @@ +package co.secretonline.tinyflowers.platform; + +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.function.BiFunction; + +public class FabricAccessHelper implements AccessHelper { + @Override + public BlockEntityType createBlockEntityType(BiFunction entityFactory, Block... blocks) { + return FabricBlockEntityTypeBuilder.create(entityFactory::apply, blocks).build(); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricFlowerModelHelper.java b/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricFlowerModelHelper.java new file mode 100644 index 00000000..7186bd55 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricFlowerModelHelper.java @@ -0,0 +1,46 @@ +package co.secretonline.tinyflowers.platform; + +import net.fabricmc.fabric.api.client.model.loading.v1.ExtraModelKey; +import net.fabricmc.fabric.api.client.model.loading.v1.FabricModelManager; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.model.loading.v1.SimpleUnbakedExtraModel; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.resources.Identifier; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class FabricFlowerModelHelper implements FlowerModelHelper { + private final Map> knownModels = new HashMap<>(); + + @Override + public void registerModel(@NonNull Identifier id, @NonNull T context) { + if (!(context instanceof ModelLoadingPlugin.Context pluginContext)) { + throw new IllegalArgumentException("Tried to register flower models with incorrect context"); + } + + ExtraModelKey extraModelKey = ExtraModelKey.create(id::toString); + pluginContext.addModel(extraModelKey, SimpleUnbakedExtraModel.blockStateModel(id)); + + knownModels.put(id, extraModelKey); + } + + @Override + public void clear() { + knownModels.clear(); + } + + @Override + public @Nullable BlockStateModel getModel(@NonNull Minecraft client, @NonNull Identifier id) { + var extraModelKey = knownModels.get(id); + if (extraModelKey == null) { + return null; + } + + FabricModelManager modelManager = client.getModelManager(); + return modelManager.getModel(extraModelKey); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricRegistryHelper.java b/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricRegistryHelper.java new file mode 100644 index 00000000..98ca040f --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/platform/FabricRegistryHelper.java @@ -0,0 +1,25 @@ +package co.secretonline.tinyflowers.platform; + +import net.minecraft.core.Registry; +import net.minecraft.resources.Identifier; + +import java.util.function.Supplier; + +public class FabricRegistryHelper implements RegistryHelper { + @Override + public DeferredRegistryObject register(Registry objRegistry, Identifier id, Supplier objSupplier) { + return new FabricDeferredRegistryObject<>(Registry.register(objRegistry, id, objSupplier.get())); + } + + public static class FabricDeferredRegistryObject implements DeferredRegistryObject { + private final T obj; + + public FabricDeferredRegistryObject(T obj) { + this.obj = obj; + } + + public T get() { + return this.obj; + } + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/resources/FabricFlowerModelDataLoader.java b/fabric/src/main/java/co/secretonline/tinyflowers/resources/FabricFlowerModelDataLoader.java new file mode 100644 index 00000000..a813681d --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/resources/FabricFlowerModelDataLoader.java @@ -0,0 +1,22 @@ +package co.secretonline.tinyflowers.resources; + +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import co.secretonline.tinyflowers.helper.FlowerModelHelper; +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; +import net.minecraft.resources.Identifier; +import net.minecraft.server.packs.resources.PreparableReloadListener.SharedState; +import org.jspecify.annotations.NonNull; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +public class FabricFlowerModelDataLoader + implements PreparableModelLoadingPlugin.DataLoader> { + @Override + public @NonNull CompletableFuture> load(@NonNull SharedState sharedState, @NonNull Executor executor) { + return CompletableFuture.supplyAsync( + () -> FlowerModelHelper.readResourceFiles(sharedState.resourceManager()), + executor); + } +} diff --git a/fabric/src/main/java/co/secretonline/tinyflowers/resources/FabricFlowerModelLoadingPlugin.java b/fabric/src/main/java/co/secretonline/tinyflowers/resources/FabricFlowerModelLoadingPlugin.java new file mode 100644 index 00000000..76ddd6b5 --- /dev/null +++ b/fabric/src/main/java/co/secretonline/tinyflowers/resources/FabricFlowerModelLoadingPlugin.java @@ -0,0 +1,29 @@ +package co.secretonline.tinyflowers.resources; + +import co.secretonline.tinyflowers.TinyFlowersClientState; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import co.secretonline.tinyflowers.platform.Services; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin.Context; +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; +import net.minecraft.resources.Identifier; +import org.jspecify.annotations.NonNull; + +import java.util.Map; + +public class FabricFlowerModelLoadingPlugin + implements PreparableModelLoadingPlugin> { + + @Override + public void initialize(Map data, @NonNull Context pluginContext) { + TinyFlowersClientState.RESOURCE_INSTANCES = data; + + for (var entry : data.entrySet()) { + TinyFlowerResources resources = entry.getValue(); + + Services.FLOWER_MODELS.registerModel(resources.model1(), pluginContext); + Services.FLOWER_MODELS.registerModel(resources.model2(), pluginContext); + Services.FLOWER_MODELS.registerModel(resources.model3(), pluginContext); + Services.FLOWER_MODELS.registerModel(resources.model4(), pluginContext); + } + } +} diff --git a/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.AccessHelper b/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.AccessHelper new file mode 100644 index 00000000..2f92ebc9 --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.AccessHelper @@ -0,0 +1 @@ +co.secretonline.tinyflowers.platform.FabricAccessHelper diff --git a/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.FlowerModelHelper b/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.FlowerModelHelper new file mode 100644 index 00000000..bb367e54 --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.FlowerModelHelper @@ -0,0 +1 @@ +co.secretonline.tinyflowers.platform.FabricFlowerModelHelper diff --git a/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.RegistryHelper b/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.RegistryHelper new file mode 100644 index 00000000..5187cd6d --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.RegistryHelper @@ -0,0 +1 @@ +co.secretonline.tinyflowers.platform.FabricRegistryHelper diff --git a/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json similarity index 71% rename from src/main/resources/fabric.mod.json rename to fabric/src/main/resources/fabric.mod.json index d3edcde2..70344430 100644 --- a/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,9 +1,9 @@ { "schemaVersion": 1, - "id": "tiny-flowers", + "id": "${mod_id}", "version": "${version}", - "name": "Tiny Flowers", - "description": "Add tiny variants of all Vanilla flowers.", + "name": "${mod_name}", + "description": "${description}", "authors": [ { "name": "secret_online", @@ -37,34 +37,30 @@ "sources": "https://github.com/SecretOnline/tiny-flowers", "issues": "https://github.com/SecretOnline/tiny-flowers/issues" }, - "license": "MPL-2.0", - "icon": "assets/tiny-flowers/icon.png", + "license": "${license}", + "icon": "assets/${mod_id}/icon.png", "environment": "*", "entrypoints": { "main": [ - "co.secretonline.tinyflowers.TinyFlowers" + "co.secretonline.tinyflowers.FabricTinyFlowers" ], "client": [ - "co.secretonline.tinyflowers.TinyFlowersClient" + "co.secretonline.tinyflowers.FabricTinyFlowersClient" ], "fabric-datagen": [ - "co.secretonline.tinyflowers.datagen.DataGenerator" + "co.secretonline.tinyflowers.datagen.FabricTinyFlowersDataGenerator" ] }, "mixins": [ - "tiny-flowers.mixins.json", - { - "config": "tiny-flowers.client.mixins.json", - "environment": "client" - } + "tiny_flowers.mixins.json" ], "depends": { - "java": ">=21", + "java": ">=25", "fabric-api": "*" }, "recommends": { - "fabricloader": ">=0.18.4", - "minecraft": "~1.21.11" + "fabricloader": ">=0.19.2", + "minecraft": "~${minecraft_version}" }, "custom": { "mc-publish": { diff --git a/gradle.properties b/gradle.properties index 2d672d02..57f4eb48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,19 +1,34 @@ -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G -org.gradle.parallel=true +# Important Notes: +# Every field you add must be added to buildSrc/src/main/groovy/multiloader-common.gradle expandProps map. -java_version=21 +# Project +version=2.0.0 +group=co.secretonline.tinyflowers +java_version=25 -# Fabric Properties -# check these on https://fabricmc.net/develop -minecraft_version=1.21.11 -loader_version=0.18.4 +# Common +minecraft_version=26.1.2 +mod_name=Tiny Flowers +mod_author=secret_online +mod_id=tiny_flowers +license=MPL-2.0 +credits=secret_online +description=Add tiny variants of all Vanilla flowers. +minecraft_version_range=[21.6,) +## This is the version of minecraft that the 'common' project uses, you can find a list of all versions here +## https://projects.neoforged.net/neoforged/neoform +neo_form_version=26.1-snapshot-6-1 -# Mod Properties -# Note: this version number is updated during release -mod_version=0.0.0 -maven_group=co.secretonline.tinyflowers -archives_base_name=tiny-flowers +# Fabric, see https://fabricmc.net/develop/ for new versions +fabric_version=0.146.1+26.1.2 +fabric_loader_version=0.19.2 -# Dependencies -fabric_version=0.141.2+1.21.11 +# NeoForge, see https://projects.neoforged.net/neoforged/neoforge for new versions +neoforge_version=26.1.0.0-alpha.1+snapshot-1 +neoforge_loader_version_range=[4,) + +# Gradle +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +enabled_platforms=fabric,neoforge diff --git a/misc/mod-generator/.editorconfig b/misc/mod-generator/.editorconfig new file mode 100644 index 00000000..63206f90 --- /dev/null +++ b/misc/mod-generator/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = false + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/misc/mod-generator/.gitignore b/misc/mod-generator/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/misc/mod-generator/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/misc/mod-generator/README.md b/misc/mod-generator/README.md new file mode 100644 index 00000000..5eb251db --- /dev/null +++ b/misc/mod-generator/README.md @@ -0,0 +1,14 @@ +# [Tiny Flower Pack Generator](https://tiny-flowers-generator.secretonline.co/) + +A generator for packs of tiny flowers for the Tiny Flowers mod. + +![Screenshot of the pack generator](../../.github/pack-generator.png) + +## Development + +Requires a modern version of Node.js. + +```sh +npm ci +npm run dev +``` diff --git a/misc/mod-generator/index.html b/misc/mod-generator/index.html new file mode 100644 index 00000000..3ae6e419 --- /dev/null +++ b/misc/mod-generator/index.html @@ -0,0 +1,13 @@ + + + + + + Tiny Flower Pack Generator + + + +

+ + + diff --git a/misc/mod-generator/package-lock.json b/misc/mod-generator/package-lock.json new file mode 100644 index 00000000..62d827ad --- /dev/null +++ b/misc/mod-generator/package-lock.json @@ -0,0 +1,1581 @@ +{ + "name": "tiny-flowers-mod-generator", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tiny-flowers-mod-generator", + "version": "0.0.0", + "dependencies": { + "jszip": "^3.10.1", + "svelte-awesome-color-picker": "^4.1.0", + "svelte-portal": "^2.2.1" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tsconfig/svelte": "^5.0.6", + "@types/node": "^24.10.1", + "svelte": "^5.43.8", + "svelte-check": "^4.3.4", + "typescript": "~5.9.3", + "vite": "^7.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.17", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", + "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.6.tgz", + "integrity": "sha512-yGxYL0I9eETH1/DR9qVJey4DAsCdeau4a9wYPKuXfEhm8lFO8wg+LLYJjIpAm6Fw7HSlhepPhYPDop75485yWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", + "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/svelte": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz", + "integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.5.0", + "esm-env": "^1.2.1", + "esrap": "^2.2.1", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-awesome-color-picker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svelte-awesome-color-picker/-/svelte-awesome-color-picker-4.1.0.tgz", + "integrity": "sha512-afiSB3eTBlqu96f4+rjBvqG3eCaLwuneNYHe587Wr4Ien6yQWeztGZunPT0FmiI7wFFBVNUlJQLYutII8LfQUg==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "svelte-awesome-slider": "2.0.0" + }, + "peerDependencies": { + "svelte": "^5.0.0" + } + }, + "node_modules/svelte-awesome-slider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svelte-awesome-slider/-/svelte-awesome-slider-2.0.0.tgz", + "integrity": "sha512-YBkOdYm1Feaqsn2JkJBRs+Kc/X3Qy/3GuVmI7GmoYDjBaHkjx9uH4khTuED22z57Hg3gGWeDhp/clIjWDdLNaw==", + "license": "MIT", + "peerDependencies": { + "svelte": "^5.0.0" + } + }, + "node_modules/svelte-check": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.5.tgz", + "integrity": "sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-portal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/svelte-portal/-/svelte-portal-2.2.1.tgz", + "integrity": "sha512-uF7is5sM4aq5iN7QF/67XLnTUvQCf2iiG/B1BHTqLwYVY1dsVmTeXZ/LeEyU6dLjApOQdbEG9lkqHzxiQtOLEQ==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" + } + } +} diff --git a/misc/mod-generator/package.json b/misc/mod-generator/package.json new file mode 100644 index 00000000..e9d33608 --- /dev/null +++ b/misc/mod-generator/package.json @@ -0,0 +1,26 @@ +{ + "name": "tiny-flowers-mod-generator", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tsconfig/svelte": "^5.0.6", + "@types/node": "^24.10.1", + "svelte": "^5.43.8", + "svelte-check": "^4.3.4", + "typescript": "~5.9.3", + "vite": "^7.2.4" + }, + "dependencies": { + "jszip": "^3.10.1", + "svelte-awesome-color-picker": "^4.1.0", + "svelte-portal": "^2.2.1" + } +} diff --git a/misc/mod-generator/public/icon128.png b/misc/mod-generator/public/icon128.png new file mode 100644 index 00000000..44bf34f5 Binary files /dev/null and b/misc/mod-generator/public/icon128.png differ diff --git a/misc/mod-generator/src/App.svelte b/misc/mod-generator/src/App.svelte new file mode 100644 index 00000000..cea71431 --- /dev/null +++ b/misc/mod-generator/src/App.svelte @@ -0,0 +1,10 @@ + + +
+ +
+ + diff --git a/misc/mod-generator/src/app.css b/misc/mod-generator/src/app.css new file mode 100644 index 00000000..75cb3b20 --- /dev/null +++ b/misc/mod-generator/src/app.css @@ -0,0 +1,232 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + box-sizing: border-box; +} + +h1, +h2, +h3, +h4, +p { + margin-block: 0; +} + +button, +input, +select { + font-size: inherit; + font-family: inherit; +} + +input[type="text"], +input[type="number"], +select, +.file-input-facade { + flex-grow: 1; + width: unset; +} + +.file-input-facade { + padding-inline: 4px; + padding-block: 1px; +} + +label:not(.file-input-facade) { + font-weight: 600; +} + +.visually-hidden { + clip: rect(0 0 0 0); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + position: absolute; + white-space: nowrap; + width: 1px; +} + +.layout-grid { + display: grid; + gap: 1rem; + overflow-x: hidden; +} + +.layout-grid > * { + overflow-x: auto; +} + +.inline-group { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.block-group { + display: flex; + flex-direction: column; + gap: 0.5rem; + align-items: stretch; +} + +.input-group { + background: #f5f5f5; + border: 2px solid lightgrey; + padding: 0.5rem; +} + +.input-group-heading { + font-weight: 600; + margin: 0; +} + +.input-list { + display: flex; + flex-direction: column; + gap: 0.5rem; + padding-inline-start: 0; +} + +.button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding-inline: 4px; + padding-block: 1px; + + border-width: 2px; + border-style: solid; + border-inline-start-color: #2079c0; + border-block-start-color: #2079c0; + border-inline-end-color: #054473; + border-block-end-color: #054473; + /* 248.09 */ + background-color: #0167ac; + color: white; +} +.button:is(:hover, :active, :focus-within) { + background-color: #195a8f; +} + +.icon-button, +.checkbox { + margin: 0; + padding: 0; + + width: 28px; + height: 28px; +} + +.button svg, +.checkbox svg { + fill: currentColor; + width: 24px; + height: 24px; + flex-shrink: 0; +} + +.text-input { + border-width: 2px; + border-style: solid; + border-inline-start-color: #aaaaaa; + border-block-start-color: #aaaaaa; + border-inline-end-color: #d3d3d3; + border-block-end-color: #d3d3d3; + /* 0 */ + background-color: #fafafa; + color: black; +} +.text-input:not(:is(:read-only, :disabled)):is(:hover, :active, :focus-within) { + background-color: #e6e6e6; +} +.text-input:read-only, +.text-input:disabled { + background-color: transparent; + color: #414141; +} + +.checkbox { + border-width: 2px; + border-style: solid; + border-inline-start-color: #2079c0; + border-block-start-color: #2079c0; + border-inline-end-color: #054473; + border-block-end-color: #054473; + /* 0 */ + background-color: #fafafa; + color: white; +} +.checkbox:not(:is(:disabled)):is(:hover, :active, :focus-within) { + background-color: #e6e6e6; +} +.checkbox:is(input:checked ~ .checkbox) { + border-inline-start-color: #318941; + border-block-start-color: #318941; + border-inline-end-color: #124f20; + border-block-end-color: #124f20; + /* 146.85 */ + background-color: #1b7730; +} +.checkbox:is(input:checked ~ .checkbox):not(input:checked ~ :is(:disabled)):is( + :hover, + :active, + :focus-within + ) { + background-color: #256631; +} +.checkbox:is(input:checked ~ :is(:disabled)) { + filter: grayscale(); +} + +.color-delete { + border-inline-start-color: #a65c5a; + border-block-start-color: #a65c5a; + border-inline-end-color: #6c2829; + border-block-end-color: #6c2829; + /* 21.72 */ + background-color: #a23c3f; +} +.color-delete:is(:hover, :active, :focus-within) { + background-color: #883a3b; +} + +.color-add { + border-inline-start-color: #318941; + border-block-start-color: #318941; + border-inline-end-color: #124f20; + border-block-end-color: #124f20; + /* 146.85 */ + background-color: #1b7730; +} +.color-add:is(:hover, :active, :focus-within) { + background-color: #256631; +} + +.spin { + animation: Spin 4s linear infinite; +} + +.slow-spin { + animation: Spin 40s linear infinite; +} + +@keyframes Spin { + 0% { + rotate: 0deg; + } + 100% { + rotate: 360deg; + } +} diff --git a/misc/mod-generator/src/assets/example_1.0.0.jar b/misc/mod-generator/src/assets/example_1.0.0.jar new file mode 100644 index 00000000..f28e3a97 Binary files /dev/null and b/misc/mod-generator/src/assets/example_1.0.0.jar differ diff --git a/misc/mod-generator/src/assets/generator/bg.png b/misc/mod-generator/src/assets/generator/bg.png new file mode 100644 index 00000000..beddac3e Binary files /dev/null and b/misc/mod-generator/src/assets/generator/bg.png differ diff --git a/misc/mod-generator/src/assets/generator/default-flowers.png b/misc/mod-generator/src/assets/generator/default-flowers.png new file mode 100644 index 00000000..abce4ff8 Binary files /dev/null and b/misc/mod-generator/src/assets/generator/default-flowers.png differ diff --git a/misc/mod-generator/src/assets/generator/grass-only.png b/misc/mod-generator/src/assets/generator/grass-only.png new file mode 100644 index 00000000..7340ae99 Binary files /dev/null and b/misc/mod-generator/src/assets/generator/grass-only.png differ diff --git a/misc/mod-generator/src/assets/generator/stems.png b/misc/mod-generator/src/assets/generator/stems.png new file mode 100644 index 00000000..cbf6b236 Binary files /dev/null and b/misc/mod-generator/src/assets/generator/stems.png differ diff --git a/misc/mod-generator/src/assets/generator/title-only.png b/misc/mod-generator/src/assets/generator/title-only.png new file mode 100644 index 00000000..b4b64f9d Binary files /dev/null and b/misc/mod-generator/src/assets/generator/title-only.png differ diff --git a/misc/mod-generator/src/assets/missing32.png b/misc/mod-generator/src/assets/missing32.png new file mode 100644 index 00000000..f834db78 Binary files /dev/null and b/misc/mod-generator/src/assets/missing32.png differ diff --git a/misc/mod-generator/src/lib/components/GeneratorForm.svelte b/misc/mod-generator/src/lib/components/GeneratorForm.svelte new file mode 100644 index 00000000..e629ae5a --- /dev/null +++ b/misc/mod-generator/src/lib/components/GeneratorForm.svelte @@ -0,0 +1,216 @@ + + +
+

Tiny Flower Pack Generator

+
+

+ Create packs of tiny flowers for the Tiny Flowers + mod. If you need even more customisation, check out the "For other mod developers" + section of the + README on GitHub for documentation on the JSON files the mod uses. +

+

+ All processing happens in your browser, no data is sent anywhere. If you + need to save your progress, just download a .jar file and upload it again + to restore. +

+
+ { + const file = event.currentTarget.files?.[0]; + if (file) { + uploadJar(file); + } + }} + /> + + + +
+
+ +

+ {formState.metadata.name || "New mod"} (v{formState.metadata.version ?? + "???"}) +

+ + + +
+
+

Flowers

+
+ + {#each formState.flowers, flowerIndex (flowerIndex)} + removeFlower(flowerIndex)} + /> + {/each} + + +
+
+ + diff --git a/misc/mod-generator/src/lib/components/ImagePreview.svelte b/misc/mod-generator/src/lib/components/ImagePreview.svelte new file mode 100644 index 00000000..84f453a8 --- /dev/null +++ b/misc/mod-generator/src/lib/components/ImagePreview.svelte @@ -0,0 +1,43 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/color-picker/ColorPickerButton.svelte b/misc/mod-generator/src/lib/components/color-picker/ColorPickerButton.svelte new file mode 100644 index 00000000..fc8557c8 --- /dev/null +++ b/misc/mod-generator/src/lib/components/color-picker/ColorPickerButton.svelte @@ -0,0 +1,99 @@ + + + + + + diff --git a/misc/mod-generator/src/lib/components/color-picker/ColorPickerWrapper.svelte b/misc/mod-generator/src/lib/components/color-picker/ColorPickerWrapper.svelte new file mode 100644 index 00000000..2c981a4a --- /dev/null +++ b/misc/mod-generator/src/lib/components/color-picker/ColorPickerWrapper.svelte @@ -0,0 +1,40 @@ + + +
+ {@render children()} +
+ + diff --git a/misc/mod-generator/src/lib/components/color-picker/StyledColorPicker.svelte b/misc/mod-generator/src/lib/components/color-picker/StyledColorPicker.svelte new file mode 100644 index 00000000..f489eca1 --- /dev/null +++ b/misc/mod-generator/src/lib/components/color-picker/StyledColorPicker.svelte @@ -0,0 +1,39 @@ + + +
+
+ +
+ + diff --git a/misc/mod-generator/src/lib/components/color-picker/context.ts b/misc/mod-generator/src/lib/components/color-picker/context.ts new file mode 100644 index 00000000..625e1eb0 --- /dev/null +++ b/misc/mod-generator/src/lib/components/color-picker/context.ts @@ -0,0 +1,3 @@ +import { createContext } from "svelte"; + +export const [getPortalId, setPortalId] = createContext(); diff --git a/misc/mod-generator/src/lib/components/form/BlockTextureRow.svelte b/misc/mod-generator/src/lib/components/form/BlockTextureRow.svelte new file mode 100644 index 00000000..82d8f7cf --- /dev/null +++ b/misc/mod-generator/src/lib/components/form/BlockTextureRow.svelte @@ -0,0 +1,194 @@ + + + + + +
+ +
+ + + +
+ +
+ + {#if hasCreateTexture} + + {#if entry.texture.type === "create"} + +
+ +
+ {/if} + + {/if} + {#if hasFileTexture || hasCreateTexture} + + {#if entry.texture.type === "file"} + {@const tex = entry.texture} + +
+ { + const dt = new DataTransfer(); + if (tex.file) { + dt.items.add(tex.file); + } + return dt.files; + }, + (newFiles) => { + tex.file = newFiles?.[0] ?? undefined; + } + } + /> + +
+ {:else if entry.texture.type === "create"} + { + if (entry.texture.type === "create") { + entry.texture.file = file; + } + }} + {itemTexture} + /> + {/if} + + {/if} + + +
+ {#if entry.texture.type === "file" || entry.texture.type === "create"} + + {:else if entry.texture.type === "reference"} + + {/if} +
+ + + + + {#if hasFileTexture || hasCreateTexture} + + {#if entry.texture.type === "file" || entry.texture.type === "create"} + + {/if} + + {/if} + + + diff --git a/misc/mod-generator/src/lib/components/form/FlowerSection.svelte b/misc/mod-generator/src/lib/components/form/FlowerSection.svelte new file mode 100644 index 00000000..f59fe05f --- /dev/null +++ b/misc/mod-generator/src/lib/components/form/FlowerSection.svelte @@ -0,0 +1,766 @@ + + +{#if flower.isExpanded} +
+
+ +

+ {flowerName} +

+ {#if onRemove} + + {/if} +
+ +
+ +
+ +
+
+ +
+ +
+ +
+

+ When Florists' Shears are used on this block, it will be turned into + Tiny Flowers. +

+
+ +
+ +
+ + +
+

+ Check this box if the original flower is made of multiple parts (e.g. + Pink Petals, Wildflowers, or Leaf Litter). +

+
+ + {#if !flower.isSegmented} +
+ +
+ { + const dt = new DataTransfer(); + if (flower.itemTexture) { + dt.items.add(flower.itemTexture); + } + return dt.files; + }, + (newFiles) => { + flower.itemTexture = newFiles?.[0] ?? undefined; + } + } + /> + +
+ + +
+ {/if} + + {#if !flower.isSegmented} +
+

Translations

+ + + + + + + + + + + {#each flower.name as entry, i (i)} + + + + + + {/each} + +
Language IDFlower Name
+ +
+ +
+
+ +
+ +
+
+ +
+ + +
+ {/if} + +
+

Can Survive On

+
    + {#each flower.canSurviveOn, i (i)} +
  • + + +
  • + {/each} +
+ +
+ + + +
+
+ +
+

Suspicious Stew Effects

+ + + + + + + + + + + {#each flower.suspiciousStewEffects as effect, i (i)} + + + + + + {/each} + +
Effect IDDuration (ticks)
+ +
+ +
+
+ +
+ +
+
+ +
+ + +
+ +
+ +

+ The Tiny Flowers mod provides a set of built-in models that only need + the upwards facing textures defined. In general, try to use the fewest + number of layers while still getting the idea of the original flower + across. +

+

+ The "Pink Petals" model has only a single stem in positions 2 and 4. The + layered models added by Tiny Flowers have three stems in position 2, and + two stems in position 4 for added variety. +

+
+ {#each PREDEFINED_BLOCK_MODELS as model} + + {/each} +
+
+ +
+ +
+ +
+ {#if flower.parentModel.type === "prefix"} + {@const prefix = flower.parentModel.prefix ?? ""} +
+ +
+

+ This generator will generate 4 block models, with parents of {prefix}_1, {prefix}_2, {prefix}_3, and + {prefix}_4. +

+ {:else if flower.parentModel.type === "custom"} +
+ +
+
+ +
+
+ +
+
+ +
+ {/if} +
+ +
+ +
+ +
+

+ When using the default stem, or any other model that has an element with + a tintindex, set which source should be used for the tint. + The Tiny Flowers mod currently does not support multiple + tintindexes in the same model. +

+
+ +
+

Block Textures

+ + + + + + + {#if hasCreateTexture} + + {/if} + {#if hasFileTexture || hasCreateTexture} + + {/if} + + + {#if hasFileTexture || hasCreateTexture} + + {/if} + + + + {#each flower.blockTextures, i (i)} + removeBlockTexture(i)} + /> + {/each} + +
Texture SlotType Template + {#if hasFileTexture} + File + {/if} + {#if hasFileTexture && hasCreateTexture} + / + {/if} + {#if hasCreateTexture} + Colors + {/if} + IdentifierPreview
+ + +
+
+{:else} + {@const previewTexture = + flower.itemTexture ?? + ( + flower.blockTextures.find( + (t) => t.slot === "particle" && t.texture.type === "file", + )?.texture as TextureFile + )?.file ?? + undefined} +
+ +

+ {flowerName} +

+ + +
+{/if} + + diff --git a/misc/mod-generator/src/lib/components/form/FlowerbedTextureGenerator.svelte b/misc/mod-generator/src/lib/components/form/FlowerbedTextureGenerator.svelte new file mode 100644 index 00000000..fa5ae513 --- /dev/null +++ b/misc/mod-generator/src/lib/components/form/FlowerbedTextureGenerator.svelte @@ -0,0 +1,396 @@ + + +{#if typeof window.OffscreenCanvas !== "undefined"} +
+ + + + + +
+{/if} + + diff --git a/misc/mod-generator/src/lib/components/form/MetadataSection.svelte b/misc/mod-generator/src/lib/components/form/MetadataSection.svelte new file mode 100644 index 00000000..027ed619 --- /dev/null +++ b/misc/mod-generator/src/lib/components/form/MetadataSection.svelte @@ -0,0 +1,220 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/form/ModIconGenerator.svelte b/misc/mod-generator/src/lib/components/form/ModIconGenerator.svelte new file mode 100644 index 00000000..a42349ae --- /dev/null +++ b/misc/mod-generator/src/lib/components/form/ModIconGenerator.svelte @@ -0,0 +1,441 @@ + + +{#if typeof window.OffscreenCanvas !== "undefined"} +
+

+ You can also create an icon by uploading your mod's logo, selecting a + background color, and uploading flower textures. +

+
+ { + const dt = new DataTransfer(); + if (image) { + dt.items.add(image); + } + return dt.files; + }, + (newFiles) => { + image = newFiles?.[0] ?? undefined; + } + } + /> + + +
+
+ { + const dt = new DataTransfer(); + if (flower1) { + dt.items.add(flower1); + } + return dt.files; + }, + (newFiles) => { + flower1 = newFiles?.[0] ?? undefined; + } + } + /> + { + const dt = new DataTransfer(); + if (flower2) { + dt.items.add(flower2); + } + return dt.files; + }, + (newFiles) => { + flower2 = newFiles?.[0] ?? undefined; + } + } + /> + { + const dt = new DataTransfer(); + if (flower3) { + dt.items.add(flower3); + } + return dt.files; + }, + (newFiles) => { + flower3 = newFiles?.[0] ?? undefined; + } + } + /> + { + const dt = new DataTransfer(); + if (flower4) { + dt.items.add(flower4); + } + return dt.files; + }, + (newFiles) => { + flower4 = newFiles?.[0] ?? undefined; + } + } + /> + Flower textures: + + + + +
+
+{/if} + + diff --git a/misc/mod-generator/src/lib/components/icons/Add.svelte b/misc/mod-generator/src/lib/components/icons/Add.svelte new file mode 100644 index 00000000..a92a228d --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Add.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Check.svelte b/misc/mod-generator/src/lib/components/icons/Check.svelte new file mode 100644 index 00000000..1826e435 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Check.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Cube.svelte b/misc/mod-generator/src/lib/components/icons/Cube.svelte new file mode 100644 index 00000000..fe649a83 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Cube.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Delete.svelte b/misc/mod-generator/src/lib/components/icons/Delete.svelte new file mode 100644 index 00000000..8332d5e7 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Delete.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Download.svelte b/misc/mod-generator/src/lib/components/icons/Download.svelte new file mode 100644 index 00000000..cae74cf4 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Download.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Empty.svelte b/misc/mod-generator/src/lib/components/icons/Empty.svelte new file mode 100644 index 00000000..3d50e948 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Empty.svelte @@ -0,0 +1,14 @@ + + + + diff --git a/misc/mod-generator/src/lib/components/icons/ExpandDown.svelte b/misc/mod-generator/src/lib/components/icons/ExpandDown.svelte new file mode 100644 index 00000000..fc4c6634 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/ExpandDown.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/ExpandRight.svelte b/misc/mod-generator/src/lib/components/icons/ExpandRight.svelte new file mode 100644 index 00000000..69a2a25a --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/ExpandRight.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Image.svelte b/misc/mod-generator/src/lib/components/icons/Image.svelte new file mode 100644 index 00000000..542b7173 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Image.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/ImageUpload.svelte b/misc/mod-generator/src/lib/components/icons/ImageUpload.svelte new file mode 100644 index 00000000..13185409 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/ImageUpload.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Palette.svelte b/misc/mod-generator/src/lib/components/icons/Palette.svelte new file mode 100644 index 00000000..7b6d00cc --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Palette.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Progress.svelte b/misc/mod-generator/src/lib/components/icons/Progress.svelte new file mode 100644 index 00000000..cb695044 --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Progress.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/components/icons/Upload.svelte b/misc/mod-generator/src/lib/components/icons/Upload.svelte new file mode 100644 index 00000000..3dc5c26f --- /dev/null +++ b/misc/mod-generator/src/lib/components/icons/Upload.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/misc/mod-generator/src/lib/conversion.ts b/misc/mod-generator/src/lib/conversion.ts new file mode 100644 index 00000000..76f0460c --- /dev/null +++ b/misc/mod-generator/src/lib/conversion.ts @@ -0,0 +1,700 @@ +import JSZip from "jszip"; +import type { + AllFiles, + BlockModelGeneratedJson, + FabricModJson, + ItemModelGeneratedJson, + ItemsModelDefinitionJson, + LanguageJson, + TinyFlowerDataJson, + TinyFlowerResourcesJson, +} from "./types/files"; +import type { + CombinedFlowerData, + FormState, + ParentModelType, + TextureType, +} from "./types/state"; +import { + blockTexturePathForSlot, + identifierNamespace, + identifierPath, + identifierPathFinal, +} from "./util"; + +function trimFileName(name: string): string { + return name.replace(/\.[^\.]+$/, ""); +} + +export function convertFormToFiles(state: FormState): AllFiles { + const cases: ItemsModelDefinitionJson["model"]["cases"] = []; + + const value: AllFiles = { + fabricModJson: { + schemaVersion: 1, + id: state.metadata.id, + version: state.metadata.version, + name: state.metadata.name, + description: state.metadata.description, + authors: state.metadata.authors, + license: state.metadata.license, + icon: `assets/${state.metadata.id}/icon.png`, + environment: "*", + entrypoints: { client: [], main: [] }, + depends: { tiny_flowers: ">=2.0.0" }, + custom: { modmenu: { parent: "tiny_flowers" } }, + }, + data: { + tinyFlowers: {}, + }, + assets: { + icon: state.metadata.icon, + tinyFlowers: {}, + lang: {}, + textures: { + block: {}, + item: {}, + }, + models: { + block: {}, + item: {}, + }, + items: { + tiny_flower: { + model: { + type: "minecraft:select", + cases, + property: "tiny_flowers:tiny_flower", + fallback: { + type: "minecraft:model", + model: "tiny_flowers:item/tiny_garden", + }, + }, + }, + }, + }, + }; + + for (const flower of state.flowers) { + const flowerNamespace = identifierNamespace(flower.id); + const flowerPath = identifierPath(flower.id); + + value.data.tinyFlowers[flower.id] = { + id: flower.id, + original_id: flower.originalId, + can_survive_on: + flower.canSurviveOn.length === 1 && + flower.canSurviveOn[0] === "#minecraft:supports_vegetation" + ? undefined + : flower.canSurviveOn, + is_segmented: flower.isSegmented ? true : undefined, + suspicious_stew_effects: + flower.suspiciousStewEffects.length === 0 + ? undefined + : flower.suspiciousStewEffects, + behaviors: flower.behaviors.length === 0 ? undefined : flower.behaviors, + }; + + value.assets.tinyFlowers[flower.id] = { + id: flower.id, + item_model: `${flowerNamespace}:item/${flowerPath}`, + tint_source: + flower.tintSource === "grass" ? undefined : flower.tintSource, + model1: `${flowerNamespace}:block/tiny_flowers/${flowerPath}_1`, + model2: `${flowerNamespace}:block/tiny_flowers/${flowerPath}_2`, + model3: `${flowerNamespace}:block/tiny_flowers/${flowerPath}_3`, + model4: `${flowerNamespace}:block/tiny_flowers/${flowerPath}_4`, + }; + + const flowerLangKey = `block.${flowerNamespace}.${flowerPath}`; + for (const { language, name } of flower.name) { + if (!value.assets.lang[language]) { + value.assets.lang[language] = {}; + } + + value.assets.lang[language][flowerLangKey] = name; + } + + const textureMap: Record = {}; + for (const { slot, texture } of flower.blockTextures) { + if (texture.type === "reference") { + textureMap[slot] = texture.reference; + } else if (texture.type === "file") { + if (!texture.file) { + continue; + } + + const textureIdentifier = blockTexturePathForSlot(flower.id, slot); + value.assets.textures.block[textureIdentifier] = texture.file; + textureMap[slot] = textureIdentifier; + } + } + + function blockModelId(index: number) { + return `${flowerNamespace}:block/tiny_flowers/${flowerPath}_${index}`; + } + function blockModelContent(index: number): BlockModelGeneratedJson { + let modelString; + switch (flower.parentModel.type) { + case "prefix": + modelString = `${flower.parentModel.prefix}_${index}`; + break; + case "custom": + switch (index) { + case 1: + modelString = flower.parentModel.model1; + break; + case 2: + modelString = flower.parentModel.model2; + break; + case 3: + modelString = flower.parentModel.model3; + break; + case 4: + modelString = flower.parentModel.model4; + break; + default: + throw new Error("Invalid index"); + } + break; + default: + throw new Error( + `Unknown model parent type ${ + (flower.parentModel as any).type + } for flower ${flower.id}`, + ); + } + + return { + parent: modelString, + textures: textureMap, + }; + } + value.assets.models.block[blockModelId(1)] = blockModelContent(1); + value.assets.models.block[blockModelId(2)] = blockModelContent(2); + value.assets.models.block[blockModelId(3)] = blockModelContent(3); + value.assets.models.block[blockModelId(4)] = blockModelContent(4); + + if (flower.itemTexture) { + value.assets.textures.item[flower.id] = flower.itemTexture; + value.assets.models.item[flower.id] = { + parent: "minecraft:item/generated", + textures: { + layer0: `${flowerNamespace}:item/${trimFileName( + flower.itemTexture.name, + )}`, + }, + }; + } + + cases.push({ + model: { + type: "minecraft:model", + model: `${flowerNamespace}:item/${flowerPath}`, + }, + when: `${flowerNamespace}:${flowerPath}`, + }); + } + + return value; +} + +export function convertFilesToForm(files: AllFiles): FormState { + var manifest = files.fabricModJson; + + var state: FormState = { + stateVersion: 1, + metadata: { + id: manifest.id, + version: manifest.version, + name: manifest.name, + description: manifest.description, + authors: manifest.authors, + license: manifest.license, + icon: files.assets.icon, + }, + flowers: [], + }; + + for (const [identifier, data] of Object.entries(files.data.tinyFlowers)) { + if (!data) { + continue; + } + + const flowerNamespace = identifierNamespace(identifier); + const flowerPath = identifierPath(identifier); + + const resources = files.assets.tinyFlowers[data.id]; + if (!resources) { + throw new Error( + `Flower ${data.id} has no resources definition (Tried to find assets/${flowerNamespace}/tiny_flowers/tiny_flower/${flowerPath}.json)`, + ); + } + + const model1 = files.assets.models.block[resources.model1]; + const model2 = files.assets.models.block[resources.model2]; + const model3 = files.assets.models.block[resources.model3]; + const model4 = files.assets.models.block[resources.model4]; + if (!(model1 && model2 && model3 && model4)) { + throw new Error(`Flower ${data.id} has a missing block model`); + } + + let parentModel: ParentModelType; + const model1ParentMatch = model1.parent.match(/^(.*)_1$/); + if ( + model1ParentMatch && + model2.parent.match(new RegExp(`^${model1ParentMatch[1]}_2$`)) && + model3.parent.match(new RegExp(`^${model1ParentMatch[1]}_3$`)) && + model4.parent.match(new RegExp(`^${model1ParentMatch[1]}_4$`)) + ) { + parentModel = { + type: "prefix", + prefix: model1ParentMatch[1], + }; + } else { + parentModel = { + type: "custom", + model1: model1.parent, + model2: model2.parent, + model3: model3.parent, + model4: model4.parent, + }; + } + + const blockTextures: CombinedFlowerData["blockTextures"] = []; + function setTextureForSlot(slot: string, texture: TextureType) { + const existingItem = blockTextures.find((entry) => entry.slot === slot); + if (!existingItem) { + blockTextures.push({ slot, texture }); + } else { + existingItem.texture = texture; + } + } + for (const [slot, identifier] of Object.entries(model1.textures)) { + const file = files.assets.textures.block[identifier]; + if (!file) { + setTextureForSlot(slot, { type: "reference", reference: identifier }); + } else { + setTextureForSlot(slot, { type: "file", file }); + } + } + + const nameList: CombinedFlowerData["name"] = [ + { language: "en_us", name: "" }, + ]; + function setItemNameForLanguage(language: string, name: string) { + const existingItem = nameList.find( + (entry) => entry.language === language, + ); + if (!existingItem) { + nameList.push({ language, name }); + } else { + existingItem.name = name; + } + } + for (const [languageKey, values] of Object.entries(files.assets.lang)) { + if (!values) { + continue; + } + + const value = values[`block.${flowerNamespace}.${flowerPath}`]; + if (value) { + setItemNameForLanguage(languageKey, value); + } + } + + const itemModel = files.assets.models.item[resources.item_model]; + let itemTexture: File | undefined; + if (itemModel) { + itemTexture = files.assets.textures.item[itemModel.textures.layer0]; + } + + const item: CombinedFlowerData = { + id: data.id, + name: nameList, + originalId: data.original_id, + isSegmented: data.is_segmented ?? false, + canSurviveOn: data.can_survive_on ?? ["#minecraft:supports_vegetation"], + suspiciousStewEffects: data.suspicious_stew_effects ?? [], + behaviors: data.behaviors ?? [], + tintSource: resources.tint_source ?? "grass", + itemTexture, + parentModel, + blockTextures, + isExpanded: false, + }; + + state.flowers.push(item); + } + + return state; +} + +function appendJson(zip: JSZip, json: object, fileName: string) { + const str = JSON.stringify(json, null, 2); + const file = new File([str], fileName, { type: "application/json" }); + zip.file(fileName, file); +} + +function appendFile(zip: JSZip, file: File, fileName = file.name) { + zip.file(fileName, file); +} + +function buildModsToml(json: FabricModJson): string { + const lines: string[] = [ + 'modLoader = "javafml"', + 'loaderVersion = "[4,)"', + `license = "${json.license}"`, + "[[mods]]", + `modId = "${json.id}"`, + `version = "${json.version}"`, + `displayName = "${json.name}"`, + `logoFile="assets/${json.id}/icon.png"`, + `authors = "${json.authors.join(", ")}"`, + `description = '''${json.description}'''`, + `[[dependencies.${json.id}]]`, + 'modId = "neoforge"', + 'type="required"', + 'versionRange = "*"', + `[[dependencies.${json.id}]]`, + 'modId = "minecraft"', + 'type="required"', + 'versionRange = "*"', + `[[dependencies.${json.id}]]`, + 'modId = "tiny_flowers"', + 'type="required"', + 'versionRange = "*"', + ]; + + return lines.join("\n"); +} + +export async function convertFilesToZip(files: AllFiles): Promise { + const zip = new JSZip(); + + appendJson(zip, files.fabricModJson, "fabric.mod.json"); + appendFile( + zip.folder("META-INF")!, + new File([buildModsToml(files.fabricModJson)], "neoforge.mods.toml"), + ); + + const dirCache: Record< + | "flowerData" + | "assets" + | "items" + | "lang" + | "flowerResources" + | "blockModel" + | "itemModel" + | "blockTexture" + | "itemTexture", + Record + > = { + flowerData: {}, + assets: {}, + items: {}, + lang: {}, + flowerResources: {}, + blockModel: {}, + itemModel: {}, + blockTexture: {}, + itemTexture: {}, + }; + function getZipDir(key: keyof typeof dirCache, namespace: string): JSZip { + if (!dirCache[key][namespace]) { + let fullPath: string; + switch (key) { + case "flowerData": + fullPath = `data/${namespace}/tiny_flowers/tiny_flower`; + break; + case "flowerResources": + fullPath = `assets/${namespace}/tiny_flowers/tiny_flower`; + break; + case "assets": + fullPath = `assets/${namespace}`; + break; + case "items": + fullPath = `assets/${namespace}/items`; + break; + case "lang": + fullPath = `assets/${namespace}/lang`; + break; + case "blockModel": + fullPath = `assets/${namespace}/models/block/tiny_flowers`; + break; + case "itemModel": + fullPath = `assets/${namespace}/models/item`; + break; + case "blockTexture": + fullPath = `assets/${namespace}/textures/block`; + break; + case "itemTexture": + fullPath = `assets/${namespace}/textures/item`; + break; + } + + dirCache[key][namespace] = zip.folder(fullPath)!; + } + + return dirCache[key][namespace]; + } + + function appendIdentifiedJson( + key: keyof typeof dirCache, + identifier: string, + json: object, + ) { + appendJson( + getZipDir(key, identifierNamespace(identifier)), + json, + `${identifierPathFinal(identifier)}.json`, + ); + } + + for (const [identifier, flowerData] of Object.entries( + files.data.tinyFlowers, + )) { + if (!flowerData) { + continue; + } + + appendIdentifiedJson("flowerData", identifier, flowerData); + } + + if (files.assets.icon) { + appendFile( + getZipDir("assets", files.fabricModJson.id), + files.assets.icon, + "icon.png", + ); + } + + if (files.assets.items.tiny_flower) { + appendJson( + getZipDir("items", files.fabricModJson.id), + files.assets.items.tiny_flower, + "tiny_flower.json", + ); + } + + for (const [key, languageData] of Object.entries(files.assets.lang)) { + if (!languageData) { + continue; + } + + appendJson( + getZipDir("lang", files.fabricModJson.id), + languageData, + `${key}.json`, + ); + } + + for (const [identifier, flowerResources] of Object.entries( + files.assets.tinyFlowers, + )) { + if (!flowerResources) { + continue; + } + + appendIdentifiedJson("flowerResources", identifier, flowerResources); + } + + for (const [identifier, model] of Object.entries(files.assets.models.block)) { + if (!model) { + continue; + } + + appendIdentifiedJson("blockModel", identifier, model); + } + + for (const [identifier, model] of Object.entries(files.assets.models.item)) { + if (!model) { + continue; + } + + appendIdentifiedJson("itemModel", identifier, model); + } + + for (const [identifier, textureFile] of Object.entries( + files.assets.textures.block, + )) { + if (!textureFile) { + continue; + } + + appendFile( + getZipDir("blockTexture", identifierNamespace(identifier)), + textureFile, + `${identifierPathFinal(identifier)}.png`, + ); + } + + for (const [identifier, textureFile] of Object.entries( + files.assets.textures.item, + )) { + if (!textureFile) { + continue; + } + + appendFile( + getZipDir("itemTexture", identifierNamespace(identifier)), + textureFile, + `${identifierPathFinal(identifier)}.png`, + ); + } + + const exportBlob = await zip.generateAsync({ type: "blob" }); + const exportFile = new File( + [exportBlob], + `${files.fabricModJson.id}_${files.fabricModJson.version}.jar`, + { type: "application/json" }, + ); + + return exportFile; +} + +const NAMESPACED_PATH_REGEX = /^(data|assets)\/([^\/]+)\/(.*)$/; +const TINY_FLOWERS_JSON_REGEX = /^tiny_flowers\/tiny_flower\/(.*)\.json$/; +const LANG_JSON_REGEX = /^lang\/(.*)\.json$/; +const MODELS_JSON_REGEX = /^models\/(item|block\/tiny_flowers)\/(.*)\.json$/; +const TEXTURES_JSON_REGEX = /^textures\/(item|block)\/(.*)\.png$/; + +export async function convertZipToFiles(file: File): Promise { + const inputZip = await JSZip.loadAsync(file); + + const allFiles: AllFiles = { + fabricModJson: { + id: "", + name: "", + version: "", + license: "", + authors: [], + depends: { tiny_flowers: ">=2.0.0" }, + description: "", + entrypoints: { client: [], main: [] }, + environment: "*", + icon: "", + schemaVersion: 1, + custom: { modmenu: { parent: "tiny_flowers" } }, + }, + data: { tinyFlowers: {} }, + assets: { + tinyFlowers: {}, + icon: undefined, + lang: {}, + items: {} as never, + models: { block: {}, item: {} }, + textures: { block: {}, item: {} }, + }, + }; + + const allPromises: Promise[] = []; + + async function processFile(zipObject: JSZip.JSZipObject) { + if (zipObject.name === "fabric.mod.json") { + const jsonString = await zipObject.async("text"); + const modJson = JSON.parse(jsonString) as FabricModJson; + + // Do a merge of the defaults, just in case. + for (const [key, value] of Object.entries(modJson)) { + (allFiles.fabricModJson as any)[key] = value; + } + return; + } + + const namespacedPathMatch = zipObject.name.match(NAMESPACED_PATH_REGEX); + if (!namespacedPathMatch) { + // Unknown file, just skip. + return; + } + const [, type, namespace, remainingPath] = namespacedPathMatch; + + if (type === "data") { + const tinyFlowersMatch = remainingPath.match(TINY_FLOWERS_JSON_REGEX); + if (!tinyFlowersMatch) { + return; + } + + const [, flowerId] = tinyFlowersMatch; + const jsonString = await zipObject.async("text"); + const flowerData = JSON.parse(jsonString) as TinyFlowerDataJson; + + allFiles.data.tinyFlowers[`${namespace}:${flowerId}`] = flowerData; + return; + } + if (type === "assets") { + if (remainingPath === "icon.png") { + const blob = await zipObject.async("blob"); + const file = new File([blob], "icon.png", { type: "image/png" }); + + allFiles.assets.icon = file; + return; + } + + const tinyFlowersMatch = remainingPath.match(TINY_FLOWERS_JSON_REGEX); + if (tinyFlowersMatch) { + const [, flowerId] = tinyFlowersMatch; + const jsonString = await zipObject.async("text"); + const flowerData = JSON.parse(jsonString) as TinyFlowerResourcesJson; + + allFiles.assets.tinyFlowers[`${namespace}:${flowerId}`] = flowerData; + return; + } + + const langMatch = remainingPath.match(LANG_JSON_REGEX); + if (langMatch) { + const [, languageId] = langMatch; + const jsonString = await zipObject.async("text"); + const languageJson = JSON.parse(jsonString) as LanguageJson; + + allFiles.assets.lang[languageId] = languageJson; + return; + } + + const modelsMatch = remainingPath.match(MODELS_JSON_REGEX); + if (modelsMatch) { + const [, modelType, modelId] = modelsMatch; + const jsonString = await zipObject.async("text"); + + if (modelType === "item") { + const modelJson = JSON.parse(jsonString) as ItemModelGeneratedJson; + allFiles.assets.models.item[`${namespace}:${modelType}/${modelId}`] = + modelJson; + } else if (modelType === "block/tiny_flowers") { + const modelJson = JSON.parse(jsonString) as BlockModelGeneratedJson; + allFiles.assets.models.block[`${namespace}:${modelType}/${modelId}`] = + modelJson; + } + return; + } + + const texturesMatch = remainingPath.match(TEXTURES_JSON_REGEX); + if (texturesMatch) { + const [, textureType, textureId] = texturesMatch; + const blob = await zipObject.async("blob"); + const file = new File([blob], `${textureId}.png`, { + type: "image/png", + }); + + if (textureType === "item" || textureType === "block") { + allFiles.assets.textures[textureType][ + `${namespace}:${textureType}/${textureId}` + ] = file; + } + return; + } + } + } + + inputZip.forEach((relativePath, zipObject) => { + if (zipObject.dir) { + // We don't need to process directories at all, so just skip. + return; + } + + allPromises.push(processFile(zipObject)); + }); + await Promise.all(allPromises); + + return allFiles; +} diff --git a/misc/mod-generator/src/lib/types/files.ts b/misc/mod-generator/src/lib/types/files.ts new file mode 100644 index 00000000..f8927549 --- /dev/null +++ b/misc/mod-generator/src/lib/types/files.ts @@ -0,0 +1,100 @@ +export interface AllFiles { + fabricModJson: FabricModJson; + data: { + tinyFlowers: Record; + }; + assets: { + icon: File | undefined; + tinyFlowers: Record; + lang: Record; + textures: { + block: Record; + item: Record; + }; + models: { + block: Record; + item: Record; + }; + items: Record<"tiny_flower", ItemsModelDefinitionJson | undefined>; + }; +} + +export interface FabricModJson { + schemaVersion: 1; + id: string; + version: string; + name: string; + description: string; + authors: string[]; + license: string; + icon: string; + environment: string; + entrypoints: { + main: string[]; + client: string[]; + }; + depends: { + tiny_flowers: string; + }; + custom: { + modmenu: { + parent: "tiny_flowers"; + }; + }; +} + +export interface TinyFlowerDataJson { + id: string; + original_id: string; + is_segmented?: boolean; + can_survive_on?: string[]; + suspicious_stew_effects?: { + id: string; + duration: number; + }[]; + behaviors?: unknown[]; +} + +export interface TinyFlowerResourcesJson { + id: string; + item_model: string; + tint_source?: "grass" | "dry_foliage"; + model1: string; + model2: string; + model3: string; + model4: string; +} + +export interface LanguageJson { + [key: string]: string; +} + +export interface ItemsModelDefinitionJson { + model: { + type: "minecraft:select"; + cases: { + model: { + type: "minecraft:model"; + model: string; + }; + when: string; + }[]; + property: "tiny_flowers:tiny_flower"; + fallback: { + type: "minecraft:model"; + model: "tiny_flowers:item/tiny_garden"; + }; + }; +} + +export interface ItemModelGeneratedJson { + parent: "minecraft:item/generated"; + textures: { + layer0: string; + }; +} + +export interface BlockModelGeneratedJson { + parent: string; + textures: Record; +} diff --git a/misc/mod-generator/src/lib/types/state.ts b/misc/mod-generator/src/lib/types/state.ts new file mode 100644 index 00000000..5cede937 --- /dev/null +++ b/misc/mod-generator/src/lib/types/state.ts @@ -0,0 +1,68 @@ +export interface FormState { + stateVersion: 1; + metadata: ModMetadata; + flowers: CombinedFlowerData[]; +} + +export interface ModMetadata { + id: string; + version: string; + name: string; + description: string; + authors: string[]; + license: string; + icon: File | undefined; +} + +export interface TextureReference { + type: "reference"; + reference: string; +} + +export interface TextureFile { + type: "file"; + file: File | undefined; +} + +export interface TextureCreate { + type: "create"; + template: "tiny_flowers" | "pink_petals"; + file: File | undefined; +} + +export type TextureType = TextureReference | TextureFile | TextureCreate; + +export interface BlockTextureEntry { + slot: string; + texture: TextureType; +} + +export interface ParentModelPrefix { + type: "prefix"; + prefix: string; +} + +export interface ParentModelCustom { + type: "custom"; + model1: string; + model2: string; + model3: string; + model4: string; +} + +export type ParentModelType = ParentModelPrefix | ParentModelCustom; + +export interface CombinedFlowerData { + id: string; + name: { language: string; name: string }[]; + originalId: string; + isSegmented: boolean; + canSurviveOn: string[]; + suspiciousStewEffects: { id: string; duration: number }[]; + behaviors: unknown[]; + itemTexture: File | undefined; + tintSource: "grass" | "dry_foliage"; + parentModel: ParentModelType; + blockTextures: BlockTextureEntry[]; + isExpanded: boolean; +} diff --git a/misc/mod-generator/src/lib/util.ts b/misc/mod-generator/src/lib/util.ts new file mode 100644 index 00000000..9daa7792 --- /dev/null +++ b/misc/mod-generator/src/lib/util.ts @@ -0,0 +1,167 @@ +export function identifierNamespace(identifier: string): string { + return identifier.replace(/:.*$/, ""); +} +export function identifierPath(identifier: string): string { + return identifier.replace(/^.*:/, ""); +} +export function identifierPathFinal(identifier: string): string { + return identifier.replace(/^.*[:\/]/, ""); +} + +export function blockTexturePathForSlot(blockId: string, slot: string): string { + const slotSuffix = slot.startsWith("flowerbed") + ? slot.replace(/^flowerbed/, "") + : `_${slot}`; + + return `${identifierNamespace(blockId)}:block/${identifierPathFinal( + blockId + )}${slotSuffix}`; +} + +export function delay(ms: number, signal: AbortSignal): Promise { + return new Promise((res, rej) => { + const handle = window.setTimeout(res, ms); + + signal.addEventListener("abort", () => { + window.clearTimeout(handle); + rej(); + }); + }); +} + +interface HSL { + h: number; + s: number; + l: number; +} + +interface RGB { + r: number; + g: number; + b: number; +} + +export function toHsl(r: number, g: number, b: number): HSL { + // Hue calculation adapted from: + // https://gist.github.com/arenagroove/ffec49d5322245c71d6fc7867066c5eb + + const rf = r / 255; + const gf = g / 255; + const bf = b / 255; + + let h = 0; + const max = Math.max(rf, gf, bf); + const min = Math.min(rf, gf, bf); + const delta = max - min; + if (delta !== 0) { + if (max === rf) h = ((gf - bf) / delta) % 6; + else if (max === gf) h = (bf - rf) / delta + 2; + else if (max === bf) h = (rf - gf) / delta + 4; + + h *= 60; + if (h < 0) h += 360; + } + + h = parseFloat(h.toFixed(2)); + + let l = (max + min) / 2; + let s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); + + return { h, s, l }; +} + +export function packRgb(r: number, g: number, b: number): number { + return (r << 16) + (g << 8) + b; +} + +export function unpackRgb(packed: number): RGB { + return { + r: (packed & 0xff0000) >> 16, + g: (packed & 0xff00) >> 8, + b: packed & 0xff, + }; +} + +function hslDistance(hsl1: HSL, hsl2: HSL): number { + let hDist = Math.abs(hsl1.h - hsl2.h); + if (hDist > 180) hDist = 360 - hDist; + + return Math.sqrt( + (hDist * 0.5) ** 2 + + (hsl1.s - hsl2.s) ** 2 * 100 + + (hsl1.l - hsl2.l) ** 2 * 100 + ); +} + +export function clusterColors( + colors: number[], + threshold: number = 30 +): number[] { + const clusteredAverages: number[] = []; + const convertedMap = new Map(); + + for (const packed of colors) { + const rgb = unpackRgb(packed); + convertedMap.set(packed, { rgb, hsl: toHsl(rgb.r, rgb.g, rgb.b) }); + } + + const used = new Set(); + + for (const color of colors) { + if (used.has(color)) continue; + + const { rgb: rgb1, hsl: hsl1 } = convertedMap.get(color)!; + + let sumR = rgb1.r, + sumG = rgb1.g, + sumB = rgb1.b; + let count = 1; + + for (const otherColor of colors) { + if (used.has(otherColor) || otherColor === color) continue; + + const { rgb: rgb2, hsl: hsl2 } = convertedMap.get(otherColor)!; + + if (hslDistance(hsl1, hsl2) < threshold) { + sumR += rgb2.r; + sumG += rgb2.g; + sumB += rgb2.b; + count++; + used.add(otherColor); + } + } + + const avgColor = packRgb( + Math.round(sumR / count), + Math.round(sumG / count), + Math.round(sumB / count) + ); + clusteredAverages.push(avgColor); + used.add(color); + } + + const finalColors: number[] = []; + for (const ave of clusteredAverages) { + let closest = Infinity; + let closestDistance = Infinity; + + const averageRgb = unpackRgb(ave); + const averageHsl = toHsl(averageRgb.r, averageRgb.g, averageRgb.b); + + for (const color of colors) { + const { rgb: rgb1, hsl } = convertedMap.get(color)!; + const distance = hslDistance(averageHsl, hsl); + + if (distance < closestDistance) { + closest = color; + closestDistance = distance; + } + } + + if (closestDistance < Infinity) { + finalColors.push(closest); + } + } + + return finalColors; +} diff --git a/misc/mod-generator/src/main.ts b/misc/mod-generator/src/main.ts new file mode 100644 index 00000000..d47b9308 --- /dev/null +++ b/misc/mod-generator/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from "svelte"; +import "./app.css"; +import App from "./App.svelte"; + +const app = mount(App, { + target: document.getElementById("app")!, +}); + +export default app; diff --git a/misc/mod-generator/svelte.config.js b/misc/mod-generator/svelte.config.js new file mode 100644 index 00000000..96b34554 --- /dev/null +++ b/misc/mod-generator/svelte.config.js @@ -0,0 +1,8 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/misc/mod-generator/tsconfig.app.json b/misc/mod-generator/tsconfig.app.json new file mode 100644 index 00000000..2656ddb9 --- /dev/null +++ b/misc/mod-generator/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "types": ["svelte", "vite/client"], + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "moduleDetection": "force" + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/misc/mod-generator/tsconfig.json b/misc/mod-generator/tsconfig.json new file mode 100644 index 00000000..3075ccee --- /dev/null +++ b/misc/mod-generator/tsconfig.json @@ -0,0 +1,10 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ], + "compilerOptions": { + "noEmit": true + } +} diff --git a/misc/mod-generator/tsconfig.node.json b/misc/mod-generator/tsconfig.node.json new file mode 100644 index 00000000..0233d7fd --- /dev/null +++ b/misc/mod-generator/tsconfig.node.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": false, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "noUncheckedIndexedAccess": true + }, + "include": ["vite.config.ts"] +} diff --git a/misc/mod-generator/vite.config.d.ts b/misc/mod-generator/vite.config.d.ts new file mode 100644 index 00000000..340562af --- /dev/null +++ b/misc/mod-generator/vite.config.d.ts @@ -0,0 +1,2 @@ +declare const _default: import("vite").UserConfig; +export default _default; diff --git a/misc/mod-generator/vite.config.js b/misc/mod-generator/vite.config.js new file mode 100644 index 00000000..19c35e0c --- /dev/null +++ b/misc/mod-generator/vite.config.js @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], +}); diff --git a/misc/mod-generator/vite.config.ts b/misc/mod-generator/vite.config.ts new file mode 100644 index 00000000..d32eba1d --- /dev/null +++ b/misc/mod-generator/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], +}) diff --git a/misc/tiny_dirt_flower/README.md b/misc/tiny_dirt_flower/README.md new file mode 100644 index 00000000..affafae3 --- /dev/null +++ b/misc/tiny_dirt_flower/README.md @@ -0,0 +1,9 @@ +# Tiny Dirt Flowers + +This is a JSON-only mod that adds a single tiny flower type entirely with JSON. This is about the minimum number of files required to make a single flower, which turns out to be quire a few. + +## How to use + +1. Zip up everything in this folder. +2. Change the `.zip` file extension to `.jar`. +3. Copy into the mods folder. diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/icon.png b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/icon.png new file mode 100644 index 00000000..7aeab488 Binary files /dev/null and b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/icon.png differ diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/items/tiny_flower.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/items/tiny_flower.json new file mode 100644 index 00000000..79e97d30 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/items/tiny_flower.json @@ -0,0 +1,19 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "tiny_dirt_flower:item/tiny_dirt" + }, + "when": "tiny_dirt_flower:tiny_dirt" + } + ], + "property": "tiny_flowers:tiny_flower", + "fallback": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_garden" + } + } +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/lang/en_us.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/lang/en_us.json new file mode 100644 index 00000000..faeda72a --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/lang/en_us.json @@ -0,0 +1,3 @@ +{ + "block.tiny_dirt_flower.tiny_dirt": "Tiny Dirt Flower" +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_1.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_1.json new file mode 100644 index 00000000..cb3d2631 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_dirt_flower:block/tiny_dirt" + } +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_2.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_2.json new file mode 100644 index 00000000..ddeba888 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_dirt_flower:block/tiny_dirt" + } +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_3.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_3.json new file mode 100644 index 00000000..07efc056 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_dirt_flower:block/tiny_dirt" + } +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_4.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_4.json new file mode 100644 index 00000000..70ee80f3 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/block/tiny_flowers/tiny_dirt_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_dirt_flower:block/tiny_dirt" + } +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/item/tiny_dirt.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/item/tiny_dirt.json new file mode 100644 index 00000000..ce0a98b2 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/models/item/tiny_dirt.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_dirt_flower:item/tiny_dirt" + } +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/block/tiny_dirt.png b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/block/tiny_dirt.png new file mode 100644 index 00000000..eeaeb88f Binary files /dev/null and b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/block/tiny_dirt.png differ diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/item/tiny_dirt.png b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/item/tiny_dirt.png new file mode 100644 index 00000000..6e15f9c6 Binary files /dev/null and b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/textures/item/tiny_dirt.png differ diff --git a/misc/tiny_dirt_flower/assets/tiny_dirt_flower/tiny_flowers/tiny_flower/tiny_dirt.json b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/tiny_flowers/tiny_flower/tiny_dirt.json new file mode 100644 index 00000000..5cc736d2 --- /dev/null +++ b/misc/tiny_dirt_flower/assets/tiny_dirt_flower/tiny_flowers/tiny_flower/tiny_dirt.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_dirt_flower:tiny_dirt", + "item_model": "tiny_dirt_flower:item/tiny_dirt", + "model1": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_1", + "model2": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_2", + "model3": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_3", + "model4": "tiny_dirt_flower:block/tiny_flowers/tiny_dirt_4" +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/data/tiny_dirt_flower/tiny_flowers/tiny_flower/tiny_dirt.json b/misc/tiny_dirt_flower/data/tiny_dirt_flower/tiny_flowers/tiny_flower/tiny_dirt.json new file mode 100644 index 00000000..0dd3648c --- /dev/null +++ b/misc/tiny_dirt_flower/data/tiny_dirt_flower/tiny_flowers/tiny_flower/tiny_dirt.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_dirt_flower:tiny_dirt", + "original_id": "minecraft:dirt", + "suspicious_stew_effects": [ + { + "id": "minecraft:darkness", + "duration": 10 + } + ] +} \ No newline at end of file diff --git a/misc/tiny_dirt_flower/fabric.mod.json b/misc/tiny_dirt_flower/fabric.mod.json new file mode 100644 index 00000000..c8c6e4ce --- /dev/null +++ b/misc/tiny_dirt_flower/fabric.mod.json @@ -0,0 +1,25 @@ +{ + "schemaVersion": 1, + "id": "tiny_dirt_flower", + "version": "1.0.0", + "name": "Tiny Dirt Flower", + "description": "An example flower pack that adds a Tiny Flower based on the humble Dirt block.", + "authors": [ + "secret_online" + ], + "license": "MPL-2.0", + "icon": "assets/tiny_dirt_flower/icon.png", + "environment": "*", + "entrypoints": { + "client": [], + "main": [] + }, + "depends": { + "tiny_flowers": ">=2.0.0" + }, + "custom": { + "modmenu": { + "parent": "tiny_flowers" + } + } +} \ No newline at end of file diff --git a/neoforge/.eclipse/configurations/NeoForge Client ( b/neoforge/.eclipse/configurations/NeoForge Client ( new file mode 100644 index 00000000..e69de29b diff --git a/neoforge/.eclipse/configurations/NeoForge Data ( b/neoforge/.eclipse/configurations/NeoForge Data ( new file mode 100644 index 00000000..e69de29b diff --git a/neoforge/.eclipse/configurations/NeoForge Server ( b/neoforge/.eclipse/configurations/NeoForge Server ( new file mode 100644 index 00000000..e69de29b diff --git a/neoforge/build.gradle b/neoforge/build.gradle new file mode 100644 index 00000000..f67735d4 --- /dev/null +++ b/neoforge/build.gradle @@ -0,0 +1,58 @@ +plugins { + id 'multiloader-loader' + id 'net.neoforged.moddev' +} + +neoForge { + version = neoforge_version + // Automatically enable neoforge AccessTransformers if the file exists + def at = project(':common').file('src/main/resources/META-INF/accesstransformer.cfg') + if (at.exists()) { + accessTransformers.from(at.absolutePath) + } + runs { + configureEach { + systemProperty('neoforge.enabledGameTestNamespaces', mod_id) + ideName = "NeoForge ${it.name.capitalize()} (${project.path})" // Unify the run config names with fabric + } + client { + client() + } + data { + clientData() + + // DataGen can be run by - "./gradlew :neoforge:runData" in Terminal. + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } + server { + server() + } + } + mods { + "${mod_id}" { + sourceSet sourceSets.main + } + } +} + +sourceSets.main.resources { srcDir 'src/generated/resources' } + +// Implement mcgradleconventions loader attribute +def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements'].each { variant -> + configurations.named("$variant") { + attributes { + attribute(loaderAttribute, 'neoforge') + } + } +} +sourceSets.configureEach { + [it.compileClasspathConfigurationName, it.runtimeClasspathConfigurationName, it.getTaskName(null, 'jarJar')].each { variant-> + configurations.named("$variant") { + attributes { + attribute(loaderAttribute, 'neoforge') + } + } + } +} diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_1.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_1.json new file mode 100644 index 00000000..e3e8e898 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_1", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_2.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_2.json new file mode 100644 index 00000000..c8a59afe --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_2", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_3.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_3.json new file mode 100644 index 00000000..4d629909 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_3", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_4.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_4.json new file mode 100644 index 00000000..47bbe2f3 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/leaf_litter_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_leaf_litter_4", + "textures": { + "flowerbed": "minecraft:block/leaf_litter" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_1.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_1.json new file mode 100644 index 00000000..5cf80b2d --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_1", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_2.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_2.json new file mode 100644 index 00000000..b18bf9a1 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_2", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_3.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_3.json new file mode 100644 index 00000000..4df3c7fc --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_3", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_4.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_4.json new file mode 100644 index 00000000..4e6bc7af --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/pink_petals_4.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_4", + "textures": { + "flowerbed": "minecraft:block/pink_petals", + "particle": "minecraft:block/pink_petals", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_1.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_1.json new file mode 100644 index 00000000..21fab7d9 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_1", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_2.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_2.json new file mode 100644 index 00000000..f93475d8 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_2", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_3.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_3.json new file mode 100644 index 00000000..dbd39196 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_3", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_4.json b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_4.json new file mode 100644 index 00000000..310adb5d --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/models/block/tiny_flowers/wildflowers_4.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/flowerbed_4", + "textures": { + "flowerbed": "minecraft:block/wildflowers", + "particle": "minecraft:block/wildflowers", + "stem": "minecraft:block/pink_petals_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/leaf_litter.json b/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/leaf_litter.json new file mode 100644 index 00000000..39a2e5a6 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/leaf_litter.json @@ -0,0 +1,9 @@ +{ + "id": "minecraft:leaf_litter", + "item_model": "minecraft:item/leaf_litter", + "model1": "minecraft:block/tiny_flowers/leaf_litter_1", + "model2": "minecraft:block/tiny_flowers/leaf_litter_2", + "model3": "minecraft:block/tiny_flowers/leaf_litter_3", + "model4": "minecraft:block/tiny_flowers/leaf_litter_4", + "tint_source": "dry_foliage" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/pink_petals.json b/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/pink_petals.json new file mode 100644 index 00000000..c74cede3 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/pink_petals.json @@ -0,0 +1,8 @@ +{ + "id": "minecraft:pink_petals", + "item_model": "minecraft:item/pink_petals", + "model1": "minecraft:block/tiny_flowers/pink_petals_1", + "model2": "minecraft:block/tiny_flowers/pink_petals_2", + "model3": "minecraft:block/tiny_flowers/pink_petals_3", + "model4": "minecraft:block/tiny_flowers/pink_petals_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/wildflowers.json b/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/wildflowers.json new file mode 100644 index 00000000..65d2acb9 --- /dev/null +++ b/neoforge/src/generated/resources/assets/minecraft/tiny_flowers/tiny_flower/wildflowers.json @@ -0,0 +1,8 @@ +{ + "id": "minecraft:wildflowers", + "item_model": "minecraft:item/wildflowers", + "model1": "minecraft:block/tiny_flowers/wildflowers_1", + "model2": "minecraft:block/tiny_flowers/wildflowers_2", + "model3": "minecraft:block/tiny_flowers/wildflowers_3", + "model4": "minecraft:block/tiny_flowers/wildflowers_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/blockstates/tiny_garden.json b/neoforge/src/generated/resources/assets/tiny_flowers/blockstates/tiny_garden.json new file mode 100644 index 00000000..72d16ff2 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/blockstates/tiny_garden.json @@ -0,0 +1,36 @@ +{ + "multipart": [ + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "north" + } + }, + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "east" + } + }, + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "south" + } + }, + { + "apply": { + "model": "tiny_flowers:block/tiny_garden" + }, + "when": { + "facing": "west" + } + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/items/florists_shears.json b/neoforge/src/generated/resources/assets/tiny_flowers/items/florists_shears.json new file mode 100644 index 00000000..cfb0ffed --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/items/florists_shears.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/florists_shears", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:dye", + "default": -5231066 + } + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/items/tiny_flower.json b/neoforge/src/generated/resources/assets/tiny_flowers/items/tiny_flower.json new file mode 100644 index 00000000..1e6296bd --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/items/tiny_flower.json @@ -0,0 +1,131 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_dandelion" + }, + "when": "tiny_flowers:tiny_dandelion" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_poppy" + }, + "when": "tiny_flowers:tiny_poppy" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_blue_orchid" + }, + "when": "tiny_flowers:tiny_blue_orchid" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_allium" + }, + "when": "tiny_flowers:tiny_allium" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_azure_bluet" + }, + "when": "tiny_flowers:tiny_azure_bluet" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_red_tulip" + }, + "when": "tiny_flowers:tiny_red_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_orange_tulip" + }, + "when": "tiny_flowers:tiny_orange_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_white_tulip" + }, + "when": "tiny_flowers:tiny_white_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_pink_tulip" + }, + "when": "tiny_flowers:tiny_pink_tulip" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_oxeye_daisy" + }, + "when": "tiny_flowers:tiny_oxeye_daisy" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_cornflower" + }, + "when": "tiny_flowers:tiny_cornflower" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_lily_of_the_valley" + }, + "when": "tiny_flowers:tiny_lily_of_the_valley" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_torchflower" + }, + "when": "tiny_flowers:tiny_torchflower" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_closed_eyeblossom" + }, + "when": "tiny_flowers:tiny_closed_eyeblossom" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_open_eyeblossom" + }, + "when": "tiny_flowers:tiny_open_eyeblossom" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_wither_rose" + }, + "when": "tiny_flowers:tiny_wither_rose" + }, + { + "model": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_cactus_flower" + }, + "when": "tiny_flowers:tiny_cactus_flower" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "tiny_flowers:item/tiny_garden" + }, + "property": "tiny_flowers:tiny_flower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_1.json new file mode 100644 index 00000000..0a262662 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_2.json new file mode 100644 index 00000000..be537a6b --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_3.json new file mode 100644 index 00000000..7188ec9d --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_4.json new file mode 100644 index 00000000..52a6d273 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_allium_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_allium" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_1.json new file mode 100644 index 00000000..1f9a1309 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_2.json new file mode 100644 index 00000000..5e77621b --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_3.json new file mode 100644 index 00000000..1e4331bb --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_4.json new file mode 100644 index 00000000..7a607fe6 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_azure_bluet_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_1.json new file mode 100644 index 00000000..ca740ce1 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_2.json new file mode 100644 index 00000000..734e8055 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_3.json new file mode 100644 index 00000000..c319b966 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_4.json new file mode 100644 index 00000000..a5d7a3f9 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_blue_orchid_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_blue_orchid", + "flowerbed_upper": "tiny_flowers:block/tiny_blue_orchid_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_1.json new file mode 100644 index 00000000..0c077aec --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_2.json new file mode 100644 index 00000000..54a28449 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_3.json new file mode 100644 index 00000000..e39e70c0 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_4.json new file mode 100644 index 00000000..4489f25c --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cactus_flower_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_low_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cactus_flower", + "stem": "tiny_flowers:block/tiny_cactus_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_1.json new file mode 100644 index 00000000..90c23b87 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_2.json new file mode 100644 index 00000000..9540b9ac --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_3.json new file mode 100644 index 00000000..c74247d2 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_4.json new file mode 100644 index 00000000..c46b2f07 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_closed_eyeblossom_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_closed_eyeblossom", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_1.json new file mode 100644 index 00000000..6c6790c5 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_2.json new file mode 100644 index 00000000..3e76c5fb --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_3.json new file mode 100644 index 00000000..720258f7 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_4.json new file mode 100644 index 00000000..2fceb925 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_cornflower_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_cornflower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_1.json new file mode 100644 index 00000000..da40ce8f --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_2.json new file mode 100644 index 00000000..6cb89951 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_3.json new file mode 100644 index 00000000..7bb7ffaa --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_4.json new file mode 100644 index 00000000..7967ac12 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_dandelion_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_dandelion" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_1.json new file mode 100644 index 00000000..b901dc9b --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_2.json new file mode 100644 index 00000000..1845d3a6 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_3.json new file mode 100644 index 00000000..d46e8718 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_4.json new file mode 100644 index 00000000..1be7c6fd --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_lily_of_the_valley_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_double_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_lily_of_the_valley", + "flowerbed_upper": "tiny_flowers:block/tiny_lily_of_the_valley_upper" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_1.json new file mode 100644 index 00000000..8298cfad --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_1.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_2.json new file mode 100644 index 00000000..78a71b76 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_2.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_3.json new file mode 100644 index 00000000..6e035066 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_3.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_4.json new file mode 100644 index 00000000..49a8e259 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_open_eyeblossom_4.json @@ -0,0 +1,8 @@ +{ + "parent": "tiny_flowers:block/garden_double_untinted_glow_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_open_eyeblossom", + "flowerbed_upper": "tiny_flowers:block/tiny_open_eyeblossom_upper", + "stem": "tiny_flowers:block/tiny_eyeblossom_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_1.json new file mode 100644 index 00000000..173dcfe7 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_2.json new file mode 100644 index 00000000..c2f9e24e --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_3.json new file mode 100644 index 00000000..6526965a --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_4.json new file mode 100644 index 00000000..65938913 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_orange_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_1.json new file mode 100644 index 00000000..5d187a78 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_2.json new file mode 100644 index 00000000..524a8b40 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_3.json new file mode 100644 index 00000000..80a97e30 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_4.json new file mode 100644 index 00000000..11a78daa --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_oxeye_daisy_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_1.json new file mode 100644 index 00000000..4270d103 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_2.json new file mode 100644 index 00000000..6db104e4 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_3.json new file mode 100644 index 00000000..7cd84189 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_4.json new file mode 100644 index 00000000..10623e71 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_pink_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_1.json new file mode 100644 index 00000000..135db333 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_2.json new file mode 100644 index 00000000..08b871ea --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_3.json new file mode 100644 index 00000000..f2e460fe --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_4.json new file mode 100644 index 00000000..0803b170 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_poppy_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_tall_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_poppy", + "stem": "tiny_flowers:block/tall_tiny_flower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_1.json new file mode 100644 index 00000000..378695a6 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_2.json new file mode 100644 index 00000000..d2ea1723 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_3.json new file mode 100644 index 00000000..6f17dbfa --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_4.json new file mode 100644 index 00000000..474586e8 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_red_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_1.json new file mode 100644 index 00000000..16343245 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_1.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_2.json new file mode 100644 index 00000000..289184ad --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_2.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_3.json new file mode 100644 index 00000000..492124af --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_3.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_4.json new file mode 100644 index 00000000..b11af91c --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_torchflower_4.json @@ -0,0 +1,9 @@ +{ + "parent": "tiny_flowers:block/garden_triple_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_torchflower", + "flowerbed_middle": "tiny_flowers:block/tiny_torchflower_middle", + "flowerbed_upper": "tiny_flowers:block/tiny_torchflower_upper", + "stem": "tiny_flowers:block/tiny_torchflower_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_1.json new file mode 100644 index 00000000..87babbc2 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_1.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_2.json new file mode 100644 index 00000000..b1c0f247 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_2.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_3.json new file mode 100644 index 00000000..0554540d --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_3.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_4.json new file mode 100644 index 00000000..22c47686 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_white_tulip_4.json @@ -0,0 +1,6 @@ +{ + "parent": "tiny_flowers:block/garden_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_1.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_1.json new file mode 100644 index 00000000..037f5081 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_1.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_1", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_2.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_2.json new file mode 100644 index 00000000..e27a3237 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_2.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_2", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_3.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_3.json new file mode 100644 index 00000000..ec824f11 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_3.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_3", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_4.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_4.json new file mode 100644 index 00000000..aa170ead --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/block/tiny_flowers/tiny_wither_rose_4.json @@ -0,0 +1,7 @@ +{ + "parent": "tiny_flowers:block/garden_untinted_4", + "textures": { + "flowerbed": "tiny_flowers:block/tiny_wither_rose", + "stem": "tiny_flowers:block/tiny_wither_rose_stem" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/florists_shears.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/florists_shears.json new file mode 100644 index 00000000..f5687db0 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/florists_shears.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/florists_shears", + "layer1": "tiny_flowers:item/florists_shears_handle" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_allium.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_allium.json new file mode 100644 index 00000000..7203632b --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_allium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_allium" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_azure_bluet.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_azure_bluet.json new file mode 100644 index 00000000..35490b90 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_azure_bluet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_azure_bluet" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_blue_orchid.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_blue_orchid.json new file mode 100644 index 00000000..548f45bd --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_blue_orchid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_blue_orchid" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_cactus_flower.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_cactus_flower.json new file mode 100644 index 00000000..f10e3100 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_cactus_flower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_cactus_flower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_closed_eyeblossom.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_closed_eyeblossom.json new file mode 100644 index 00000000..68db64a5 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_closed_eyeblossom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_closed_eyeblossom" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_cornflower.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_cornflower.json new file mode 100644 index 00000000..d04d5990 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_cornflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_cornflower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_dandelion.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_dandelion.json new file mode 100644 index 00000000..1220da9d --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_dandelion.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_dandelion" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_garden.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_garden.json new file mode 100644 index 00000000..e9eaec2a --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_garden.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_garden" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_lily_of_the_valley.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_lily_of_the_valley.json new file mode 100644 index 00000000..8130511f --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_lily_of_the_valley.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_lily_of_the_valley" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_open_eyeblossom.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_open_eyeblossom.json new file mode 100644 index 00000000..8f524882 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_open_eyeblossom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_open_eyeblossom" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_orange_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_orange_tulip.json new file mode 100644 index 00000000..5ac75668 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_orange_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_orange_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_oxeye_daisy.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_oxeye_daisy.json new file mode 100644 index 00000000..337ed4ef --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_oxeye_daisy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_oxeye_daisy" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_pink_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_pink_tulip.json new file mode 100644 index 00000000..26f46632 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_pink_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_pink_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_poppy.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_poppy.json new file mode 100644 index 00000000..74b0010f --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_poppy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_poppy" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_red_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_red_tulip.json new file mode 100644 index 00000000..c1ede6f4 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_red_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_red_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_torchflower.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_torchflower.json new file mode 100644 index 00000000..c4de06d6 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_torchflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_torchflower" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_white_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_white_tulip.json new file mode 100644 index 00000000..2b7db320 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_white_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_white_tulip" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_wither_rose.json b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_wither_rose.json new file mode 100644 index 00000000..a633ea95 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/models/item/tiny_wither_rose.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "tiny_flowers:item/tiny_wither_rose" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json new file mode 100644 index 00000000..6af68673 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_allium", + "item_model": "tiny_flowers:item/tiny_allium", + "model1": "tiny_flowers:block/tiny_flowers/tiny_allium_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_allium_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_allium_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_allium_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json new file mode 100644 index 00000000..669a8e9c --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_azure_bluet", + "item_model": "tiny_flowers:item/tiny_azure_bluet", + "model1": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_azure_bluet_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json new file mode 100644 index 00000000..a613ad0b --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_blue_orchid", + "item_model": "tiny_flowers:item/tiny_blue_orchid", + "model1": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_blue_orchid_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json new file mode 100644 index 00000000..e524e133 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_cactus_flower", + "item_model": "tiny_flowers:item/tiny_cactus_flower", + "model1": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_cactus_flower_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json new file mode 100644 index 00000000..55e4f082 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_closed_eyeblossom", + "item_model": "tiny_flowers:item/tiny_closed_eyeblossom", + "model1": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_closed_eyeblossom_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json new file mode 100644 index 00000000..d10858ae --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_cornflower", + "item_model": "tiny_flowers:item/tiny_cornflower", + "model1": "tiny_flowers:block/tiny_flowers/tiny_cornflower_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_cornflower_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_cornflower_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_cornflower_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json new file mode 100644 index 00000000..40b120b0 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_dandelion", + "item_model": "tiny_flowers:item/tiny_dandelion", + "model1": "tiny_flowers:block/tiny_flowers/tiny_dandelion_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_dandelion_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_dandelion_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_dandelion_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json new file mode 100644 index 00000000..9c68832f --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_lily_of_the_valley", + "item_model": "tiny_flowers:item/tiny_lily_of_the_valley", + "model1": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_lily_of_the_valley_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json new file mode 100644 index 00000000..877663ed --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_open_eyeblossom", + "item_model": "tiny_flowers:item/tiny_open_eyeblossom", + "model1": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_open_eyeblossom_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json new file mode 100644 index 00000000..f70f72d9 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_orange_tulip", + "item_model": "tiny_flowers:item/tiny_orange_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_orange_tulip_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json new file mode 100644 index 00000000..94f664fb --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_oxeye_daisy", + "item_model": "tiny_flowers:item/tiny_oxeye_daisy", + "model1": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_oxeye_daisy_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json new file mode 100644 index 00000000..de54f3c9 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_pink_tulip", + "item_model": "tiny_flowers:item/tiny_pink_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_pink_tulip_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json new file mode 100644 index 00000000..8313d5d0 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_poppy", + "item_model": "tiny_flowers:item/tiny_poppy", + "model1": "tiny_flowers:block/tiny_flowers/tiny_poppy_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_poppy_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_poppy_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_poppy_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json new file mode 100644 index 00000000..93fe8aad --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_red_tulip", + "item_model": "tiny_flowers:item/tiny_red_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_red_tulip_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json new file mode 100644 index 00000000..efe28931 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_torchflower", + "item_model": "tiny_flowers:item/tiny_torchflower", + "model1": "tiny_flowers:block/tiny_flowers/tiny_torchflower_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_torchflower_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_torchflower_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_torchflower_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json new file mode 100644 index 00000000..2a8b2c96 --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_white_tulip", + "item_model": "tiny_flowers:item/tiny_white_tulip", + "model1": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_white_tulip_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json new file mode 100644 index 00000000..8609323f --- /dev/null +++ b/neoforge/src/generated/resources/assets/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json @@ -0,0 +1,8 @@ +{ + "id": "tiny_flowers:tiny_wither_rose", + "item_model": "tiny_flowers:item/tiny_wither_rose", + "model1": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_1", + "model2": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_2", + "model3": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_3", + "model4": "tiny_flowers:block/tiny_flowers/tiny_wither_rose_4" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/c/tags/block/flowers.json b/neoforge/src/generated/resources/data/c/tags/block/flowers.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/neoforge/src/generated/resources/data/c/tags/block/flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/c/tags/item/tools/shear.json b/neoforge/src/generated/resources/data/c/tags/item/tools/shear.json new file mode 100644 index 00000000..ca1c98e4 --- /dev/null +++ b/neoforge/src/generated/resources/data/c/tags/item/tools/shear.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:florists_shears" + ] +} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_azure_bluet.json b/neoforge/src/generated/resources/data/minecraft/advancement/recipes/misc/florists_shears_dyed.json similarity index 76% rename from src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_azure_bluet.json rename to neoforge/src/generated/resources/data/minecraft/advancement/recipes/misc/florists_shears_dyed.json index 6396c52a..d468a06a 100644 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_azure_bluet.json +++ b/neoforge/src/generated/resources/data/minecraft/advancement/recipes/misc/florists_shears_dyed.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "tiny-flowers:florists_shears" + "items": "tiny_flowers:florists_shears" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "tiny-flowers:tiny_azure_bluet" + "recipe": "minecraft:florists_shears_dyed" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "tiny-flowers:tiny_azure_bluet" + "minecraft:florists_shears_dyed" ] } } \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/recipe/florists_shears_dyed.json b/neoforge/src/generated/resources/data/minecraft/recipe/florists_shears_dyed.json new file mode 100644 index 00000000..59601c8a --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/recipe/florists_shears_dyed.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_dye", + "category": "misc", + "dye": "#minecraft:dyes", + "group": "florists_shears_dyed", + "result": { + "id": "tiny_flowers:florists_shears" + }, + "target": "tiny_flowers:florists_shears" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tags/block/bee_attractive.json b/neoforge/src/generated/resources/data/minecraft/tags/block/bee_attractive.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tags/block/bee_attractive.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tags/block/flowers.json b/neoforge/src/generated/resources/data/minecraft/tags/block/flowers.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tags/block/flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tags/block/inside_step_sound_blocks.json b/neoforge/src/generated/resources/data/minecraft/tags/block/inside_step_sound_blocks.json new file mode 100644 index 00000000..4ad68040 --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tags/block/inside_step_sound_blocks.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_garden" + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tags/item/bee_food.json b/neoforge/src/generated/resources/data/minecraft/tags/item/bee_food.json new file mode 100644 index 00000000..79df3f3f --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tags/item/bee_food.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_flower" + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tags/item/flowers.json b/neoforge/src/generated/resources/data/minecraft/tags/item/flowers.json new file mode 100644 index 00000000..79df3f3f --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tags/item/flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "tiny_flowers:tiny_flower" + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/leaf_litter.json b/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/leaf_litter.json new file mode 100644 index 00000000..80047306 --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/leaf_litter.json @@ -0,0 +1,10 @@ +{ + "behaviors": [ + { + "type": "sturdy_placement" + } + ], + "id": "minecraft:leaf_litter", + "is_segmented": true, + "original_id": "minecraft:leaf_litter" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/pink_petals.json b/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/pink_petals.json new file mode 100644 index 00000000..cac36e68 --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/pink_petals.json @@ -0,0 +1,5 @@ +{ + "id": "minecraft:pink_petals", + "is_segmented": true, + "original_id": "minecraft:pink_petals" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/wildflowers.json b/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/wildflowers.json new file mode 100644 index 00000000..57c76788 --- /dev/null +++ b/neoforge/src/generated/resources/data/minecraft/tiny_flowers/tiny_flower/wildflowers.json @@ -0,0 +1,5 @@ +{ + "id": "minecraft:wildflowers", + "is_segmented": true, + "original_id": "minecraft:wildflowers" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_black.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_black.json new file mode 100644 index 00000000..fdddac57 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_black.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_black" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_black" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_blue.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_blue.json new file mode 100644 index 00000000..fe84302b --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_blue.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_blue" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_brown.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_brown.json new file mode 100644 index 00000000..5eebf202 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_brown.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_brown" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_brown" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_cyan.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_cyan.json new file mode 100644 index 00000000..1a6fd9ab --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_cyan.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_cyan" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_cyan" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_gray.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_gray.json new file mode 100644 index 00000000..03dd04f0 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_gray.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_gray" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_green.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_green.json new file mode 100644 index 00000000..b6fb26cc --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_green.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_green" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_green" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_blue.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_blue.json new file mode 100644 index 00000000..da38bf4a --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_blue.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_light_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_light_blue" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_gray.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_gray.json new file mode 100644 index 00000000..930a05c8 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_light_gray.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_light_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_light_gray" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_lime.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_lime.json new file mode 100644 index 00000000..8f91972b --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_lime.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_lime" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_lime" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_magenta.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_magenta.json new file mode 100644 index 00000000..2edcab53 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_magenta.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_magenta" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_orange.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_orange.json new file mode 100644 index 00000000..33e6e955 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_orange.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_orange" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_orange" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_pink.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_pink.json new file mode 100644 index 00000000..ff34ec6d --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_pink.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_pink" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_pink" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_purple.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_purple.json new file mode 100644 index 00000000..fc3d7c21 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_purple.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_purple" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_purple" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_red.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_red.json new file mode 100644 index 00000000..b392b1c5 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_red.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_red" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_white.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_white.json new file mode 100644 index 00000000..f24a1020 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_white.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_white" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_white" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_yellow.json b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_yellow.json new file mode 100644 index 00000000..c80f402e --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/advancement/recipes/tools/florists_shears_yellow.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_shears": { + "conditions": { + "items": [ + { + "items": "minecraft:shears" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "tiny_flowers:florists_shears_yellow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_shears" + ] + ], + "rewards": { + "recipes": [ + "tiny_flowers:florists_shears_yellow" + ] + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_black.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_black.json new file mode 100644 index 00000000..b83c6c5c --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_black.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/black" + ], + "result": { + "components": { + "minecraft:dyed_color": -14869215 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_blue.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_blue.json new file mode 100644 index 00000000..e16974ee --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_blue.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/blue" + ], + "result": { + "components": { + "minecraft:dyed_color": -12827478 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_brown.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_brown.json new file mode 100644 index 00000000..ebfadd3e --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_brown.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/brown" + ], + "result": { + "components": { + "minecraft:dyed_color": -8170446 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_cyan.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_cyan.json new file mode 100644 index 00000000..c0dc913f --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_cyan.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/cyan" + ], + "result": { + "components": { + "minecraft:dyed_color": -15295332 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_gray.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_gray.json new file mode 100644 index 00000000..a0ec0617 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_gray.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/gray" + ], + "result": { + "components": { + "minecraft:dyed_color": -12103854 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_green.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_green.json new file mode 100644 index 00000000..929982ab --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_green.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/green" + ], + "result": { + "components": { + "minecraft:dyed_color": -10585066 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_light_blue.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_light_blue.json new file mode 100644 index 00000000..5a81b8ce --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_light_blue.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/light_blue" + ], + "result": { + "components": { + "minecraft:dyed_color": -12930086 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_light_gray.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_light_gray.json new file mode 100644 index 00000000..472c8660 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_light_gray.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/light_gray" + ], + "result": { + "components": { + "minecraft:dyed_color": -6447721 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_lime.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_lime.json new file mode 100644 index 00000000..2c75f127 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_lime.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/lime" + ], + "result": { + "components": { + "minecraft:dyed_color": -8337633 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_magenta.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_magenta.json new file mode 100644 index 00000000..0c8bd3d5 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_magenta.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/magenta" + ], + "result": { + "components": { + "minecraft:dyed_color": -3715395 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_orange.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_orange.json new file mode 100644 index 00000000..5aeb3cf9 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_orange.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/orange" + ], + "result": { + "components": { + "minecraft:dyed_color": -425955 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_pink.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_pink.json new file mode 100644 index 00000000..8415f7bf --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_pink.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/pink" + ], + "result": { + "components": { + "minecraft:dyed_color": -816214 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_purple.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_purple.json new file mode 100644 index 00000000..43e55bcf --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_purple.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/purple" + ], + "result": { + "components": { + "minecraft:dyed_color": -7785800 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_red.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_red.json new file mode 100644 index 00000000..2832e60a --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_red.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/red" + ], + "result": { + "components": { + "minecraft:dyed_color": -5231066 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_white.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_white.json new file mode 100644 index 00000000..2012459f --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_white.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/white" + ], + "result": { + "components": { + "minecraft:dyed_color": -393218 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_yellow.json b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_yellow.json new file mode 100644 index 00000000..d6450e6c --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/recipe/florists_shears_yellow.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "group": "florists_shears", + "ingredients": [ + "minecraft:shears", + "#c:dyes/yellow" + ], + "result": { + "components": { + "minecraft:dyed_color": -75715 + }, + "id": "tiny_flowers:florists_shears" + } +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json new file mode 100644 index 00000000..85eafce5 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_allium.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_allium", + "original_id": "minecraft:allium", + "suspicious_stew_effects": [ + { + "duration": 60, + "id": "minecraft:fire_resistance" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json new file mode 100644 index 00000000..b059bbf7 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_azure_bluet.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_azure_bluet", + "original_id": "minecraft:azure_bluet", + "suspicious_stew_effects": [ + { + "duration": 220, + "id": "minecraft:blindness" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json new file mode 100644 index 00000000..071f8758 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_blue_orchid.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_blue_orchid", + "original_id": "minecraft:blue_orchid", + "suspicious_stew_effects": [ + { + "duration": 7, + "id": "minecraft:saturation" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json new file mode 100644 index 00000000..e656f8ee --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cactus_flower.json @@ -0,0 +1,15 @@ +{ + "behaviors": [ + { + "type": "sturdy_placement" + } + ], + "can_survive_on": [ + "#minecraft:supports_vegetation", + "#minecraft:sand", + "minecraft:sandstone", + "minecraft:red_sandstone" + ], + "id": "tiny_flowers:tiny_cactus_flower", + "original_id": "minecraft:cactus_flower" +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json new file mode 100644 index 00000000..748079ff --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_closed_eyeblossom.json @@ -0,0 +1,20 @@ +{ + "behaviors": [ + { + "type": "transform_day_night", + "particle_color": 16545810, + "sound_event_long": "minecraft:block.eyeblossom.open_long", + "sound_event_short": "minecraft:block.eyeblossom.open", + "turns_into": "tiny_flowers:tiny_open_eyeblossom", + "when": "night" + } + ], + "id": "tiny_flowers:tiny_closed_eyeblossom", + "original_id": "minecraft:closed_eyeblossom", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:nausea" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json new file mode 100644 index 00000000..2f38171d --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_cornflower.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_cornflower", + "original_id": "minecraft:cornflower", + "suspicious_stew_effects": [ + { + "duration": 100, + "id": "minecraft:jump_boost" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json new file mode 100644 index 00000000..ef8560ef --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_dandelion.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_dandelion", + "original_id": "minecraft:dandelion", + "suspicious_stew_effects": [ + { + "duration": 7, + "id": "minecraft:saturation" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json new file mode 100644 index 00000000..3c822b6f --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_lily_of_the_valley.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_lily_of_the_valley", + "original_id": "minecraft:lily_of_the_valley", + "suspicious_stew_effects": [ + { + "duration": 220, + "id": "minecraft:poison" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json new file mode 100644 index 00000000..1c668fa6 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_open_eyeblossom.json @@ -0,0 +1,20 @@ +{ + "behaviors": [ + { + "type": "transform_day_night", + "particle_color": 6250335, + "sound_event_long": "minecraft:block.eyeblossom.close_long", + "sound_event_short": "minecraft:block.eyeblossom.close", + "turns_into": "tiny_flowers:tiny_closed_eyeblossom", + "when": "day" + } + ], + "id": "tiny_flowers:tiny_open_eyeblossom", + "original_id": "minecraft:open_eyeblossom", + "suspicious_stew_effects": [ + { + "duration": 220, + "id": "minecraft:blindness" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json new file mode 100644 index 00000000..4ec1d048 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_orange_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_orange_tulip", + "original_id": "minecraft:orange_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json new file mode 100644 index 00000000..00ef33ed --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_oxeye_daisy.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_oxeye_daisy", + "original_id": "minecraft:oxeye_daisy", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:regeneration" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json new file mode 100644 index 00000000..e49c50b3 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_pink_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_pink_tulip", + "original_id": "minecraft:pink_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json new file mode 100644 index 00000000..cb9e651f --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_poppy.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_poppy", + "original_id": "minecraft:poppy", + "suspicious_stew_effects": [ + { + "duration": 100, + "id": "minecraft:night_vision" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json new file mode 100644 index 00000000..024e2999 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_red_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_red_tulip", + "original_id": "minecraft:red_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json new file mode 100644 index 00000000..155ccd12 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_torchflower.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_torchflower", + "original_id": "minecraft:torchflower", + "suspicious_stew_effects": [ + { + "duration": 100, + "id": "minecraft:night_vision" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json new file mode 100644 index 00000000..bf1fc221 --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_white_tulip.json @@ -0,0 +1,10 @@ +{ + "id": "tiny_flowers:tiny_white_tulip", + "original_id": "minecraft:white_tulip", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:weakness" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json new file mode 100644 index 00000000..36be9bbf --- /dev/null +++ b/neoforge/src/generated/resources/data/tiny_flowers/tiny_flowers/tiny_flower/tiny_wither_rose.json @@ -0,0 +1,16 @@ +{ + "can_survive_on": [ + "#minecraft:supports_vegetation", + "minecraft:netherrack", + "minecraft:soul_sand", + "minecraft:soul_soil" + ], + "id": "tiny_flowers:tiny_wither_rose", + "original_id": "minecraft:wither_rose", + "suspicious_stew_effects": [ + { + "duration": 140, + "id": "minecraft:wither" + } + ] +} \ No newline at end of file diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeCreativeTabHandler.java b/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeCreativeTabHandler.java new file mode 100644 index 00000000..d93b4b43 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeCreativeTabHandler.java @@ -0,0 +1,31 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.item.ModCreativeModeTabs; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.world.item.CreativeModeTabs; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; + +@EventBusSubscriber(modid = TinyFlowers.MOD_ID) +public class NeoForgeCreativeTabHandler { + + @SubscribeEvent + public static void addShearsItems(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES || + event.getTabKey() == ModCreativeModeTabs.TINY_FLOWERS_TAB_KEY) { + event.accept(ModItems.FLORISTS_SHEARS_ITEM.get()); + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void addTinyFlowerItems(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == ModCreativeModeTabs.TINY_FLOWERS_TAB_KEY) { + ModCreativeModeTabs.addCollectedFlowers(event.getParentEntries(), event::accept); + return; + } + + ModCreativeModeTabs.collectFlowerData(event.getParentEntries()); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeTinyFlowers.java b/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeTinyFlowers.java new file mode 100644 index 00000000..f0dae684 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeTinyFlowers.java @@ -0,0 +1,41 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.entity.ModBlockEntities; +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.item.ModCreativeModeTabs; +import co.secretonline.tinyflowers.item.ModItems; +import co.secretonline.tinyflowers.item.component.ModComponents; +import co.secretonline.tinyflowers.item.crafting.ModRecipeSerializers; +import co.secretonline.tinyflowers.platform.NeoForgeRegistryHelper; +import co.secretonline.tinyflowers.platform.Services; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.registries.DataPackRegistryEvent; + +@Mod(value = TinyFlowers.MOD_ID) +@EventBusSubscriber(modid = TinyFlowers.MOD_ID) +public class NeoForgeTinyFlowers { + public NeoForgeTinyFlowers(IEventBus modBus) { + ModBlocks.initialize(); + ModBlockEntities.initialize(); + ModComponents.initialize(); + ModItems.initialize(); + ModRecipeSerializers.initialize(); + ModCreativeModeTabs.initialize(); + + if (Services.REGISTRY instanceof NeoForgeRegistryHelper neoForgeRegistryHelper) { + neoForgeRegistryHelper.registerToBus(modBus); + } else { + throw new NullPointerException("Registry helper was not for NeoForge"); + } + } + + @SubscribeEvent + public static void registerDatapackRegistries(DataPackRegistryEvent.NewRegistry event) { + event.dataPackRegistry(ModRegistries.TINY_FLOWER, TinyFlowerData.CODEC, TinyFlowerData.CODEC); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeTinyFlowersClient.java b/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeTinyFlowersClient.java new file mode 100644 index 00000000..a710d709 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/NeoForgeTinyFlowersClient.java @@ -0,0 +1,41 @@ +package co.secretonline.tinyflowers; + +import co.secretonline.tinyflowers.block.entity.ModBlockEntities; +import co.secretonline.tinyflowers.renderer.blockentity.TinyGardenBlockEntityRenderer; +import co.secretonline.tinyflowers.renderer.item.ModSelectItemModelProperties; +import co.secretonline.tinyflowers.resources.NeoForgeTinyFlowerResourceLoader; +import net.minecraft.resources.Identifier; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.client.resources.VanillaClientListeners; + +@Mod(value = TinyFlowers.MOD_ID, dist = Dist.CLIENT) +@EventBusSubscriber(modid = TinyFlowers.MOD_ID) +public class NeoForgeTinyFlowersClient { + private static final NeoForgeTinyFlowerResourceLoader tinyFlowerResourceLoader = new NeoForgeTinyFlowerResourceLoader(); + + @SubscribeEvent + public static void registerSelectProperties(RegisterSelectItemModelPropertyEvent event) { + event.register(ModSelectItemModelProperties.TINY_FLOWER_PROPERTY_ID, ModSelectItemModelProperties.TINY_FLOWER_PROPERTY); + } + + @SubscribeEvent + public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerBlockEntityRenderer(ModBlockEntities.TINY_GARDEN_BLOCK_ENTITY.get(), TinyGardenBlockEntityRenderer::new); + } + + @SubscribeEvent + public static void registerResourceLoader(AddClientReloadListenersEvent event) { + Identifier flowerModelReload = TinyFlowers.id("flower_models"); + event.addListener(flowerModelReload, NeoForgeTinyFlowersClient.tinyFlowerResourceLoader); + event.addDependency(flowerModelReload, VanillaClientListeners.MODELS); + } + + @SubscribeEvent + public static void registerStandaloneModels(ModelEvent.RegisterStandalone event) { + NeoForgeTinyFlowersClient.tinyFlowerResourceLoader.registerModels(event); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/NeoForgeTinyFlowersDataGenerator.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/NeoForgeTinyFlowersDataGenerator.java new file mode 100644 index 00000000..0f3b200d --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/NeoForgeTinyFlowersDataGenerator.java @@ -0,0 +1,32 @@ +package co.secretonline.tinyflowers.datagen; + +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.TinyFlowersFlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.VanillaFlowerProvider; +import co.secretonline.tinyflowers.datagen.providers.*; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.data.event.GatherDataEvent; + +import java.util.List; + +@EventBusSubscriber +public class NeoForgeTinyFlowersDataGenerator { + + @SubscribeEvent + public static void gatherData(GatherDataEvent.Client event) { + event.createProvider(NeoForgeBlockTagProvider::new); + event.createProvider(NeoForgeItemTagProvider::new); + event.createProvider(NeoForgeFloristsShearsRecipeProvider::new); + event.createProvider(NeoForgeDefaultModelProvider::new); + + List mods = List.of( + new VanillaFlowerProvider(), + new TinyFlowersFlowerProvider()); + for (FlowerProvider mod : mods) { + event.createProvider((output, registryLookup) -> new NeoForgeModFlowerDataProvider(mod, output, registryLookup)); + event.createProvider((output, registryLookup) -> new NeoForgeModFlowerResourcesProvider(mod, output, registryLookup)); + event.createProvider((output) -> new NeoForgeModModelProvider(mod, output)); + } + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeBlockTagProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeBlockTagProvider.java new file mode 100644 index 00000000..5acaca69 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeBlockTagProvider.java @@ -0,0 +1,26 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.block.ModBlocks; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.BlockTags; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.BlockTagsProvider; +import org.jspecify.annotations.NonNull; + +import java.util.concurrent.CompletableFuture; + +public class NeoForgeBlockTagProvider extends BlockTagsProvider { + public NeoForgeBlockTagProvider(PackOutput output, CompletableFuture lookupProvider) { + super(output, lookupProvider, TinyFlowers.MOD_ID); + } + + @Override + protected void addTags(HolderLookup.@NonNull Provider provider) { + this.tag(BlockTags.FLOWERS).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + this.tag(BlockTags.BEE_ATTRACTIVE).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + this.tag(BlockTags.INSIDE_STEP_SOUND_BLOCKS).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + this.tag(Tags.Blocks.FLOWERS).add(ModBlocks.TINY_GARDEN_BLOCK.get()); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeDefaultModelProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeDefaultModelProvider.java new file mode 100644 index 00000000..c614e9a7 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeDefaultModelProvider.java @@ -0,0 +1,53 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.block.ModBlocks; +import co.secretonline.tinyflowers.block.TinyGardenBlock; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.client.color.item.Dye; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.client.data.models.blockstates.MultiPartGenerator; +import net.minecraft.core.Direction; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.DyeColor; +import org.jspecify.annotations.NonNull; + +public class NeoForgeDefaultModelProvider extends ModelProvider { + private final static Direction[] DIRECTIONS = new Direction[] { + Direction.NORTH, Direction.EAST, + Direction.SOUTH, Direction.WEST, }; + + public NeoForgeDefaultModelProvider(PackOutput output) { + super(output, TinyFlowers.MOD_ID); + } + + @Override + protected void registerModels(@NonNull BlockModelGenerators blockModels, @NonNull ItemModelGenerators itemModels) { + this.generateBlockStateModels(blockModels); + this.generateItemModels(itemModels); + } + + + public void generateBlockStateModels(BlockModelGenerators blockStateModelGenerator) { + MultiPartGenerator definitionCreator = MultiPartGenerator + .multiPart(ModBlocks.TINY_GARDEN_BLOCK.get()); + + for (Direction direction : DIRECTIONS) { + definitionCreator = definitionCreator.with( + BlockModelGenerators.condition() + .term(TinyGardenBlock.FACING, direction), + BlockModelGenerators.plainVariant(TinyFlowers.id("block/tiny_garden"))); + } + + blockStateModelGenerator.blockStateOutput.accept(definitionCreator); + } + + public void generateItemModels(ItemModelGenerators itemModelGenerator) { + itemModelGenerator.generateItemWithTintedOverlay( + ModItems.FLORISTS_SHEARS_ITEM.get(), + "_handle", + new Dye(DyeColor.RED.getTextureDiffuseColor())); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeFloristsShearsRecipeProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeFloristsShearsRecipeProvider.java new file mode 100644 index 00000000..68d66c2b --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeFloristsShearsRecipeProvider.java @@ -0,0 +1,48 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.neoforged.neoforge.common.Tags; +import org.jspecify.annotations.NonNull; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class NeoForgeFloristsShearsRecipeProvider extends RecipeProvider.Runner { + private static final Map> COLOR_TAGS = Map.ofEntries( + Map.entry(DyeColor.WHITE, Tags.Items.DYES_WHITE), + Map.entry(DyeColor.ORANGE, Tags.Items.DYES_ORANGE), + Map.entry(DyeColor.MAGENTA, Tags.Items.DYES_MAGENTA), + Map.entry(DyeColor.LIGHT_BLUE, Tags.Items.DYES_LIGHT_BLUE), + Map.entry(DyeColor.YELLOW, Tags.Items.DYES_YELLOW), + Map.entry(DyeColor.LIME, Tags.Items.DYES_LIME), + Map.entry(DyeColor.PINK, Tags.Items.DYES_PINK), + Map.entry(DyeColor.GRAY, Tags.Items.DYES_GRAY), + Map.entry(DyeColor.LIGHT_GRAY, Tags.Items.DYES_LIGHT_GRAY), + Map.entry(DyeColor.CYAN, Tags.Items.DYES_CYAN), + Map.entry(DyeColor.PURPLE, Tags.Items.DYES_PURPLE), + Map.entry(DyeColor.BLUE, Tags.Items.DYES_BLUE), + Map.entry(DyeColor.BROWN, Tags.Items.DYES_BROWN), + Map.entry(DyeColor.GREEN, Tags.Items.DYES_GREEN), + Map.entry(DyeColor.RED, Tags.Items.DYES_RED), + Map.entry(DyeColor.BLACK, Tags.Items.DYES_BLACK)); + + public NeoForgeFloristsShearsRecipeProvider(PackOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected @NonNull RecipeProvider createRecipeProvider(HolderLookup.@NonNull Provider registryLookup, @NonNull RecipeOutput exporter) { + return new FloristsShearsRecipeProvider(registryLookup, exporter, COLOR_TAGS); + } + + @Override + public @NonNull String getName() { + return "FloristsShearsRecipeProvider"; + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeItemTagProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeItemTagProvider.java new file mode 100644 index 00000000..50718663 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeItemTagProvider.java @@ -0,0 +1,26 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.TinyFlowers; +import co.secretonline.tinyflowers.item.ModItems; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.ItemTags; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.ItemTagsProvider; +import org.jspecify.annotations.NonNull; + +import java.util.concurrent.CompletableFuture; + +public class NeoForgeItemTagProvider extends ItemTagsProvider { + public NeoForgeItemTagProvider(PackOutput output, CompletableFuture lookupProvider) { + super(output, lookupProvider, TinyFlowers.MOD_ID); + } + + @Override + protected void addTags(HolderLookup.@NonNull Provider provider) { + this.tag(ItemTags.BEE_FOOD).add(ModItems.TINY_FLOWER_ITEM.get()); + this.tag(ItemTags.FLOWERS).add(ModItems.TINY_FLOWER_ITEM.get()); + + this.tag(Tags.Items.TOOLS_SHEAR).add(ModItems.FLORISTS_SHEARS_ITEM.get()); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModFlowerDataProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModFlowerDataProvider.java new file mode 100644 index 00000000..0c5e292a --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModFlowerDataProvider.java @@ -0,0 +1,42 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerData; +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.Flower; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.JsonCodecProvider; +import org.jspecify.annotations.NonNull; + +import java.util.concurrent.CompletableFuture; + +public class NeoForgeModFlowerDataProvider extends JsonCodecProvider { + private final FlowerProvider modData; + + public NeoForgeModFlowerDataProvider(FlowerProvider modData, PackOutput packOutput, CompletableFuture lookupProvider) { + super( + packOutput, + PackOutput.Target.DATA_PACK, + Registries.elementsDirPath(ModRegistries.TINY_FLOWER), + TinyFlowerData.CODEC, + lookupProvider, + modData.getModId()); + + this.modData = modData; + } + + @Override + public @NonNull String getName() { + return "Mod flowers data provider [" + this.modData.getModId() + "]"; + } + + + @Override + protected void gather() { + for (Flower tuple : this.modData.getFlowers()) { + this.unconditional(tuple.data().id(), tuple.data()); + } + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModFlowerResourcesProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModFlowerResourcesProvider.java new file mode 100644 index 00000000..4b0a00ee --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModFlowerResourcesProvider.java @@ -0,0 +1,42 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.data.ModRegistries; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import co.secretonline.tinyflowers.datagen.mods.Flower; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.JsonCodecProvider; +import org.jspecify.annotations.NonNull; + +import java.util.concurrent.CompletableFuture; + +public class NeoForgeModFlowerResourcesProvider extends JsonCodecProvider { + private final FlowerProvider modData; + + public NeoForgeModFlowerResourcesProvider(FlowerProvider modData, PackOutput packOutput, CompletableFuture lookupProvider) { + super( + packOutput, + PackOutput.Target.RESOURCE_PACK, + Registries.elementsDirPath(ModRegistries.TINY_FLOWER), + TinyFlowerResources.CODEC, + lookupProvider, + modData.getModId()); + + this.modData = modData; + } + + @Override + public @NonNull String getName() { + return "Mod flowers resources provider [" + this.modData.getModId() + "]"; + } + + + @Override + protected void gather() { + for (Flower tuple : this.modData.getFlowers()) { + this.unconditional(tuple.resources().id(), tuple.resources()); + } + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModModelProvider.java b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModModelProvider.java new file mode 100644 index 00000000..8b5ceea4 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/datagen/providers/NeoForgeModModelProvider.java @@ -0,0 +1,34 @@ +package co.secretonline.tinyflowers.datagen.providers; + +import co.secretonline.tinyflowers.datagen.mods.FlowerProvider; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.data.PackOutput; +import org.jspecify.annotations.NonNull; + +public class NeoForgeModModelProvider extends ModelProvider implements PartialModelProvider { + private final FlowerProvider modData; + + public NeoForgeModModelProvider(FlowerProvider modData, PackOutput output) { + super(output, modData.getModId()); + + this.modData = modData; + } + + @Override + protected void registerModels(@NonNull BlockModelGenerators blockModels, @NonNull ItemModelGenerators itemModels) { + this.modData.generateBlockStateModels(blockModels.modelOutput); + this.modData.generateItemModels(itemModels.itemModelOutput, itemModels.modelOutput); + } + + @Override + public @NonNull String getName() { + return "Mod models provider [" + this.modData.getModId() + "]"; + } + + @Override + public boolean shouldValidateAllEntries() { + return false; + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/mixin/particle/NeoForgeTerrainParticleMixin.java b/neoforge/src/main/java/co/secretonline/tinyflowers/mixin/particle/NeoForgeTerrainParticleMixin.java new file mode 100644 index 00000000..fc8e25b2 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/mixin/particle/NeoForgeTerrainParticleMixin.java @@ -0,0 +1,35 @@ +package co.secretonline.tinyflowers.mixin.particle; + +import co.secretonline.tinyflowers.helper.ParticleHelper; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.SingleQuadParticle; +import net.minecraft.client.particle.TerrainParticle; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(TerrainParticle.class) +abstract class NeoForgeTerrainParticleMixin extends SingleQuadParticle { + protected NeoForgeTerrainParticleMixin(ClientLevel level, double x, double y, double z, TextureAtlasSprite sprite) { + super(level, x, y, z, sprite); + throw new Error("Should not directly instantiate mixin"); + } + + @WrapMethod(method = "updateSprite") + private TerrainParticle wrapUpdateSprite(BlockState state, BlockPos pos, Operation original) { + if (pos != null) { + TextureAtlasSprite overrideSprite = ParticleHelper.getOverrideSprite(this.level, pos); + + if (overrideSprite != null) { + this.setSprite(overrideSprite); + return (TerrainParticle) (SingleQuadParticle) this; + } + } + + return original.call(state, pos); + } + +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeAccessHelper.java b/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeAccessHelper.java new file mode 100644 index 00000000..d23464ec --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeAccessHelper.java @@ -0,0 +1,16 @@ +package co.secretonline.tinyflowers.platform; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.function.BiFunction; + +public class NeoForgeAccessHelper implements AccessHelper { + @Override + public BlockEntityType createBlockEntityType(BiFunction entityFactory, Block... blocks) { + return new BlockEntityType<>(entityFactory::apply, blocks); + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeFlowerModelHelper.java b/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeFlowerModelHelper.java new file mode 100644 index 00000000..a471d9c8 --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeFlowerModelHelper.java @@ -0,0 +1,55 @@ +package co.secretonline.tinyflowers.platform; + +import co.secretonline.tinyflowers.TinyFlowers; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.resources.model.ModelDebugName; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.resources.Identifier; +import net.neoforged.neoforge.client.event.ModelEvent; +import net.neoforged.neoforge.client.model.standalone.SimpleUnbakedStandaloneModel; +import net.neoforged.neoforge.client.model.standalone.StandaloneModelKey; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class NeoForgeFlowerModelHelper implements FlowerModelHelper { + private final Map> knownModels = new HashMap<>(); + + @Override + public void registerModel(@NonNull Identifier id, @NonNull T context) { + if (!(context instanceof ModelEvent.RegisterStandalone event)) { + throw new IllegalArgumentException("Tried to register flower models with incorrect context"); + } + + StandaloneModelKey standaloneModelKey = new StandaloneModelKey<>(new TinyFlowersModelDebugName(id)); + event.register(standaloneModelKey, SimpleUnbakedStandaloneModel.blockStateModel(id)); + + knownModels.put(id, standaloneModelKey); + } + + @Override + public void clear() { + knownModels.clear(); + } + + @Override + public @Nullable BlockStateModel getModel(@NonNull Minecraft client, @NonNull Identifier id) { + var standaloneModelKey = knownModels.get(id); + if (standaloneModelKey == null) { + return null; + } + + ModelManager modelManager = client.getModelManager(); + return modelManager.getStandaloneModel(standaloneModelKey); + } + + private record TinyFlowersModelDebugName(Identifier id) implements ModelDebugName { + @Override + public @NonNull String debugName() { + return TinyFlowers.MOD_ID + ":ModelKey[" + id.toString() + "]"; + } + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeRegistryHelper.java b/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeRegistryHelper.java new file mode 100644 index 00000000..b8ab082f --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/platform/NeoForgeRegistryHelper.java @@ -0,0 +1,88 @@ +package co.secretonline.tinyflowers.platform; + +import co.secretonline.tinyflowers.TinyFlowers; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.Registry; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class NeoForgeRegistryHelper implements RegistryHelper { + public static final DeferredRegister BLOCK = DeferredRegister.create(BuiltInRegistries.BLOCK, TinyFlowers.MOD_ID); + public static final DeferredRegister> BLOCK_TYPE = DeferredRegister.create(BuiltInRegistries.BLOCK_TYPE, TinyFlowers.MOD_ID); + public static final DeferredRegister> BLOCK_ENTITY_TYPE = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, TinyFlowers.MOD_ID); + public static final DeferredRegister ITEM = DeferredRegister.create(BuiltInRegistries.ITEM, TinyFlowers.MOD_ID); + public static final DeferredRegister> DATA_COMPONENT_TYPE = DeferredRegister.create(BuiltInRegistries.DATA_COMPONENT_TYPE, TinyFlowers.MOD_ID); + public static final DeferredRegister> RECIPE_SERIALIZER = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, TinyFlowers.MOD_ID); + public static final DeferredRegister CREATIVE_MODE_TAB = DeferredRegister.create(BuiltInRegistries.CREATIVE_MODE_TAB, TinyFlowers.MOD_ID); + + public void registerToBus(IEventBus modBus) { + BLOCK.register(modBus); + BLOCK_TYPE.register(modBus); + BLOCK_ENTITY_TYPE.register(modBus); + ITEM.register(modBus); + DATA_COMPONENT_TYPE.register(modBus); + RECIPE_SERIALIZER.register(modBus); + CREATIVE_MODE_TAB.register(modBus); + } + + @SuppressWarnings("unchecked") + private static DeferredRegister deferredRegisterFor(Registry registry) { + if (registryEquals(registry, BuiltInRegistries.BLOCK)) { + return (DeferredRegister) BLOCK; + } + if (registryEquals(registry, BuiltInRegistries.BLOCK_TYPE)) { + return (DeferredRegister) BLOCK_TYPE; + } + if (registryEquals(registry, BuiltInRegistries.BLOCK_ENTITY_TYPE)) { + return (DeferredRegister) BLOCK_ENTITY_TYPE; + } + if (registryEquals(registry, BuiltInRegistries.ITEM)) { + return (DeferredRegister) ITEM; + } + if (registryEquals(registry, BuiltInRegistries.DATA_COMPONENT_TYPE)) { + return (DeferredRegister) DATA_COMPONENT_TYPE; + } + if (registryEquals(registry, BuiltInRegistries.RECIPE_SERIALIZER)) { + return (DeferredRegister) RECIPE_SERIALIZER; + } + if (registryEquals(registry, BuiltInRegistries.CREATIVE_MODE_TAB)) { + return (DeferredRegister) CREATIVE_MODE_TAB; + } + + throw new IllegalArgumentException("No registry linked in NeoForge to register type: " + registry.key()); + } + + private static boolean registryEquals(Registry a, Registry b) { + return a.key().registry().equals(b.key().registry()) && a.key().identifier().equals(b.key().identifier()); + } + + @Override + public DeferredRegistryObject register(Registry objRegistry, Identifier id, Supplier objSupplier) { + DeferredRegister registry = deferredRegisterFor(objRegistry); + return new NeoForgeDeferredRegistryObject<>(registry.register(id.getPath(), objSupplier)); + } + + public static class NeoForgeDeferredRegistryObject implements DeferredRegistryObject { + + private final Supplier supplier; + + public NeoForgeDeferredRegistryObject(Supplier supplier) { + this.supplier = supplier; + } + + public T get() { + return this.supplier.get(); + } + } +} diff --git a/neoforge/src/main/java/co/secretonline/tinyflowers/resources/NeoForgeTinyFlowerResourceLoader.java b/neoforge/src/main/java/co/secretonline/tinyflowers/resources/NeoForgeTinyFlowerResourceLoader.java new file mode 100644 index 00000000..96b0e7db --- /dev/null +++ b/neoforge/src/main/java/co/secretonline/tinyflowers/resources/NeoForgeTinyFlowerResourceLoader.java @@ -0,0 +1,47 @@ +package co.secretonline.tinyflowers.resources; + +import co.secretonline.tinyflowers.TinyFlowersClientState; +import co.secretonline.tinyflowers.data.TinyFlowerResources; +import co.secretonline.tinyflowers.helper.FlowerModelHelper; +import co.secretonline.tinyflowers.platform.Services; +import net.minecraft.resources.Identifier; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimplePreparableReloadListener; +import net.minecraft.util.profiling.ProfilerFiller; +import net.neoforged.neoforge.client.event.ModelEvent; +import org.jspecify.annotations.NonNull; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class NeoForgeTinyFlowerResourceLoader extends SimplePreparableReloadListener> { + private final Set knownIds = new HashSet<>(); + + @Override + protected Map prepare(@NonNull ResourceManager resourceManager, @NonNull ProfilerFiller profilerFiller) { + var resources = FlowerModelHelper.readResourceFiles(resourceManager); + + TinyFlowersClientState.RESOURCE_INSTANCES = resources; + + knownIds.clear(); + for (co.secretonline.tinyflowers.data.TinyFlowerResources flowerResources : resources.values()) { + knownIds.add(flowerResources.model1()); + knownIds.add(flowerResources.model2()); + knownIds.add(flowerResources.model3()); + knownIds.add(flowerResources.model4()); + } + + return resources; + } + + @Override + protected void apply(Map identifierTinyFlowerResourcesMap, @NonNull ResourceManager resourceManager, @NonNull ProfilerFiller profilerFiller) { + } + + public void registerModels(ModelEvent.RegisterStandalone event) { + for (Identifier id : knownIds) { + Services.FLOWER_MODELS.registerModel(id, event); + } + } +} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 00000000..459a7b53 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,30 @@ +modLoader = "javafml" +loaderVersion = "${neoforge_loader_version_range}" +license = "${license}" +[[mods]] +modId = "${mod_id}" +version = "${version}" +displayName = "${mod_name}" +logoFile="assets/${mod_id}/icon.png" +credits="${credits}" +authors = "${mod_author}" +description = '''${description}''' +[[mixins]] +config = "${mod_id}.mixins.json" +[[mixins]] +config = "${mod_id}.neoforge.mixins.json" +[[dependencies.${mod_id}]] +modId = "neoforge" +type="required" +versionRange = "[${neoforge_version},)" +ordering = "NONE" +side = "BOTH" +[[dependencies.${mod_id}]] +modId = "minecraft" +type="required" +versionRange = "${minecraft_version_range}" +ordering = "NONE" +side = "BOTH" +[mc-publish] +modrinth = "tiny-flowers" +curseforge = 1183435 diff --git a/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.AccessHelper b/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.AccessHelper new file mode 100644 index 00000000..f9509a23 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.AccessHelper @@ -0,0 +1 @@ +co.secretonline.tinyflowers.platform.NeoForgeAccessHelper diff --git a/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.FlowerModelHelper b/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.FlowerModelHelper new file mode 100644 index 00000000..c749fed6 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.FlowerModelHelper @@ -0,0 +1 @@ +co.secretonline.tinyflowers.platform.NeoForgeFlowerModelHelper diff --git a/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.RegistryHelper b/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.RegistryHelper new file mode 100644 index 00000000..33e9cc79 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/services/co.secretonline.tinyflowers.platform.RegistryHelper @@ -0,0 +1 @@ +co.secretonline.tinyflowers.platform.NeoForgeRegistryHelper diff --git a/src/client/resources/tiny-flowers.client.mixins.json b/neoforge/src/main/resources/tiny_flowers.neoforge.mixins.json similarity index 54% rename from src/client/resources/tiny-flowers.client.mixins.json rename to neoforge/src/main/resources/tiny_flowers.neoforge.mixins.json index d15da854..b25f21fe 100644 --- a/src/client/resources/tiny-flowers.client.mixins.json +++ b/neoforge/src/main/resources/tiny_flowers.neoforge.mixins.json @@ -1,8 +1,10 @@ { "required": true, "package": "co.secretonline.tinyflowers.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": ["TerrainParticleMixin"], + "compatibilityLevel": "JAVA_25", + "mixins": [ + "particle.NeoForgeTerrainParticleMixin" + ], "injectors": { "defaultRequire": 1 } diff --git a/package-lock.json b/package-lock.json index c049a2f4..9a3c92c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "tiny-flowers", + "name": "tiny_flowers", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "tiny-flowers", + "name": "tiny_flowers", "version": "1.0.0", "license": "MPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 18a522af..368de017 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "tiny-flowers", + "name": "tiny_flowers", "version": "1.0.0", "description": "Adds stackable tiny variants of all Vanilla flowers.", "type": "module", diff --git a/settings.gradle b/settings.gradle index 75c4d726..c9d79d37 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,10 +1,51 @@ pluginManagement { - repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } - mavenCentral() - gradlePluginPortal() - } -} \ No newline at end of file + repositories { + gradlePluginPortal() + mavenCentral() + exclusiveContent { + forRepository { + maven { + name = 'Fabric' + url = uri('https://maven.fabricmc.net') + } + } + filter { + includeGroup('net.fabricmc') + includeGroup('net.fabricmc.unpick') + includeGroup('net.fabricmc.fabric-loom') + } + } + exclusiveContent { + forRepository { + maven { + name = 'Sponge' + url = uri('https://repo.spongepowered.org/repository/maven-public') + } + } + filter { + includeGroupAndSubgroups("org.spongepowered") + } + } + exclusiveContent { + forRepository { + maven { + name = 'Forge' + url = uri('https://maven.minecraftforge.net') + } + } + filter { + includeGroupAndSubgroups('net.minecraftforge') + } + } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + +// This should match the folder name of the project, or else IDEA may complain (see https://youtrack.jetbrains.com/issue/IDEA-317606) +rootProject.name = 'tiny-flowers' +include('common') +include('fabric') +include('neoforge') diff --git a/src/client/java/co/secretonline/tinyflowers/TinyFlowersClient.java b/src/client/java/co/secretonline/tinyflowers/TinyFlowersClient.java deleted file mode 100644 index 8344e7bd..00000000 --- a/src/client/java/co/secretonline/tinyflowers/TinyFlowersClient.java +++ /dev/null @@ -1,47 +0,0 @@ -package co.secretonline.tinyflowers; - -import co.secretonline.tinyflowers.blocks.ModBlocks; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap; -import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; -import net.minecraft.client.renderer.BiomeColors; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.renderer.item.ItemStackRenderState; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.DryFoliageColor; -import net.minecraft.world.level.GrassColor; - -public class TinyFlowersClient implements ClientModInitializer { - public static final RandomSource RANDOM = RandomSource.create(); - public static final ItemStackRenderState ITEM_RENDER_STATE = new ItemStackRenderState(); - - @Override - public void onInitializeClient() { - BlockRenderLayerMap.putBlock(ModBlocks.TINY_GARDEN, ChunkSectionLayer.CUTOUT); - - // See Pink Petals in net.minecraft.client.color.block.BlockColors - ColorProviderRegistry.BLOCK.register((state, world, pos, tintIndex) -> { - boolean hasWorld = world == null || pos == null; - - switch (tintIndex) { - case 1 -> { - if (hasWorld) { - return GrassColor.getDefaultColor(); - } else { - return BiomeColors.getAverageGrassColor(world, pos); - } - } - case 2 -> { - if (hasWorld) { - return DryFoliageColor.get(0.5, 1.0); - } else { - return BiomeColors.getAverageDryFoliageColor(world, pos); - } - } - default -> { - return -1; - } - } - }, ModBlocks.TINY_GARDEN); - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/BlockLootTableProvider.java b/src/client/java/co/secretonline/tinyflowers/datagen/BlockLootTableProvider.java deleted file mode 100644 index 7ac605da..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/BlockLootTableProvider.java +++ /dev/null @@ -1,54 +0,0 @@ -package co.secretonline.tinyflowers.datagen; - -import java.util.concurrent.CompletableFuture; - -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; -import co.secretonline.tinyflowers.blocks.ModBlocks; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider; -import net.minecraft.advancements.criterion.StatePropertiesPredicate; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.Identifier; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; - -public class BlockLootTableProvider extends FabricBlockLootTableProvider { - protected BlockLootTableProvider(FabricDataOutput dataOutput, - CompletableFuture registryLookup) { - super(dataOutput, registryLookup); - } - - @Override - public void generate() { - LootTable.Builder lootTableBuilder = LootTable.lootTable(); - - for (FlowerVariant variant : FlowerVariant.values()) { - if (variant.isEmpty()) { - continue; - } - - Item item = variant.asItem(); - if (BuiltInRegistries.ITEM.getKey(item).equals(Identifier.parse("air"))) { - TinyFlowers.LOGGER.error( - "Variant {} has an invalid item id: {}", - variant.getItemIdentifier(), BuiltInRegistries.ITEM.getKey(item)); - } - - for (var property : GardenBlock.FLOWER_VARIANT_PROPERTIES) { - lootTableBuilder.withPool(LootPool.lootPool() - .add(LootItem.lootTableItem(item)) - .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(ModBlocks.TINY_GARDEN) - .setProperties( - StatePropertiesPredicate.Builder.properties().hasProperty(property, variant)))); - } - } - - add(ModBlocks.TINY_GARDEN, lootTableBuilder); - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/BlockModelProvider.java b/src/client/java/co/secretonline/tinyflowers/datagen/BlockModelProvider.java deleted file mode 100644 index 3f42c373..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/BlockModelProvider.java +++ /dev/null @@ -1,219 +0,0 @@ -package co.secretonline.tinyflowers.datagen; - -import java.util.function.BiConsumer; -import java.util.function.Function; - -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; -import co.secretonline.tinyflowers.blocks.ModBlocks; -import co.secretonline.tinyflowers.datagen.data.ModModels; -import co.secretonline.tinyflowers.datagen.data.ModTextureMap; -import co.secretonline.tinyflowers.items.ModItems; -import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.minecraft.client.color.item.Dye; -import net.minecraft.client.data.models.BlockModelGenerators; -import net.minecraft.client.data.models.ItemModelGenerators; -import net.minecraft.client.data.models.blockstates.MultiPartGenerator; -import net.minecraft.client.data.models.model.ModelInstance; -import net.minecraft.client.data.models.model.ModelTemplates; -import net.minecraft.client.data.models.model.TextureMapping; -import net.minecraft.client.renderer.block.model.VariantMutator; -import net.minecraft.core.Direction; -import net.minecraft.resources.Identifier; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.EnumProperty; - -public class BlockModelProvider extends FabricModelProvider { - private final static Direction[] DIRECTIONS = new Direction[] { - Direction.NORTH, Direction.EAST, - Direction.SOUTH, Direction.WEST, }; - - private final static ModelGroup[] MODEL_GROUPS = new ModelGroup[] { - // Single layer, tinted stem - new ModelGroup(ModModels.Quartet.GARDEN, - ModTextureMap.flowerbed(), - new FlowerVariant[] { - FlowerVariant.DANDELION, - FlowerVariant.ALLIUM, - FlowerVariant.AZURE_BLUET, - FlowerVariant.RED_TULIP, - FlowerVariant.ORANGE_TULIP, - FlowerVariant.WHITE_TULIP, - FlowerVariant.PINK_TULIP, - FlowerVariant.OXEYE_DAISY, - FlowerVariant.CORNFLOWER, - }), - // Single layer, wither rose stem - new ModelGroup(ModModels.Quartet.GARDEN_UNTINTED, - ModTextureMap.flowerbed(TinyFlowers.id("block/tiny_wither_rose_stem")), - new FlowerVariant[] { - FlowerVariant.WITHER_ROSE, - }), - // Single layer, eyeblossom stem - new ModelGroup(ModModels.Quartet.GARDEN_UNTINTED, - ModTextureMap.flowerbed(TinyFlowers.id("block/tiny_eyeblossom_stem")), - new FlowerVariant[] { - FlowerVariant.CLOSED_EYEBLOSSOM, - }), - // Single layer, cactus flower stem - new ModelGroup(ModModels.Quartet.GARDEN_LOW_UNTINTED, - ModTextureMap.flowerbed(TinyFlowers.id("block/tiny_cactus_flower_stem")), - new FlowerVariant[] { - FlowerVariant.CACTUS_FLOWER, - }), - // Single layer (tall), tinted stem - new ModelGroup(ModModels.Quartet.GARDEN_TALL, - ModTextureMap.flowerbed(TinyFlowers.id("block/tall_tiny_flower_stem")), - new FlowerVariant[] { - FlowerVariant.POPPY, - }), - // Double layer, tinted stem - new ModelGroup(ModModels.Quartet.GARDEN_DOUBLE, - ModTextureMap.flowerbedDouble(TinyFlowers.id("block/tall_tiny_flower_stem")), - new FlowerVariant[] { - FlowerVariant.BLUE_ORCHID, - FlowerVariant.LILY_OF_THE_VALLEY, - }), - // Double layer (glow on top), eyeblossom stem - new ModelGroup(ModModels.Quartet.GARDEN_DOUBLE_UNTINTED_GLOW, - ModTextureMap.flowerbedDouble(TinyFlowers.id("block/tiny_eyeblossom_stem")), - new FlowerVariant[] { - FlowerVariant.OPEN_EYEBLOSSOM, - }), - // Triple layer, torchflower stem - new ModelGroup(ModModels.Quartet.GARDEN_TRIPLE_UNTINTED, - ModTextureMap.flowerbedTriple(TinyFlowers.id("block/tiny_torchflower_stem")), - new FlowerVariant[] { - FlowerVariant.TORCHFLOWER, - }), - // Leaf litter, no stem - new ModelGroup(ModModels.Quartet.GARDEN_LEAF_LITTER, - ModTextureMap.noStem(), - new FlowerVariant[] { - FlowerVariant.LEAF_LITTER, - }), - }; - - public BlockModelProvider(FabricDataOutput generator) { - super(generator); - } - - @Override - public void generateBlockStateModels(BlockModelGenerators blockStateModelGenerator) { - MultiPartGenerator definitionCreator = MultiPartGenerator - .multiPart(ModBlocks.TINY_GARDEN); - - // Generate blockstate variants for all flower variants. - for (FlowerVariant variant : FlowerVariant.values()) { - if (variant.isEmpty()) { - continue; - } - - Identifier baseId = getVariantBaseModelId(variant); - - Identifier model1 = baseId.withPath(path -> "block/" + path + "_1"); - Identifier model2 = baseId.withPath(path -> "block/" + path + "_2"); - Identifier model3 = baseId.withPath(path -> "block/" + path + "_3"); - Identifier model4 = baseId.withPath(path -> "block/" + path + "_4"); - - registerPartInAllDirections(definitionCreator, variant, GardenBlock.FLOWER_VARIANT_1, model1); - registerPartInAllDirections(definitionCreator, variant, GardenBlock.FLOWER_VARIANT_2, model2); - registerPartInAllDirections(definitionCreator, variant, GardenBlock.FLOWER_VARIANT_3, model3); - registerPartInAllDirections(definitionCreator, variant, GardenBlock.FLOWER_VARIANT_4, model4); - } - - // Generate all block model definitions. - for (ModelGroup group : MODEL_GROUPS) { - group.upload(blockStateModelGenerator.modelOutput); - } - - blockStateModelGenerator.blockStateOutput.accept(definitionCreator); - } - - @Override - public void generateItemModels(ItemModelGenerators itemModelGenerator) { - itemModelGenerator.generateFlatItem(ModBlocks.TINY_GARDEN.asItem(), ModelTemplates.FLAT_ITEM); - itemModelGenerator.generateItemWithTintedOverlay( - ModItems.FLORISTS_SHEARS_ITEM, - "_handle", - new Dye(DyeColor.RED.getTextureDiffuseColor())); - - for (FlowerVariant variant : FlowerVariant.values()) { - if (variant.shouldCreateItem()) { - itemModelGenerator.generateFlatItem(variant.asItem(), ModelTemplates.FLAT_ITEM); - } - } - } - - private MultiPartGenerator registerPartInAllDirections( - MultiPartGenerator modelDefinitionCreator, FlowerVariant variant, - EnumProperty property, Identifier modelIdentifier) { - for (Direction direction : DIRECTIONS) { - modelDefinitionCreator = modelDefinitionCreator.with( - BlockModelGenerators.condition() - .term(property, variant) - .term(BlockStateProperties.HORIZONTAL_FACING, direction), - BlockModelGenerators.plainVariant(modelIdentifier) - .with(getRotationForDirection(direction))); - } - - return modelDefinitionCreator; - } - - private VariantMutator getRotationForDirection(Direction direction) { - switch (direction) { - case Direction.NORTH: - return BlockModelGenerators.NOP; - case Direction.EAST: - return BlockModelGenerators.Y_ROT_90; - case Direction.SOUTH: - return BlockModelGenerators.Y_ROT_180; - case Direction.WEST: - return BlockModelGenerators.Y_ROT_270; - default: - throw new IllegalArgumentException("Unknown direction for model"); - } - } - - private static Identifier getVariantBaseModelId(FlowerVariant variant) { - Identifier identifier = variant.getItemIdentifier(); - - switch (variant) { - case FlowerVariant.LEAF_LITTER: - // The base Leaf Litter models utilise a single plane which doesn't quite work - // with this mod. As such, we need to override the models for Leaf Litter - // specifically. - identifier = TinyFlowers.id("leaf_litter"); - break; - default: - } - - return identifier; - } - - private record ModelGroup(ModModels.Quartet models, - Function texturesGetter, FlowerVariant[] variants) { - - public void upload(BiConsumer modelCollector) { - for (FlowerVariant variant : this.variants) { - Identifier textureId = variant.getItemIdentifier(); - Identifier itemId = getVariantBaseModelId(variant); - - Identifier modelId1 = itemId.withPath(path -> "block/" + path + "_1"); - Identifier modelId2 = itemId.withPath(path -> "block/" + path + "_2"); - Identifier modelId3 = itemId.withPath(path -> "block/" + path + "_3"); - Identifier modelId4 = itemId.withPath(path -> "block/" + path + "_4"); - - TextureMapping textureMap = this.texturesGetter.apply(textureId); - - this.models.model1().create(modelId1, textureMap, modelCollector); - this.models.model2().create(modelId2, textureMap, modelCollector); - this.models.model3().create(modelId3, textureMap, modelCollector); - this.models.model4().create(modelId4, textureMap, modelCollector); - } - } - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/BlockTagProvider.java b/src/client/java/co/secretonline/tinyflowers/datagen/BlockTagProvider.java deleted file mode 100644 index b26044a2..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/BlockTagProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package co.secretonline.tinyflowers.datagen; - -import java.util.concurrent.CompletableFuture; - -import co.secretonline.tinyflowers.blocks.ModBlocks; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; -import net.minecraft.core.HolderLookup; -import net.minecraft.tags.BlockTags; - -public class BlockTagProvider extends FabricTagProvider.FabricValueLookupTagProvider.BlockTagProvider { - public BlockTagProvider(FabricDataOutput output, CompletableFuture registriesFuture) { - super(output, registriesFuture); - } - - @Override - protected void addTags(HolderLookup.Provider wrapperLookup) { - - valueLookupBuilder(BlockTags.INSIDE_STEP_SOUND_BLOCKS).add(ModBlocks.TINY_GARDEN); - valueLookupBuilder(BlockTags.SWORD_EFFICIENT).add(ModBlocks.TINY_GARDEN); - valueLookupBuilder(BlockTags.FLOWERS).add(ModBlocks.TINY_GARDEN); - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/DataGenerator.java b/src/client/java/co/secretonline/tinyflowers/datagen/DataGenerator.java deleted file mode 100644 index 0a4cce84..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/DataGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package co.secretonline.tinyflowers.datagen; - -import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; -import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; - -public class DataGenerator implements DataGeneratorEntrypoint { - @Override - public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { - FabricDataGenerator.Pack pack = fabricDataGenerator.createPack(); - - pack.addProvider(BlockModelProvider::new); - pack.addProvider(BlockTagProvider::new); - pack.addProvider(BlockLootTableProvider::new); - pack.addProvider(ItemTagProvider::new); - pack.addProvider(RecipeProvider::new); - } - -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/ItemTagProvider.java b/src/client/java/co/secretonline/tinyflowers/datagen/ItemTagProvider.java deleted file mode 100644 index 11c313bd..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/ItemTagProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package co.secretonline.tinyflowers.datagen; - -import java.util.concurrent.CompletableFuture; - -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.ModItemTags; -import co.secretonline.tinyflowers.items.ModItems; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; -import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.tags.TagAppender; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.item.Item; - -public class ItemTagProvider extends FabricTagProvider.FabricValueLookupTagProvider.ItemTagProvider { - public ItemTagProvider(FabricDataOutput output, CompletableFuture registriesFuture) { - super(output, registriesFuture); - } - - @Override - protected void addTags(HolderLookup.Provider wrapperLookup) { - TagAppender builder = valueLookupBuilder(ModItemTags.TINY_FLOWERS); - - // Add all items/blocks that correspond to tiny flower variants to tag - for (FlowerVariant variant : FlowerVariant.values()) { - if (variant.isEmpty()) { - continue; - } - - builder.add(variant.asItem()); - } - - valueLookupBuilder(ItemTags.BEE_FOOD).addTag(ModItemTags.TINY_FLOWERS); - - valueLookupBuilder(ConventionalItemTags.SHEAR_TOOLS).add(ModItems.FLORISTS_SHEARS_ITEM); - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/RecipeProvider.java b/src/client/java/co/secretonline/tinyflowers/datagen/RecipeProvider.java deleted file mode 100644 index faf92c83..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/RecipeProvider.java +++ /dev/null @@ -1,129 +0,0 @@ -package co.secretonline.tinyflowers.datagen; - -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.items.ModItems; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; -import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.component.DataComponentPatch; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.Identifier; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.component.DyedItemColor; -import net.minecraft.world.item.crafting.Recipe; - -public class RecipeProvider extends FabricRecipeProvider { - - private static Map> COLOR_TAGS = Map.ofEntries( - Map.entry(DyeColor.WHITE, ConventionalItemTags.WHITE_DYES), - Map.entry(DyeColor.ORANGE, ConventionalItemTags.ORANGE_DYES), - Map.entry(DyeColor.MAGENTA, ConventionalItemTags.MAGENTA_DYES), - Map.entry(DyeColor.LIGHT_BLUE, ConventionalItemTags.LIGHT_BLUE_DYES), - Map.entry(DyeColor.YELLOW, ConventionalItemTags.YELLOW_DYES), - Map.entry(DyeColor.LIME, ConventionalItemTags.LIME_DYES), - Map.entry(DyeColor.PINK, ConventionalItemTags.PINK_DYES), - Map.entry(DyeColor.GRAY, ConventionalItemTags.GRAY_DYES), - Map.entry(DyeColor.LIGHT_GRAY, ConventionalItemTags.LIGHT_GRAY_DYES), - Map.entry(DyeColor.CYAN, ConventionalItemTags.CYAN_DYES), - Map.entry(DyeColor.PURPLE, ConventionalItemTags.PURPLE_DYES), - Map.entry(DyeColor.BLUE, ConventionalItemTags.BLUE_DYES), - Map.entry(DyeColor.BROWN, ConventionalItemTags.BROWN_DYES), - Map.entry(DyeColor.GREEN, ConventionalItemTags.GREEN_DYES), - Map.entry(DyeColor.RED, ConventionalItemTags.RED_DYES), - Map.entry(DyeColor.BLACK, ConventionalItemTags.BLACK_DYES)); - - public RecipeProvider(FabricDataOutput output, CompletableFuture registriesFuture) { - super(output, registriesFuture); - } - - @Override - protected net.minecraft.data.recipes.RecipeProvider createRecipeProvider(HolderLookup.Provider registryLookup, - RecipeOutput exporter) { - return new net.minecraft.data.recipes.RecipeProvider(registryLookup, exporter) { - @Override - public void buildRecipes() { - Identifier stewId = BuiltInRegistries.ITEM.getKey(Items.SUSPICIOUS_STEW); - - // Generate recipes for each flower variant - for (FlowerVariant flowerVariant : FlowerVariant.values()) { - // Create tiny flower items for variants that need them. - if (flowerVariant.shouldCreateItem()) { - shapeless(RecipeCategory.DECORATIONS, flowerVariant, 4) - .requires(ModItems.FLORISTS_SHEARS_ITEM).requires(flowerVariant.getOriginalBlock()) - .group("tiny_flowers") - .unlockedBy(getHasName(ModItems.FLORISTS_SHEARS_ITEM), has(ModItems.FLORISTS_SHEARS_ITEM)) - .save(output); - } - - // Create recipes for the flower variants that can be used in suspicious stew. - if (flowerVariant.getSuspiciousEffects() != null) { - ItemStack stack = new ItemStack( - BuiltInRegistries.ITEM.wrapAsHolder(Items.SUSPICIOUS_STEW), - 1, - DataComponentPatch.builder() - .set(DataComponents.SUSPICIOUS_STEW_EFFECTS, flowerVariant.getSuspiciousEffects()) - .build()); - - ResourceKey> recipeKey = ResourceKey.create( - Registries.RECIPE, - TinyFlowers.id(stewId.getPath() + "_from_" + flowerVariant.getItemIdentifier().getPath())); - - shapeless(RecipeCategory.FOOD, stack) - .requires(Items.BOWL) - .requires(Items.BROWN_MUSHROOM) - .requires(Items.RED_MUSHROOM) - .requires(flowerVariant) - .requires(flowerVariant) - .group("suspicious_stew") - .unlockedBy(getHasName(flowerVariant), this.has(flowerVariant)) - .save(output, recipeKey); - } - } - - // Generate recipes for each colour of shears. - Identifier shearsId = BuiltInRegistries.ITEM.getKey(ModItems.FLORISTS_SHEARS_ITEM); - for (var entry : COLOR_TAGS.entrySet()) { - DyeColor color = entry.getKey(); - TagKey tagKey = entry.getValue(); - ItemStack stack = new ItemStack( - BuiltInRegistries.ITEM.wrapAsHolder(ModItems.FLORISTS_SHEARS_ITEM), - 1, - DataComponentPatch.builder() - .set(DataComponents.DYED_COLOR, new DyedItemColor(color.getTextureDiffuseColor())) - .build()); - - ResourceKey> recipeKey = ResourceKey.create( - Registries.RECIPE, - shearsId.withPath((path) -> path + "_" + color.getSerializedName())); - - // No method for creating ItemStack of shaped? - shapeless(RecipeCategory.TOOLS, stack) - .requires(Items.SHEARS) - .requires(tagKey) - .group("florists_shears") - .unlockedBy(getHasName(Items.SHEARS), has(Items.SHEARS)) - .save(output, recipeKey); - } - } - }; - } - - @Override - public String getName() { - return "TinyFlowersRecipeProvider"; - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/data/ModModels.java b/src/client/java/co/secretonline/tinyflowers/datagen/data/ModModels.java deleted file mode 100644 index 861887a5..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/data/ModModels.java +++ /dev/null @@ -1,163 +0,0 @@ -package co.secretonline.tinyflowers.datagen.data; - -import java.util.Optional; -import net.minecraft.client.data.models.model.ModelTemplate; -import net.minecraft.client.data.models.model.TextureSlot; -import co.secretonline.tinyflowers.TinyFlowers; - -public class ModModels { - public static final ModelTemplate GARDEN_1 = block( - "garden_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_2 = block( - "garden_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_3 = block( - "garden_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_4 = block( - "garden_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - - public static final ModelTemplate GARDEN_UNTINTED_1 = block( - "garden_untinted_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_UNTINTED_2 = block( - "garden_untinted_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_UNTINTED_3 = block( - "garden_untinted_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_UNTINTED_4 = block( - "garden_untinted_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - - public static final ModelTemplate GARDEN_TALL_1 = block( - "garden_tall_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_TALL_2 = block( - "garden_tall_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_TALL_3 = block( - "garden_tall_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_TALL_4 = block( - "garden_tall_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - - public static final ModelTemplate GARDEN_DOUBLE_1 = block( - "garden_double_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_2 = block( - "garden_double_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_3 = block( - "garden_double_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_4 = block( - "garden_double_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_1 = block( - "garden_double_untinted_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_2 = block( - "garden_double_untinted_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_3 = block( - "garden_double_untinted_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_4 = block( - "garden_double_untinted_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_GLOW_1 = block( - "garden_double_untinted_glow_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_GLOW_2 = block( - "garden_double_untinted_glow_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_GLOW_3 = block( - "garden_double_untinted_glow_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_DOUBLE_UNTINTED_GLOW_4 = block( - "garden_double_untinted_glow_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, ModTextureKey.FLOWERBED_UPPER); - - public static final ModelTemplate GARDEN_TRIPLE_UNTINTED_1 = block( - "garden_triple_untinted_1", "_1", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, - ModTextureKey.FLOWERBED_MIDDLE, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_TRIPLE_UNTINTED_2 = block( - "garden_triple_untinted_2", "_2", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, - ModTextureKey.FLOWERBED_MIDDLE, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_TRIPLE_UNTINTED_3 = block( - "garden_triple_untinted_3", "_3", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, - ModTextureKey.FLOWERBED_MIDDLE, ModTextureKey.FLOWERBED_UPPER); - public static final ModelTemplate GARDEN_TRIPLE_UNTINTED_4 = block( - "garden_triple_untinted_4", "_4", - TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM, - ModTextureKey.FLOWERBED_MIDDLE, ModTextureKey.FLOWERBED_UPPER); - - public static final ModelTemplate GARDEN_LEAF_LITTER_1 = block( - "garden_leaf_litter_1", "_1", TextureSlot.PARTICLE, TextureSlot.FLOWERBED); - public static final ModelTemplate GARDEN_LEAF_LITTER_2 = block( - "garden_leaf_litter_2", "_2", TextureSlot.PARTICLE, TextureSlot.FLOWERBED); - public static final ModelTemplate GARDEN_LEAF_LITTER_3 = block( - "garden_leaf_litter_3", "_3", TextureSlot.PARTICLE, TextureSlot.FLOWERBED); - public static final ModelTemplate GARDEN_LEAF_LITTER_4 = block( - "garden_leaf_litter_4", "_4", TextureSlot.PARTICLE, TextureSlot.FLOWERBED); - - public static final ModelTemplate GARDEN_LOW_UNTINTED_1 = block( - "garden_low_untinted_1", "_1", TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_LOW_UNTINTED_2 = block( - "garden_low_untinted_2", "_2", TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_LOW_UNTINTED_3 = block( - "garden_low_untinted_3", "_3", TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - public static final ModelTemplate GARDEN_LOW_UNTINTED_4 = block( - "garden_low_untinted_4", "_4", TextureSlot.PARTICLE, TextureSlot.FLOWERBED, TextureSlot.STEM); - - private static ModelTemplate block(String parent, String variant, TextureSlot... requiredTextureKeys) { - return new ModelTemplate(Optional.of(TinyFlowers.id("block/" + parent)), Optional.of(variant), requiredTextureKeys); - } - - public record Quartet(ModelTemplate model1, ModelTemplate model2, ModelTemplate model3, ModelTemplate model4) { - public static Quartet GARDEN = new Quartet( - GARDEN_1, GARDEN_2, - GARDEN_3, GARDEN_4); - - public static Quartet GARDEN_UNTINTED = new Quartet( - GARDEN_UNTINTED_1, GARDEN_UNTINTED_2, - GARDEN_UNTINTED_3, GARDEN_UNTINTED_4); - - public static Quartet GARDEN_TALL = new Quartet( - GARDEN_TALL_1, GARDEN_TALL_2, - GARDEN_TALL_3, GARDEN_TALL_4); - - public static Quartet GARDEN_DOUBLE = new Quartet( - GARDEN_DOUBLE_1, GARDEN_DOUBLE_2, - GARDEN_DOUBLE_3, GARDEN_DOUBLE_4); - - public static Quartet GARDEN_DOUBLE_UNTINTED = new Quartet( - GARDEN_DOUBLE_UNTINTED_1, GARDEN_DOUBLE_UNTINTED_2, - GARDEN_DOUBLE_UNTINTED_3, GARDEN_DOUBLE_UNTINTED_4); - - public static Quartet GARDEN_DOUBLE_UNTINTED_GLOW = new Quartet( - GARDEN_DOUBLE_UNTINTED_GLOW_1, GARDEN_DOUBLE_UNTINTED_GLOW_2, - GARDEN_DOUBLE_UNTINTED_GLOW_3, GARDEN_DOUBLE_UNTINTED_GLOW_4); - - public static Quartet GARDEN_TRIPLE_UNTINTED = new Quartet( - GARDEN_TRIPLE_UNTINTED_1, GARDEN_TRIPLE_UNTINTED_2, - GARDEN_TRIPLE_UNTINTED_3, GARDEN_TRIPLE_UNTINTED_4); - - public static Quartet GARDEN_LEAF_LITTER = new Quartet( - GARDEN_LEAF_LITTER_1, GARDEN_LEAF_LITTER_2, - GARDEN_LEAF_LITTER_3, GARDEN_LEAF_LITTER_4); - - public static Quartet GARDEN_LOW_UNTINTED = new Quartet( - GARDEN_LOW_UNTINTED_1, GARDEN_LOW_UNTINTED_2, - GARDEN_LOW_UNTINTED_3, GARDEN_LOW_UNTINTED_4); - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/data/ModTextureKey.java b/src/client/java/co/secretonline/tinyflowers/datagen/data/ModTextureKey.java deleted file mode 100644 index da4e60df..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/data/ModTextureKey.java +++ /dev/null @@ -1,9 +0,0 @@ -package co.secretonline.tinyflowers.datagen.data; - -import net.minecraft.client.data.models.model.TextureSlot; - -public class ModTextureKey { - public static final TextureSlot FLOWERBED_MIDDLE = TextureSlot.create("flowerbed_middle"); - - public static final TextureSlot FLOWERBED_UPPER = TextureSlot.create("flowerbed_upper"); -} diff --git a/src/client/java/co/secretonline/tinyflowers/datagen/data/ModTextureMap.java b/src/client/java/co/secretonline/tinyflowers/datagen/data/ModTextureMap.java deleted file mode 100644 index a6f24783..00000000 --- a/src/client/java/co/secretonline/tinyflowers/datagen/data/ModTextureMap.java +++ /dev/null @@ -1,50 +0,0 @@ -package co.secretonline.tinyflowers.datagen.data; - -import java.util.function.Function; -import net.minecraft.client.data.models.model.TextureMapping; -import net.minecraft.client.data.models.model.TextureSlot; -import net.minecraft.resources.Identifier; - -public class ModTextureMap { - public static Function noStem() { - return (itemId) -> new TextureMapping() - .put(TextureSlot.PARTICLE, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.FLOWERBED, itemId.withPath(path -> "block/" + path)); - } - - public static Function flowerbed() { - return flowerbed(Identifier.withDefaultNamespace("block/pink_petals_stem")); - } - - public static Function flowerbed(Identifier stemIdentifier) { - return (itemId) -> new TextureMapping() - .put(TextureSlot.PARTICLE, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.FLOWERBED, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.STEM, stemIdentifier); - } - - public static Function flowerbedDouble() { - return flowerbedDouble(Identifier.withDefaultNamespace("block/pink_petals_stem")); - } - - public static Function flowerbedDouble(Identifier stemIdentifier) { - return (itemId) -> new TextureMapping() - .put(TextureSlot.PARTICLE, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.FLOWERBED, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.STEM, stemIdentifier) - .put(ModTextureKey.FLOWERBED_UPPER, itemId.withPath(path -> "block/" + path + "_upper")); - } - - public static Function flowerbedTriple() { - return flowerbedTriple(Identifier.withDefaultNamespace("block/pink_petals_stem")); - } - - public static Function flowerbedTriple(Identifier stemIdentifier) { - return (itemId) -> new TextureMapping() - .put(TextureSlot.PARTICLE, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.FLOWERBED, itemId.withPath(path -> "block/" + path)) - .put(TextureSlot.STEM, stemIdentifier) - .put(ModTextureKey.FLOWERBED_MIDDLE, itemId.withPath(path -> "block/" + path + "_middle")) - .put(ModTextureKey.FLOWERBED_UPPER, itemId.withPath(path -> "block/" + path + "_upper")); - } -} diff --git a/src/client/java/co/secretonline/tinyflowers/mixin/TerrainParticleMixin.java b/src/client/java/co/secretonline/tinyflowers/mixin/TerrainParticleMixin.java deleted file mode 100644 index b71a5f84..00000000 --- a/src/client/java/co/secretonline/tinyflowers/mixin/TerrainParticleMixin.java +++ /dev/null @@ -1,63 +0,0 @@ -package co.secretonline.tinyflowers.mixin; - -import java.util.List; -import net.minecraft.util.Util; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.SingleQuadParticle; -import net.minecraft.client.particle.TerrainParticle; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.BlockPos; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import co.secretonline.tinyflowers.TinyFlowersClient; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; - -@Mixin(TerrainParticle.class) -abstract class TerrainParticleMixin extends SingleQuadParticle { - protected TerrainParticleMixin(ClientLevel world, double x, double y, double z, TextureAtlasSprite sprite) { - super(world, x, y, z, sprite); - throw new Error("Should not directly instatiiate mixin"); - } - - @Inject(method = "(Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDDLnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;)V", at = @At("RETURN")) - private void onConstructorReturn(ClientLevel world, double x, double y, double z, - double velocityX, double velocityY, double velocityZ, - BlockState state, BlockPos blockPos, CallbackInfo ci) { - TextureAtlasSprite override = getOverrideSpriteForBlockState(state); - if (override != null) { - this.setSprite(override); - } - } - - private static TextureAtlasSprite getOverrideSpriteForBlockState(BlockState state) { - if (!(state.getBlock() instanceof GardenBlock)) { - return null; - } - - // Select a random flower variant to render as the particle - List flowers = GardenBlock.getFlowers(state); - - if (flowers.isEmpty()) { - return null; - } - - FlowerVariant variant = Util.getRandom(flowers, TinyFlowersClient.RANDOM); - - Minecraft client = Minecraft.getInstance(); - ItemStack stack = new ItemStack(variant.asItem()); - - TinyFlowersClient.ITEM_RENDER_STATE.clear(); - client.getItemModelResolver() - .appendItemLayers(TinyFlowersClient.ITEM_RENDER_STATE, stack, ItemDisplayContext.GROUND, client.level, null, 0); - - return TinyFlowersClient.ITEM_RENDER_STATE.pickParticleIcon(TinyFlowersClient.RANDOM); - } -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_1.json b/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_1.json deleted file mode 100644 index 7337a5e7..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_1.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [0, 0.25, 0], - "to": [8, 0.25, 8], - "faces": { - "up": {"uv": [0, 0, 8, 8], "texture": "#flowerbed", "tintindex": 2}, - "down": {"uv": [0, 8, 8, 0], "texture": "#flowerbed", "tintindex": 2} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_2.json b/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_2.json deleted file mode 100644 index c17568ca..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_2.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [0, 0.25, 8], - "to": [8, 0.25, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#flowerbed", "tintindex": 2}, - "down": {"uv": [0, 16, 8, 8], "texture": "#flowerbed", "tintindex": 2} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_3.json b/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_3.json deleted file mode 100644 index b497dcd1..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_3.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [8, 0.25, 8], - "to": [16, 0.25, 16], - "faces": { - "up": {"uv": [8, 8, 16, 16], "texture": "#flowerbed", "tintindex": 2}, - "down": {"uv": [8, 16, 16, 8], "texture": "#flowerbed", "tintindex": 2} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_4.json b/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_4.json deleted file mode 100644 index 9ee54ac6..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_leaf_litter_4.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [8, 0.25, 0], - "to": [16, 0.25, 8], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#flowerbed", "tintindex": 2}, - "down": {"uv": [8, 8, 16, 0], "texture": "#flowerbed", "tintindex": 2} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_1.json b/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_1.json deleted file mode 100644 index 2ea529bc..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_1.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [0, 1, 0], - "to": [8, 1, 8], - "faces": { - "up": {"uv": [0, 0, 8, 8], "texture": "#flowerbed"}, - "down": {"uv": [0, 8, 8, 0], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [3.75, 0, -2.1], - "to": [4.75, 1, -2.1], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 6, 1, 7], "texture": "#stem"}, - "south": {"uv": [0, 6, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [4.25, 0, -2.6], - "to": [4.25, 1, -1.6], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 6, 1, 7], "texture": "#stem"}, - "west": {"uv": [0, 6, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [4.4, 0, 2.8], - "to": [5.4, 1, 2.8], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 5, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 5, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [4.9, 0, 2.3], - "to": [4.9, 1, 3.3], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 5, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 5, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem3_ns", - "from": [8.65, 0, 0.05], - "to": [9.65, 1, 0.05], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem3_ew", - "from": [9.15, 0, -0.45], - "to": [9.15, 1, 0.55], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_2.json b/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_2.json deleted file mode 100644 index 0bc5021e..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_2.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [0, 1, 8], - "to": [8, 1, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#flowerbed"}, - "down": {"uv": [0, 16, 8, 8], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [11.15, 0, 3.25], - "to": [12.15, 1, 3.25], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -1]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [11.65, 0, 2.75], - "to": [11.65, 1, 3.75], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -1]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [8.15, 0, 5.25], - "to": [9.15, 1, 5.25], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, 1]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [8.65, 0, 4.75], - "to": [8.65, 1, 5.75], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, 1]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem3_ns", - "from": [10.15, 0, 8.25], - "to": [11.15, 1, 8.25], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 4]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem3_ew", - "from": [10.65, 0, 7.75], - "to": [10.65, 1, 8.75], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 4]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_3.json b/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_3.json deleted file mode 100644 index a25cf950..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_3.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [8, 1, 8], - "to": [16, 1, 16], - "faces": { - "up": {"uv": [8, 8, 16, 16], "texture": "#flowerbed"}, - "down": {"uv": [8, 16, 16, 8], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [12.9, 0, 0], - "to": [13.9, 1, 0], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [13.4, 0, -0.5], - "to": [13.4, 1, 0.5], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [17.15, 0, -2.85], - "to": [18.15, 1, -2.85], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 5, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 5, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [17.65, 0, -3.35], - "to": [17.65, 1, -2.35], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 5, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 5, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem3_ns", - "from": [17.65, 0, 1.9], - "to": [18.65, 1, 1.9], - "rotation": {"angle": -45, "axis": "y", "origin": [0.5, 0, 0.5]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem3_ew", - "from": [18.15, 0, 1.4], - "to": [18.15, 1, 2.4], - "rotation": {"angle": -45, "axis": "y", "origin": [0.5, 0, 0.5]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_4.json b/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_4.json deleted file mode 100644 index eaca7982..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_low_untinted_4.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [8, 1, 0], - "to": [16, 1, 8], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#flowerbed"}, - "down": {"uv": [8, 8, 16, 0], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [13.9, 0, -8.2], - "to": [14.9, 1, -8.2], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -4]}, - "faces": { - "north": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [14.4, 0, -8.7], - "to": [14.4, 1, -7.7], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -4]}, - "faces": { - "east": {"uv": [0, 4, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 4, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [10.9, 0, -5.2], - "to": [11.9, 1, -5.2], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, -1]}, - "faces": { - "north": {"uv": [0, 5, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 5, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [11.4, 0, -5.7], - "to": [11.4, 1, -4.7], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, -1]}, - "faces": { - "east": {"uv": [0, 5, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 5, 1, 6], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_1.json b/src/client/resources/assets/tiny-flowers/models/block/garden_tall_1.json deleted file mode 100644 index 15f3d6cf..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_1.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [0, 6, 0], - "to": [8, 6, 8], - "faces": { - "up": {"uv": [0, 0, 8, 8], "texture": "#flowerbed"}, - "down": {"uv": [0, 8, 8, 0], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [3.75, 0, -2.1], - "to": [4.75, 6, -2.1], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem1_ew", - "from": [4.25, 0, -2.6], - "to": [4.25, 6, -1.6], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ns", - "from": [4.4, 0, 2.8], - "to": [5.4, 6, 2.8], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ew", - "from": [4.9, 0, 2.3], - "to": [4.9, 6, 3.3], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem3_ns", - "from": [8.65, 0, 0.05], - "to": [9.65, 6, 0.05], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem3_ew", - "from": [9.15, 0, -0.45], - "to": [9.15, 6, 0.55], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 10], "texture": "#stem", "tintindex": 1} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_2.json b/src/client/resources/assets/tiny-flowers/models/block/garden_tall_2.json deleted file mode 100644 index bb5b29d8..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_2.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [0, 4, 8], - "to": [8, 4, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#flowerbed"}, - "down": {"uv": [0, 16, 8, 8], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [11.15, 0, 3.25], - "to": [12.15, 4, 3.25], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -1]}, - "faces": { - "north": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem1_ew", - "from": [11.65, 0, 2.75], - "to": [11.65, 4, 3.75], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -1]}, - "faces": { - "east": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ns", - "from": [8.15, 0, 5.25], - "to": [9.15, 4, 5.25], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, 1]}, - "faces": { - "north": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ew", - "from": [8.65, 0, 4.75], - "to": [8.65, 4, 5.75], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, 1]}, - "faces": { - "east": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem3_ns", - "from": [10.15, 0, 8.25], - "to": [11.15, 4, 8.25], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 4]}, - "faces": { - "north": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem3_ew", - "from": [10.65, 0, 7.75], - "to": [10.65, 4, 8.75], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 4]}, - "faces": { - "east": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 8], "texture": "#stem", "tintindex": 1} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_3.json b/src/client/resources/assets/tiny-flowers/models/block/garden_tall_3.json deleted file mode 100644 index 2d8e1b5f..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_3.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [8, 5, 8], - "to": [16, 5, 16], - "faces": { - "up": {"uv": [8, 8, 16, 16], "texture": "#flowerbed"}, - "down": {"uv": [8, 16, 16, 8], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [12.9, 0, 0], - "to": [13.9, 5, 0], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem1_ew", - "from": [13.4, 0, -0.5], - "to": [13.4, 5, 0.5], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ns", - "from": [17.15, 0, -2.85], - "to": [18.15, 5, -2.85], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ew", - "from": [17.65, 0, -3.35], - "to": [17.65, 5, -2.35], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem3_ns", - "from": [17.65, 0, 1.9], - "to": [18.65, 5, 1.9], - "rotation": {"angle": -45, "axis": "y", "origin": [0.5, 0, 0.5]}, - "faces": { - "north": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem3_ew", - "from": [18.15, 0, 1.4], - "to": [18.15, 5, 2.4], - "rotation": {"angle": -45, "axis": "y", "origin": [0.5, 0, 0.5]}, - "faces": { - "east": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_4.json b/src/client/resources/assets/tiny-flowers/models/block/garden_tall_4.json deleted file mode 100644 index ebc8013f..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_tall_4.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower", - "from": [8, 5, 0], - "to": [16, 5, 8], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#flowerbed"}, - "down": {"uv": [8, 8, 16, 0], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [13.9, 0, -8.2], - "to": [14.9, 5, -8.2], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -4]}, - "faces": { - "north": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem1_ew", - "from": [14.4, 0, -8.7], - "to": [14.4, 5, -7.7], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -4]}, - "faces": { - "east": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ns", - "from": [10.9, 0, -5.2], - "to": [11.9, 5, -5.2], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, -1]}, - "faces": { - "north": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "south": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - }, - { - "name": "stem2_ew", - "from": [11.4, 0, -5.7], - "to": [11.4, 5, -4.7], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, -1]}, - "faces": { - "east": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1}, - "west": {"uv": [0, 4, 1, 9], "texture": "#stem", "tintindex": 1} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_1.json b/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_1.json deleted file mode 100644 index f507ff88..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_1.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower_upper", - "from": [0, 5, 0], - "to": [8, 5, 8], - "faces": { - "up": {"uv": [0, 0, 8, 8], "texture": "#flowerbed_upper"}, - "down": {"uv": [0, 8, 8, 0], "texture": "#flowerbed_upper"} - } - }, - { - "name": "flower_middle", - "from": [0, 4, 0], - "to": [8, 4, 8], - "faces": { - "up": {"uv": [0, 0, 8, 8], "texture": "#flowerbed_middle"}, - "down": {"uv": [0, 8, 8, 0], "texture": "#flowerbed_middle"} - } - }, - { - "name": "flower_lower", - "from": [0, 3, 0], - "to": [8, 3, 8], - "faces": { - "up": {"uv": [0, 0, 8, 8], "texture": "#flowerbed"}, - "down": {"uv": [0, 8, 8, 0], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [3.75, 0, -2.1], - "to": [4.75, 5, -2.1], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 2, 1, 7], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [4.25, 0, -2.6], - "to": [4.25, 5, -1.6], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 2, 1, 7], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [4.4, 0, 2.8], - "to": [5.4, 5, 2.8], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 2, 1, 7], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [4.9, 0, 2.3], - "to": [4.9, 5, 3.3], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 2, 1, 7], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem3_ns", - "from": [8.65, 0, 0.05], - "to": [9.65, 5, 0.05], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 2, 1, 7], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 7], "texture": "#stem"} - } - }, - { - "name": "stem3_ew", - "from": [9.15, 0, -0.45], - "to": [9.15, 5, 0.55], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 2, 1, 7], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 7], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_2.json b/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_2.json deleted file mode 100644 index 7ce16ad5..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_2.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower_upper", - "from": [0, 3, 8], - "to": [8, 3, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#flowerbed_upper"}, - "down": {"uv": [0, 16, 8, 8], "texture": "#flowerbed_upper"} - } - }, - { - "name": "flower_middle", - "from": [0, 2, 8], - "to": [8, 2, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#flowerbed_middle"}, - "down": {"uv": [0, 16, 8, 8], "texture": "#flowerbed_middle"} - } - }, - { - "name": "flower_lower", - "from": [0, 1, 8], - "to": [8, 1, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#flowerbed"}, - "down": {"uv": [0, 16, 8, 8], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [11.15, 0, 3.25], - "to": [12.15, 3, 3.25], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -1]}, - "faces": { - "north": {"uv": [0, 2, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [11.65, 0, 2.75], - "to": [11.65, 3, 3.75], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -1]}, - "faces": { - "east": {"uv": [0, 2, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [8.15, 0, 5.25], - "to": [9.15, 3, 5.25], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, 1]}, - "faces": { - "north": {"uv": [0, 2, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [8.65, 0, 4.75], - "to": [8.65, 3, 5.75], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, 1]}, - "faces": { - "east": {"uv": [0, 2, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem3_ns", - "from": [10.15, 0, 8.25], - "to": [11.15, 3, 8.25], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 4]}, - "faces": { - "north": {"uv": [0, 2, 1, 5], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 5], "texture": "#stem"} - } - }, - { - "name": "stem3_ew", - "from": [10.65, 0, 7.75], - "to": [10.65, 3, 8.75], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 4]}, - "faces": { - "east": {"uv": [0, 2, 1, 5], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 5], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_3.json b/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_3.json deleted file mode 100644 index b6c50f38..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_3.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower_upper", - "from": [8, 4, 8], - "to": [16, 4, 16], - "faces": { - "up": {"uv": [8, 8, 16, 16], "texture": "#flowerbed_upper"}, - "down": {"uv": [8, 16, 16, 8], "texture": "#flowerbed_upper"} - } - }, - { - "name": "flower_middle", - "from": [8, 3, 8], - "to": [16, 3, 16], - "faces": { - "up": {"uv": [8, 8, 16, 16], "texture": "#flowerbed_middle"}, - "down": {"uv": [8, 16, 16, 8], "texture": "#flowerbed_middle"} - } - }, - { - "name": "flower_lower", - "from": [8, 2, 8], - "to": [16, 2, 16], - "faces": { - "up": {"uv": [8, 8, 16, 16], "texture": "#flowerbed"}, - "down": {"uv": [8, 16, 16, 8], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [12.9, 0, 0], - "to": [13.9, 4, 0], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [13.4, 0, -0.5], - "to": [13.4, 4, 0.5], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [17.15, 0, -2.85], - "to": [18.15, 4, -2.85], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "north": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [17.65, 0, -3.35], - "to": [17.65, 4, -2.35], - "rotation": {"angle": -45, "axis": "y", "origin": [0, 0, 0]}, - "faces": { - "east": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem3_ns", - "from": [17.65, 0, 1.9], - "to": [18.65, 4, 1.9], - "rotation": {"angle": -45, "axis": "y", "origin": [0.5, 0, 0.5]}, - "faces": { - "north": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem3_ew", - "from": [18.15, 0, 1.4], - "to": [18.15, 4, 2.4], - "rotation": {"angle": -45, "axis": "y", "origin": [0.5, 0, 0.5]}, - "faces": { - "east": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - } - ] -} diff --git a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_4.json b/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_4.json deleted file mode 100644 index 6fa2f6f1..00000000 --- a/src/client/resources/assets/tiny-flowers/models/block/garden_triple_untinted_4.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "name": "flower_upper", - "from": [8, 4, 0], - "to": [16, 4, 8], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#flowerbed_upper"}, - "down": {"uv": [8, 8, 16, 0], "texture": "#flowerbed_upper"} - } - }, - { - "name": "flower_middle", - "from": [8, 3, 0], - "to": [16, 3, 8], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#flowerbed_middle"}, - "down": {"uv": [8, 8, 16, 0], "texture": "#flowerbed_middle"} - } - }, - { - "name": "flower_lower", - "from": [8, 2, 0], - "to": [16, 2, 8], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#flowerbed"}, - "down": {"uv": [8, 8, 16, 0], "texture": "#flowerbed"} - } - }, - { - "name": "stem1_ns", - "from": [13.9, 0, -8.2], - "to": [14.9, 4, -8.2], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -4]}, - "faces": { - "north": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem1_ew", - "from": [14.4, 0, -8.7], - "to": [14.4, 4, -7.7], - "rotation": {"angle": -45, "axis": "y", "origin": [1, 0, -4]}, - "faces": { - "east": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ns", - "from": [10.9, 0, -5.2], - "to": [11.9, 4, -5.2], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, -1]}, - "faces": { - "north": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "south": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - }, - { - "name": "stem2_ew", - "from": [11.4, 0, -5.7], - "to": [11.4, 4, -4.7], - "rotation": {"angle": -45, "axis": "y", "origin": [-2, 0, -1]}, - "faces": { - "east": {"uv": [0, 2, 1, 6], "texture": "#stem"}, - "west": {"uv": [0, 2, 1, 6], "texture": "#stem"} - } - } - ] -} diff --git a/src/main/generated/assets/tiny-flowers/blockstates/tiny_garden.json b/src/main/generated/assets/tiny-flowers/blockstates/tiny_garden.json deleted file mode 100644 index 7f477e42..00000000 --- a/src/main/generated/assets/tiny-flowers/blockstates/tiny_garden.json +++ /dev/null @@ -1,3124 +0,0 @@ -{ - "multipart": [ - { - "apply": { - "model": "minecraft:block/pink_petals_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/pink_petals_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "pink_petals" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "wildflowers" - } - }, - { - "apply": { - "model": "minecraft:block/wildflowers_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "wildflowers" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/leaf_litter_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "leaf_litter" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_dandelion_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "dandelion" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_poppy_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "poppy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_blue_orchid_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "blue_orchid" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_allium_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "allium" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_azure_bluet_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "azure_bluet" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_red_tulip_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "red_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_orange_tulip_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "orange_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_white_tulip_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "white_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_pink_tulip_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "pink_tulip" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_oxeye_daisy_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "oxeye_daisy" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cornflower_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "cornflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_lily_of_the_valley_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "lily_of_the_valley" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_torchflower_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "torchflower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_closed_eyeblossom_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "closed_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_open_eyeblossom_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "open_eyeblossom" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_wither_rose_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "wither_rose" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_1" - }, - "when": { - "facing": "north", - "flower_variant_1": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_1", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_1": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_1", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_1": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_1", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_1": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_2" - }, - "when": { - "facing": "north", - "flower_variant_2": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_2", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_2": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_2", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_2": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_2", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_2": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_3" - }, - "when": { - "facing": "north", - "flower_variant_3": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_3", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_3": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_3", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_3": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_3", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_3": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_4" - }, - "when": { - "facing": "north", - "flower_variant_4": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_4", - "y": 90 - }, - "when": { - "facing": "east", - "flower_variant_4": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_4", - "y": 180 - }, - "when": { - "facing": "south", - "flower_variant_4": "cactus_flower" - } - }, - { - "apply": { - "model": "tiny-flowers:block/tiny_cactus_flower_4", - "y": 270 - }, - "when": { - "facing": "west", - "flower_variant_4": "cactus_flower" - } - } - ] -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_allium.json b/src/main/generated/assets/tiny-flowers/items/tiny_allium.json deleted file mode 100644 index c1278bf2..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_allium.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_allium" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_azure_bluet.json b/src/main/generated/assets/tiny-flowers/items/tiny_azure_bluet.json deleted file mode 100644 index 4cbb5ed5..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_azure_bluet.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_azure_bluet" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_blue_orchid.json b/src/main/generated/assets/tiny-flowers/items/tiny_blue_orchid.json deleted file mode 100644 index 9cf6771f..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_blue_orchid.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_blue_orchid" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_cactus_flower.json b/src/main/generated/assets/tiny-flowers/items/tiny_cactus_flower.json deleted file mode 100644 index ce70f894..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_cactus_flower.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_cactus_flower" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_closed_eyeblossom.json b/src/main/generated/assets/tiny-flowers/items/tiny_closed_eyeblossom.json deleted file mode 100644 index f01222d4..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_closed_eyeblossom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_closed_eyeblossom" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_cornflower.json b/src/main/generated/assets/tiny-flowers/items/tiny_cornflower.json deleted file mode 100644 index fb65ae7c..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_cornflower.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_cornflower" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_dandelion.json b/src/main/generated/assets/tiny-flowers/items/tiny_dandelion.json deleted file mode 100644 index 644d422f..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_dandelion.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_dandelion" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_garden.json b/src/main/generated/assets/tiny-flowers/items/tiny_garden.json deleted file mode 100644 index 572b9aa7..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_garden.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_garden" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_lily_of_the_valley.json b/src/main/generated/assets/tiny-flowers/items/tiny_lily_of_the_valley.json deleted file mode 100644 index e0590452..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_lily_of_the_valley.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_lily_of_the_valley" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_open_eyeblossom.json b/src/main/generated/assets/tiny-flowers/items/tiny_open_eyeblossom.json deleted file mode 100644 index f77402c6..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_open_eyeblossom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_open_eyeblossom" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_orange_tulip.json b/src/main/generated/assets/tiny-flowers/items/tiny_orange_tulip.json deleted file mode 100644 index 185936d9..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_orange_tulip.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_orange_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_oxeye_daisy.json b/src/main/generated/assets/tiny-flowers/items/tiny_oxeye_daisy.json deleted file mode 100644 index a8af7aae..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_oxeye_daisy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_oxeye_daisy" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_pink_tulip.json b/src/main/generated/assets/tiny-flowers/items/tiny_pink_tulip.json deleted file mode 100644 index 1aa10c2f..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_pink_tulip.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_pink_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_poppy.json b/src/main/generated/assets/tiny-flowers/items/tiny_poppy.json deleted file mode 100644 index 8c6b3a31..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_poppy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_poppy" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_red_tulip.json b/src/main/generated/assets/tiny-flowers/items/tiny_red_tulip.json deleted file mode 100644 index 0a886edc..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_red_tulip.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_red_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_torchflower.json b/src/main/generated/assets/tiny-flowers/items/tiny_torchflower.json deleted file mode 100644 index 7a54f12f..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_torchflower.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_torchflower" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_white_tulip.json b/src/main/generated/assets/tiny-flowers/items/tiny_white_tulip.json deleted file mode 100644 index 339a81d6..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_white_tulip.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_white_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/items/tiny_wither_rose.json b/src/main/generated/assets/tiny-flowers/items/tiny_wither_rose.json deleted file mode 100644 index ad7c606a..00000000 --- a/src/main/generated/assets/tiny-flowers/items/tiny_wither_rose.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "tiny-flowers:item/tiny_wither_rose" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_1.json b/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_1.json deleted file mode 100644 index 17c254cb..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_leaf_litter_1", - "textures": { - "flowerbed": "minecraft:block/leaf_litter", - "particle": "minecraft:block/leaf_litter" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_2.json b/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_2.json deleted file mode 100644 index 979617f2..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_leaf_litter_2", - "textures": { - "flowerbed": "minecraft:block/leaf_litter", - "particle": "minecraft:block/leaf_litter" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_3.json b/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_3.json deleted file mode 100644 index eebc6d92..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_leaf_litter_3", - "textures": { - "flowerbed": "minecraft:block/leaf_litter", - "particle": "minecraft:block/leaf_litter" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_4.json b/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_4.json deleted file mode 100644 index cd670a32..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/leaf_litter_4.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_leaf_litter_4", - "textures": { - "flowerbed": "minecraft:block/leaf_litter", - "particle": "minecraft:block/leaf_litter" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_1.json deleted file mode 100644 index 1294b413..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_allium", - "particle": "tiny-flowers:block/tiny_allium", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_2.json deleted file mode 100644 index d499fc09..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_allium", - "particle": "tiny-flowers:block/tiny_allium", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_3.json deleted file mode 100644 index 2c7fad46..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_allium", - "particle": "tiny-flowers:block/tiny_allium", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_4.json deleted file mode 100644 index 248c53e1..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_allium_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_allium", - "particle": "tiny-flowers:block/tiny_allium", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_1.json deleted file mode 100644 index 2fe2cfef..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_azure_bluet", - "particle": "tiny-flowers:block/tiny_azure_bluet", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_2.json deleted file mode 100644 index f25f3f26..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_azure_bluet", - "particle": "tiny-flowers:block/tiny_azure_bluet", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_3.json deleted file mode 100644 index 08501302..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_azure_bluet", - "particle": "tiny-flowers:block/tiny_azure_bluet", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_4.json deleted file mode 100644 index 4693fe1b..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_azure_bluet_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_azure_bluet", - "particle": "tiny-flowers:block/tiny_azure_bluet", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_1.json deleted file mode 100644 index 4c553467..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_1.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_blue_orchid", - "flowerbed_upper": "tiny-flowers:block/tiny_blue_orchid_upper", - "particle": "tiny-flowers:block/tiny_blue_orchid", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_2.json deleted file mode 100644 index f53331f0..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_2.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_blue_orchid", - "flowerbed_upper": "tiny-flowers:block/tiny_blue_orchid_upper", - "particle": "tiny-flowers:block/tiny_blue_orchid", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_3.json deleted file mode 100644 index dadd0a2f..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_3.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_blue_orchid", - "flowerbed_upper": "tiny-flowers:block/tiny_blue_orchid_upper", - "particle": "tiny-flowers:block/tiny_blue_orchid", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_4.json deleted file mode 100644 index f7694c92..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_blue_orchid_4.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_blue_orchid", - "flowerbed_upper": "tiny-flowers:block/tiny_blue_orchid_upper", - "particle": "tiny-flowers:block/tiny_blue_orchid", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_1.json deleted file mode 100644 index d22ed784..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_low_untinted_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cactus_flower", - "particle": "tiny-flowers:block/tiny_cactus_flower", - "stem": "tiny-flowers:block/tiny_cactus_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_2.json deleted file mode 100644 index 14f3239b..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_low_untinted_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cactus_flower", - "particle": "tiny-flowers:block/tiny_cactus_flower", - "stem": "tiny-flowers:block/tiny_cactus_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_3.json deleted file mode 100644 index 235142d1..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_low_untinted_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cactus_flower", - "particle": "tiny-flowers:block/tiny_cactus_flower", - "stem": "tiny-flowers:block/tiny_cactus_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_4.json deleted file mode 100644 index bcf0b72b..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cactus_flower_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_low_untinted_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cactus_flower", - "particle": "tiny-flowers:block/tiny_cactus_flower", - "stem": "tiny-flowers:block/tiny_cactus_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_1.json deleted file mode 100644 index 6bf3ab49..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_closed_eyeblossom", - "particle": "tiny-flowers:block/tiny_closed_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_2.json deleted file mode 100644 index 3122c952..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_closed_eyeblossom", - "particle": "tiny-flowers:block/tiny_closed_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_3.json deleted file mode 100644 index eade8ffc..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_closed_eyeblossom", - "particle": "tiny-flowers:block/tiny_closed_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_4.json deleted file mode 100644 index 5f7f52b1..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_closed_eyeblossom_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_closed_eyeblossom", - "particle": "tiny-flowers:block/tiny_closed_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_1.json deleted file mode 100644 index 31968aa3..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cornflower", - "particle": "tiny-flowers:block/tiny_cornflower", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_2.json deleted file mode 100644 index 58663d34..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cornflower", - "particle": "tiny-flowers:block/tiny_cornflower", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_3.json deleted file mode 100644 index b89616d8..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cornflower", - "particle": "tiny-flowers:block/tiny_cornflower", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_4.json deleted file mode 100644 index f3b04565..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_cornflower_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_cornflower", - "particle": "tiny-flowers:block/tiny_cornflower", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_1.json deleted file mode 100644 index 957001d9..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_dandelion", - "particle": "tiny-flowers:block/tiny_dandelion", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_2.json deleted file mode 100644 index b6313dac..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_dandelion", - "particle": "tiny-flowers:block/tiny_dandelion", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_3.json deleted file mode 100644 index f6d98e19..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_dandelion", - "particle": "tiny-flowers:block/tiny_dandelion", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_4.json deleted file mode 100644 index 00b6e9eb..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_dandelion_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_dandelion", - "particle": "tiny-flowers:block/tiny_dandelion", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_1.json deleted file mode 100644 index 4e9a1eff..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_1.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_lily_of_the_valley", - "flowerbed_upper": "tiny-flowers:block/tiny_lily_of_the_valley_upper", - "particle": "tiny-flowers:block/tiny_lily_of_the_valley", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_2.json deleted file mode 100644 index 410bd9ee..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_2.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_lily_of_the_valley", - "flowerbed_upper": "tiny-flowers:block/tiny_lily_of_the_valley_upper", - "particle": "tiny-flowers:block/tiny_lily_of_the_valley", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_3.json deleted file mode 100644 index b3557063..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_3.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_lily_of_the_valley", - "flowerbed_upper": "tiny-flowers:block/tiny_lily_of_the_valley_upper", - "particle": "tiny-flowers:block/tiny_lily_of_the_valley", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_4.json deleted file mode 100644 index 3a58b0da..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_lily_of_the_valley_4.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_lily_of_the_valley", - "flowerbed_upper": "tiny-flowers:block/tiny_lily_of_the_valley_upper", - "particle": "tiny-flowers:block/tiny_lily_of_the_valley", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_1.json deleted file mode 100644 index ecc1dc7d..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_1.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_untinted_glow_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_open_eyeblossom", - "flowerbed_upper": "tiny-flowers:block/tiny_open_eyeblossom_upper", - "particle": "tiny-flowers:block/tiny_open_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_2.json deleted file mode 100644 index 6e3c376d..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_2.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_untinted_glow_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_open_eyeblossom", - "flowerbed_upper": "tiny-flowers:block/tiny_open_eyeblossom_upper", - "particle": "tiny-flowers:block/tiny_open_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_3.json deleted file mode 100644 index a833f369..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_3.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_untinted_glow_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_open_eyeblossom", - "flowerbed_upper": "tiny-flowers:block/tiny_open_eyeblossom_upper", - "particle": "tiny-flowers:block/tiny_open_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_4.json deleted file mode 100644 index e3a7334f..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_open_eyeblossom_4.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_double_untinted_glow_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_open_eyeblossom", - "flowerbed_upper": "tiny-flowers:block/tiny_open_eyeblossom_upper", - "particle": "tiny-flowers:block/tiny_open_eyeblossom", - "stem": "tiny-flowers:block/tiny_eyeblossom_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_1.json deleted file mode 100644 index 81c135fb..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_orange_tulip", - "particle": "tiny-flowers:block/tiny_orange_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_2.json deleted file mode 100644 index 61b06060..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_orange_tulip", - "particle": "tiny-flowers:block/tiny_orange_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_3.json deleted file mode 100644 index d987d8d7..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_orange_tulip", - "particle": "tiny-flowers:block/tiny_orange_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_4.json deleted file mode 100644 index a3ce6322..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_orange_tulip_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_orange_tulip", - "particle": "tiny-flowers:block/tiny_orange_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_1.json deleted file mode 100644 index d3ab6c5b..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_oxeye_daisy", - "particle": "tiny-flowers:block/tiny_oxeye_daisy", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_2.json deleted file mode 100644 index 9812659f..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_oxeye_daisy", - "particle": "tiny-flowers:block/tiny_oxeye_daisy", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_3.json deleted file mode 100644 index 7238d5e6..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_oxeye_daisy", - "particle": "tiny-flowers:block/tiny_oxeye_daisy", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_4.json deleted file mode 100644 index e7d17e02..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_oxeye_daisy_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_oxeye_daisy", - "particle": "tiny-flowers:block/tiny_oxeye_daisy", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_1.json deleted file mode 100644 index a88c22f8..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_pink_tulip", - "particle": "tiny-flowers:block/tiny_pink_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_2.json deleted file mode 100644 index 1c533a28..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_pink_tulip", - "particle": "tiny-flowers:block/tiny_pink_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_3.json deleted file mode 100644 index d016e904..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_pink_tulip", - "particle": "tiny-flowers:block/tiny_pink_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_4.json deleted file mode 100644 index 466d99b3..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_pink_tulip_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_pink_tulip", - "particle": "tiny-flowers:block/tiny_pink_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_1.json deleted file mode 100644 index dae732fa..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_tall_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_poppy", - "particle": "tiny-flowers:block/tiny_poppy", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_2.json deleted file mode 100644 index 7b00f29a..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_tall_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_poppy", - "particle": "tiny-flowers:block/tiny_poppy", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_3.json deleted file mode 100644 index 0508ab3a..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_tall_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_poppy", - "particle": "tiny-flowers:block/tiny_poppy", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_4.json deleted file mode 100644 index 86bc10f0..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_poppy_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_tall_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_poppy", - "particle": "tiny-flowers:block/tiny_poppy", - "stem": "tiny-flowers:block/tall_tiny_flower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_1.json deleted file mode 100644 index 679fbe99..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_red_tulip", - "particle": "tiny-flowers:block/tiny_red_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_2.json deleted file mode 100644 index 4d50ded3..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_red_tulip", - "particle": "tiny-flowers:block/tiny_red_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_3.json deleted file mode 100644 index 0ba8d962..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_red_tulip", - "particle": "tiny-flowers:block/tiny_red_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_4.json deleted file mode 100644 index acc50ac4..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_red_tulip_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_red_tulip", - "particle": "tiny-flowers:block/tiny_red_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_1.json deleted file mode 100644 index 8a35aa5b..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_1.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_triple_untinted_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_torchflower", - "flowerbed_middle": "tiny-flowers:block/tiny_torchflower_middle", - "flowerbed_upper": "tiny-flowers:block/tiny_torchflower_upper", - "particle": "tiny-flowers:block/tiny_torchflower", - "stem": "tiny-flowers:block/tiny_torchflower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_2.json deleted file mode 100644 index 9a037be5..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_2.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_triple_untinted_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_torchflower", - "flowerbed_middle": "tiny-flowers:block/tiny_torchflower_middle", - "flowerbed_upper": "tiny-flowers:block/tiny_torchflower_upper", - "particle": "tiny-flowers:block/tiny_torchflower", - "stem": "tiny-flowers:block/tiny_torchflower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_3.json deleted file mode 100644 index 5730c6f9..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_3.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_triple_untinted_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_torchflower", - "flowerbed_middle": "tiny-flowers:block/tiny_torchflower_middle", - "flowerbed_upper": "tiny-flowers:block/tiny_torchflower_upper", - "particle": "tiny-flowers:block/tiny_torchflower", - "stem": "tiny-flowers:block/tiny_torchflower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_4.json deleted file mode 100644 index 8869624a..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_torchflower_4.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_triple_untinted_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_torchflower", - "flowerbed_middle": "tiny-flowers:block/tiny_torchflower_middle", - "flowerbed_upper": "tiny-flowers:block/tiny_torchflower_upper", - "particle": "tiny-flowers:block/tiny_torchflower", - "stem": "tiny-flowers:block/tiny_torchflower_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_1.json deleted file mode 100644 index 1944cb05..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_white_tulip", - "particle": "tiny-flowers:block/tiny_white_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_2.json deleted file mode 100644 index c6bc5eba..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_white_tulip", - "particle": "tiny-flowers:block/tiny_white_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_3.json deleted file mode 100644 index 9ba3fdc8..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_white_tulip", - "particle": "tiny-flowers:block/tiny_white_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_4.json deleted file mode 100644 index 3a2eed7e..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_white_tulip_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_white_tulip", - "particle": "tiny-flowers:block/tiny_white_tulip", - "stem": "minecraft:block/pink_petals_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_1.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_1.json deleted file mode 100644 index 93b9e7ab..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_1", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_wither_rose", - "particle": "tiny-flowers:block/tiny_wither_rose", - "stem": "tiny-flowers:block/tiny_wither_rose_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_2.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_2.json deleted file mode 100644 index ebdaab25..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_2", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_wither_rose", - "particle": "tiny-flowers:block/tiny_wither_rose", - "stem": "tiny-flowers:block/tiny_wither_rose_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_3.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_3.json deleted file mode 100644 index f0bb2b7a..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_3", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_wither_rose", - "particle": "tiny-flowers:block/tiny_wither_rose", - "stem": "tiny-flowers:block/tiny_wither_rose_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_4.json b/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_4.json deleted file mode 100644 index 095b9e49..00000000 --- a/src/main/generated/assets/tiny-flowers/models/block/tiny_wither_rose_4.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "tiny-flowers:block/garden_untinted_4", - "textures": { - "flowerbed": "tiny-flowers:block/tiny_wither_rose", - "particle": "tiny-flowers:block/tiny_wither_rose", - "stem": "tiny-flowers:block/tiny_wither_rose_stem" - } -} \ No newline at end of file diff --git a/src/main/generated/assets/tiny-flowers/models/item/florists_shears.json b/src/main/generated/assets/tiny-flowers/models/item/florists_shears.json deleted file mode 100644 index c647f425..00000000 --- a/src/main/generated/assets/tiny-flowers/models/item/florists_shears.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "tiny-flowers:item/florists_shears", - "layer1": "tiny-flowers:item/florists_shears_handle" - } -} \ No newline at end of file diff --git a/src/main/generated/data/c/tags/item/tools/shear.json b/src/main/generated/data/c/tags/item/tools/shear.json deleted file mode 100644 index 428553ca..00000000 --- a/src/main/generated/data/c/tags/item/tools/shear.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "tiny-flowers:florists_shears" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/block/flowers.json b/src/main/generated/data/minecraft/tags/block/flowers.json deleted file mode 100644 index cc4ba250..00000000 --- a/src/main/generated/data/minecraft/tags/block/flowers.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "tiny-flowers:tiny_garden" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/block/inside_step_sound_blocks.json b/src/main/generated/data/minecraft/tags/block/inside_step_sound_blocks.json deleted file mode 100644 index cc4ba250..00000000 --- a/src/main/generated/data/minecraft/tags/block/inside_step_sound_blocks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "tiny-flowers:tiny_garden" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/block/sword_efficient.json b/src/main/generated/data/minecraft/tags/block/sword_efficient.json deleted file mode 100644 index cc4ba250..00000000 --- a/src/main/generated/data/minecraft/tags/block/sword_efficient.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "tiny-flowers:tiny_garden" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/item/bee_food.json b/src/main/generated/data/minecraft/tags/item/bee_food.json deleted file mode 100644 index 07d9aa27..00000000 --- a/src/main/generated/data/minecraft/tags/item/bee_food.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#tiny-flowers:tiny_flowers" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_blue_orchid.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_blue_orchid.json deleted file mode 100644 index 3e35f1ed..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_blue_orchid.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_blue_orchid" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_blue_orchid" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_cactus_flower.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_cactus_flower.json deleted file mode 100644 index 31671a05..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_cactus_flower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_cactus_flower" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_cactus_flower" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_closed_eyeblossom.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_closed_eyeblossom.json deleted file mode 100644 index e7c0ad28..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_closed_eyeblossom.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_closed_eyeblossom" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_closed_eyeblossom" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_cornflower.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_cornflower.json deleted file mode 100644 index 2ca13d74..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_cornflower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_cornflower" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_cornflower" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_dandelion.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_dandelion.json deleted file mode 100644 index 11fa7a2a..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_dandelion.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_dandelion" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_dandelion" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_lily_of_the_valley.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_lily_of_the_valley.json deleted file mode 100644 index d1d3ab99..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_lily_of_the_valley.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_lily_of_the_valley" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_lily_of_the_valley" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_open_eyeblossom.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_open_eyeblossom.json deleted file mode 100644 index b7757063..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_open_eyeblossom.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_open_eyeblossom" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_open_eyeblossom" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_orange_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_orange_tulip.json deleted file mode 100644 index afcd5c9b..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_orange_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_orange_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_orange_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_oxeye_daisy.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_oxeye_daisy.json deleted file mode 100644 index 6e90ba29..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_oxeye_daisy.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_oxeye_daisy" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_oxeye_daisy" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_pink_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_pink_tulip.json deleted file mode 100644 index 7b44caa5..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_pink_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_pink_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_pink_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_poppy.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_poppy.json deleted file mode 100644 index 9d2ad086..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_poppy.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_poppy" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_poppy" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_red_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_red_tulip.json deleted file mode 100644 index 0308d2a2..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_red_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_red_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_red_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_torchflower.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_torchflower.json deleted file mode 100644 index 93557ba3..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_torchflower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_torchflower" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_torchflower" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_white_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_white_tulip.json deleted file mode 100644 index ef52152f..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_white_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_white_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_white_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_wither_rose.json b/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_wither_rose.json deleted file mode 100644 index 11c8b92b..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/decorations/tiny_wither_rose.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_florists_shears": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:florists_shears" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:tiny_wither_rose" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_florists_shears" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:tiny_wither_rose" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_allium.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_allium.json deleted file mode 100644 index d48e5fd1..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_allium.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_allium" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_allium": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_allium" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_allium" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_allium" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_azure_bluet.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_azure_bluet.json deleted file mode 100644 index ab613073..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_azure_bluet.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_azure_bluet" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_azure_bluet": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_azure_bluet" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_azure_bluet" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_azure_bluet" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_blue_orchid.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_blue_orchid.json deleted file mode 100644 index b21829d1..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_blue_orchid.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_blue_orchid" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_blue_orchid": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_blue_orchid" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_blue_orchid" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_blue_orchid" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_closed_eyeblossom.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_closed_eyeblossom.json deleted file mode 100644 index 323817c4..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_closed_eyeblossom.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_closed_eyeblossom" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_closed_eyeblossom": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_closed_eyeblossom" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_closed_eyeblossom" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_closed_eyeblossom" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_cornflower.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_cornflower.json deleted file mode 100644 index 7aac09f4..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_cornflower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_cornflower" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_cornflower": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_cornflower" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_cornflower" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_cornflower" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_dandelion.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_dandelion.json deleted file mode 100644 index 3749c172..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_dandelion.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_dandelion" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_dandelion": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_dandelion" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_dandelion" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_dandelion" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_lily_of_the_valley.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_lily_of_the_valley.json deleted file mode 100644 index 2d178e9f..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_lily_of_the_valley.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_lily_of_the_valley" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_lily_of_the_valley": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_lily_of_the_valley" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_lily_of_the_valley" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_lily_of_the_valley" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_open_eyeblossom.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_open_eyeblossom.json deleted file mode 100644 index 51a27194..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_open_eyeblossom.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_open_eyeblossom" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_open_eyeblossom": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_open_eyeblossom" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_open_eyeblossom" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_open_eyeblossom" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_orange_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_orange_tulip.json deleted file mode 100644 index ba679791..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_orange_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_orange_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_orange_tulip": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_orange_tulip" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_orange_tulip" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_orange_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_oxeye_daisy.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_oxeye_daisy.json deleted file mode 100644 index c3149266..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_oxeye_daisy.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_oxeye_daisy" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_oxeye_daisy": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_oxeye_daisy" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_oxeye_daisy" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_oxeye_daisy" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_pink_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_pink_tulip.json deleted file mode 100644 index 6d0e97d3..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_pink_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_pink_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_pink_tulip": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_pink_tulip" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_pink_tulip" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_pink_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_poppy.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_poppy.json deleted file mode 100644 index cbb543cc..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_poppy.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_poppy" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_poppy": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_poppy" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_poppy" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_poppy" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_red_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_red_tulip.json deleted file mode 100644 index 0f53928f..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_red_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_red_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_red_tulip": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_red_tulip" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_red_tulip" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_red_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_torchflower.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_torchflower.json deleted file mode 100644 index 6485b668..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_torchflower.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_torchflower" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_torchflower": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_torchflower" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_torchflower" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_torchflower" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_white_tulip.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_white_tulip.json deleted file mode 100644 index ebd09a39..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_white_tulip.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_white_tulip" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_white_tulip": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_white_tulip" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_white_tulip" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_white_tulip" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_wither_rose.json b/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_wither_rose.json deleted file mode 100644 index cea41375..00000000 --- a/src/main/generated/data/tiny-flowers/advancement/recipes/food/suspicious_stew_from_tiny_wither_rose.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "tiny-flowers:suspicious_stew_from_tiny_wither_rose" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_tiny_wither_rose": { - "conditions": { - "items": [ - { - "items": "tiny-flowers:tiny_wither_rose" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_tiny_wither_rose" - ] - ], - "rewards": { - "recipes": [ - "tiny-flowers:suspicious_stew_from_tiny_wither_rose" - ] - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/loot_table/blocks/tiny_garden.json b/src/main/generated/data/tiny-flowers/loot_table/blocks/tiny_garden.json deleted file mode 100644 index e5ee57ae..00000000 --- a/src/main/generated/data/tiny-flowers/loot_table/blocks/tiny_garden.json +++ /dev/null @@ -1,1525 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "pink_petals" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:pink_petals" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "pink_petals" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:pink_petals" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "pink_petals" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:pink_petals" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "pink_petals" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:pink_petals" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "wildflowers" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:wildflowers" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "wildflowers" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:wildflowers" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "wildflowers" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:wildflowers" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "wildflowers" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:wildflowers" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "leaf_litter" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:leaf_litter" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "leaf_litter" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:leaf_litter" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "leaf_litter" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:leaf_litter" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "leaf_litter" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:leaf_litter" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "dandelion" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_dandelion" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "dandelion" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_dandelion" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "dandelion" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_dandelion" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "dandelion" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_dandelion" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "poppy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_poppy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "poppy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_poppy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "poppy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_poppy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "poppy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_poppy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "blue_orchid" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_blue_orchid" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "blue_orchid" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_blue_orchid" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "blue_orchid" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_blue_orchid" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "blue_orchid" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_blue_orchid" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "allium" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_allium" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "allium" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_allium" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "allium" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_allium" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "allium" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_allium" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "azure_bluet" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_azure_bluet" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "azure_bluet" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_azure_bluet" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "azure_bluet" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_azure_bluet" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "azure_bluet" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_azure_bluet" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "red_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_red_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "red_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_red_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "red_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_red_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "red_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_red_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "orange_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_orange_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "orange_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_orange_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "orange_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_orange_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "orange_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_orange_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "white_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_white_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "white_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_white_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "white_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_white_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "white_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_white_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "pink_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_pink_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "pink_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_pink_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "pink_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_pink_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "pink_tulip" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_pink_tulip" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "oxeye_daisy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_oxeye_daisy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "oxeye_daisy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_oxeye_daisy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "oxeye_daisy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_oxeye_daisy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "oxeye_daisy" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_oxeye_daisy" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "cornflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cornflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "cornflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cornflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "cornflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cornflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "cornflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cornflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "lily_of_the_valley" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_lily_of_the_valley" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "lily_of_the_valley" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_lily_of_the_valley" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "lily_of_the_valley" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_lily_of_the_valley" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "lily_of_the_valley" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_lily_of_the_valley" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "torchflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_torchflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "torchflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_torchflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "torchflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_torchflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "torchflower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_torchflower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "closed_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_closed_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "closed_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_closed_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "closed_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_closed_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "closed_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_closed_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "open_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_open_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "open_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_open_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "open_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_open_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "open_eyeblossom" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_open_eyeblossom" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "wither_rose" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_wither_rose" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "wither_rose" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_wither_rose" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "wither_rose" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_wither_rose" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "wither_rose" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_wither_rose" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_1": "cactus_flower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cactus_flower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_2": "cactus_flower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cactus_flower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_3": "cactus_flower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cactus_flower" - } - ], - "rolls": 1.0 - }, - { - "bonus_rolls": 0.0, - "conditions": [ - { - "block": "tiny-flowers:tiny_garden", - "condition": "minecraft:block_state_property", - "properties": { - "flower_variant_4": "cactus_flower" - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "tiny-flowers:tiny_cactus_flower" - } - ], - "rolls": 1.0 - } - ] -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_allium.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_allium.json deleted file mode 100644 index 3b17a760..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_allium.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_allium", - "tiny-flowers:tiny_allium" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 60, - "id": "minecraft:fire_resistance" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_azure_bluet.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_azure_bluet.json deleted file mode 100644 index 28daa065..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_azure_bluet.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_azure_bluet", - "tiny-flowers:tiny_azure_bluet" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 220, - "id": "minecraft:blindness" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_blue_orchid.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_blue_orchid.json deleted file mode 100644 index 2af3d412..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_blue_orchid.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_blue_orchid", - "tiny-flowers:tiny_blue_orchid" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 7, - "id": "minecraft:saturation" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_closed_eyeblossom.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_closed_eyeblossom.json deleted file mode 100644 index ced1338c..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_closed_eyeblossom.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_closed_eyeblossom", - "tiny-flowers:tiny_closed_eyeblossom" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:nausea" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_cornflower.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_cornflower.json deleted file mode 100644 index 73ef920c..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_cornflower.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_cornflower", - "tiny-flowers:tiny_cornflower" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 100, - "id": "minecraft:jump_boost" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_dandelion.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_dandelion.json deleted file mode 100644 index 1a261c24..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_dandelion.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_dandelion", - "tiny-flowers:tiny_dandelion" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 7, - "id": "minecraft:saturation" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_lily_of_the_valley.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_lily_of_the_valley.json deleted file mode 100644 index c018fd08..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_lily_of_the_valley.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_lily_of_the_valley", - "tiny-flowers:tiny_lily_of_the_valley" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 220, - "id": "minecraft:poison" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_open_eyeblossom.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_open_eyeblossom.json deleted file mode 100644 index 982c2768..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_open_eyeblossom.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_open_eyeblossom", - "tiny-flowers:tiny_open_eyeblossom" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 220, - "id": "minecraft:blindness" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_orange_tulip.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_orange_tulip.json deleted file mode 100644 index e03ad161..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_orange_tulip.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_orange_tulip", - "tiny-flowers:tiny_orange_tulip" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:weakness" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_oxeye_daisy.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_oxeye_daisy.json deleted file mode 100644 index 3a5c9679..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_oxeye_daisy.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_oxeye_daisy", - "tiny-flowers:tiny_oxeye_daisy" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:regeneration" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_pink_tulip.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_pink_tulip.json deleted file mode 100644 index 1e96594c..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_pink_tulip.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_pink_tulip", - "tiny-flowers:tiny_pink_tulip" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:weakness" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_poppy.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_poppy.json deleted file mode 100644 index 4b02a856..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_poppy.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_poppy", - "tiny-flowers:tiny_poppy" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 100, - "id": "minecraft:night_vision" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_red_tulip.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_red_tulip.json deleted file mode 100644 index 4f4f34ad..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_red_tulip.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_red_tulip", - "tiny-flowers:tiny_red_tulip" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:weakness" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_torchflower.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_torchflower.json deleted file mode 100644 index e5e76299..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_torchflower.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_torchflower", - "tiny-flowers:tiny_torchflower" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 100, - "id": "minecraft:night_vision" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_white_tulip.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_white_tulip.json deleted file mode 100644 index 34f8dc43..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_white_tulip.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_white_tulip", - "tiny-flowers:tiny_white_tulip" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:weakness" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_wither_rose.json b/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_wither_rose.json deleted file mode 100644 index e0efdd5c..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/suspicious_stew_from_tiny_wither_rose.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "suspicious_stew", - "ingredients": [ - "minecraft:bowl", - "minecraft:brown_mushroom", - "minecraft:red_mushroom", - "tiny-flowers:tiny_wither_rose", - "tiny-flowers:tiny_wither_rose" - ], - "result": { - "components": { - "minecraft:suspicious_stew_effects": [ - { - "duration": 140, - "id": "minecraft:wither" - } - ] - }, - "count": 1, - "id": "minecraft:suspicious_stew" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_allium.json b/src/main/generated/data/tiny-flowers/recipe/tiny_allium.json deleted file mode 100644 index ced7e252..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_allium.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:allium" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_allium" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_azure_bluet.json b/src/main/generated/data/tiny-flowers/recipe/tiny_azure_bluet.json deleted file mode 100644 index 296f0959..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_azure_bluet.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:azure_bluet" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_azure_bluet" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_blue_orchid.json b/src/main/generated/data/tiny-flowers/recipe/tiny_blue_orchid.json deleted file mode 100644 index 0f44543d..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_blue_orchid.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:blue_orchid" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_blue_orchid" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_cactus_flower.json b/src/main/generated/data/tiny-flowers/recipe/tiny_cactus_flower.json deleted file mode 100644 index a26e302a..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_cactus_flower.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:cactus_flower" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_cactus_flower" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_closed_eyeblossom.json b/src/main/generated/data/tiny-flowers/recipe/tiny_closed_eyeblossom.json deleted file mode 100644 index 2f007901..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_closed_eyeblossom.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:closed_eyeblossom" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_closed_eyeblossom" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_cornflower.json b/src/main/generated/data/tiny-flowers/recipe/tiny_cornflower.json deleted file mode 100644 index a0e96f1c..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_cornflower.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:cornflower" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_cornflower" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_dandelion.json b/src/main/generated/data/tiny-flowers/recipe/tiny_dandelion.json deleted file mode 100644 index 95e33f5b..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_dandelion.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:dandelion" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_dandelion" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_lily_of_the_valley.json b/src/main/generated/data/tiny-flowers/recipe/tiny_lily_of_the_valley.json deleted file mode 100644 index 891ca9d8..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_lily_of_the_valley.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:lily_of_the_valley" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_lily_of_the_valley" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_open_eyeblossom.json b/src/main/generated/data/tiny-flowers/recipe/tiny_open_eyeblossom.json deleted file mode 100644 index 212d270c..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_open_eyeblossom.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:open_eyeblossom" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_open_eyeblossom" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_orange_tulip.json b/src/main/generated/data/tiny-flowers/recipe/tiny_orange_tulip.json deleted file mode 100644 index e1e43bf4..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_orange_tulip.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:orange_tulip" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_orange_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_oxeye_daisy.json b/src/main/generated/data/tiny-flowers/recipe/tiny_oxeye_daisy.json deleted file mode 100644 index 2f210e92..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_oxeye_daisy.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:oxeye_daisy" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_oxeye_daisy" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_pink_tulip.json b/src/main/generated/data/tiny-flowers/recipe/tiny_pink_tulip.json deleted file mode 100644 index d58ed405..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_pink_tulip.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:pink_tulip" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_pink_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_poppy.json b/src/main/generated/data/tiny-flowers/recipe/tiny_poppy.json deleted file mode 100644 index 761da347..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_poppy.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:poppy" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_poppy" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_red_tulip.json b/src/main/generated/data/tiny-flowers/recipe/tiny_red_tulip.json deleted file mode 100644 index 863f8d23..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_red_tulip.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:red_tulip" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_red_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_torchflower.json b/src/main/generated/data/tiny-flowers/recipe/tiny_torchflower.json deleted file mode 100644 index 79ff5356..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_torchflower.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:torchflower" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_torchflower" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_white_tulip.json b/src/main/generated/data/tiny-flowers/recipe/tiny_white_tulip.json deleted file mode 100644 index 6e52b062..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_white_tulip.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:white_tulip" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_white_tulip" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/recipe/tiny_wither_rose.json b/src/main/generated/data/tiny-flowers/recipe/tiny_wither_rose.json deleted file mode 100644 index e388eeec..00000000 --- a/src/main/generated/data/tiny-flowers/recipe/tiny_wither_rose.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "group": "tiny_flowers", - "ingredients": [ - "tiny-flowers:florists_shears", - "minecraft:wither_rose" - ], - "result": { - "count": 4, - "id": "tiny-flowers:tiny_wither_rose" - } -} \ No newline at end of file diff --git a/src/main/generated/data/tiny-flowers/tags/item/tiny_flowers.json b/src/main/generated/data/tiny-flowers/tags/item/tiny_flowers.json deleted file mode 100644 index a0268500..00000000 --- a/src/main/generated/data/tiny-flowers/tags/item/tiny_flowers.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "values": [ - "minecraft:pink_petals", - "minecraft:wildflowers", - "minecraft:leaf_litter", - "tiny-flowers:tiny_dandelion", - "tiny-flowers:tiny_poppy", - "tiny-flowers:tiny_blue_orchid", - "tiny-flowers:tiny_allium", - "tiny-flowers:tiny_azure_bluet", - "tiny-flowers:tiny_red_tulip", - "tiny-flowers:tiny_orange_tulip", - "tiny-flowers:tiny_white_tulip", - "tiny-flowers:tiny_pink_tulip", - "tiny-flowers:tiny_oxeye_daisy", - "tiny-flowers:tiny_cornflower", - "tiny-flowers:tiny_lily_of_the_valley", - "tiny-flowers:tiny_torchflower", - "tiny-flowers:tiny_closed_eyeblossom", - "tiny-flowers:tiny_open_eyeblossom", - "tiny-flowers:tiny_wither_rose", - "tiny-flowers:tiny_cactus_flower" - ] -} \ No newline at end of file diff --git a/src/main/java/co/secretonline/tinyflowers/TinyFlowers.java b/src/main/java/co/secretonline/tinyflowers/TinyFlowers.java deleted file mode 100644 index 69d47ff6..00000000 --- a/src/main/java/co/secretonline/tinyflowers/TinyFlowers.java +++ /dev/null @@ -1,27 +0,0 @@ -package co.secretonline.tinyflowers; - -import net.fabricmc.api.ModInitializer; -import net.minecraft.resources.Identifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import co.secretonline.tinyflowers.blocks.ModBlocks; -import co.secretonline.tinyflowers.components.ModComponents; -import co.secretonline.tinyflowers.items.ModItems; - -public class TinyFlowers implements ModInitializer { - public static final String MOD_ID = "tiny-flowers"; - - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - - public static Identifier id(String path) { - return Identifier.fromNamespaceAndPath(MOD_ID, path); - } - - @Override - public void onInitialize() { - ModComponents.initialize(); - ModBlocks.initialize(); - ModItems.initialize(); - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/blocks/FlowerVariant.java b/src/main/java/co/secretonline/tinyflowers/blocks/FlowerVariant.java deleted file mode 100644 index 12fe2749..00000000 --- a/src/main/java/co/secretonline/tinyflowers/blocks/FlowerVariant.java +++ /dev/null @@ -1,197 +0,0 @@ -package co.secretonline.tinyflowers.blocks; - -import org.jetbrains.annotations.Nullable; - -import com.mojang.serialization.Codec; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.Identifier; -import net.minecraft.util.Mth; -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.component.SuspiciousStewEffects; -import net.minecraft.world.item.component.SuspiciousStewEffects.Entry; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SuspiciousEffectHolder; -import co.secretonline.tinyflowers.TinyFlowers; - -public enum FlowerVariant implements StringRepresentable, ItemLike, SuspiciousEffectHolder { - EMPTY("empty", false, null, null), - PINK_PETALS("pink_petals", false, - Identifier.withDefaultNamespace("pink_petals"), Identifier.withDefaultNamespace("pink_petals")), - WILDFLOWERS("wildflowers", false, - Identifier.withDefaultNamespace("wildflowers"), Identifier.withDefaultNamespace("wildflowers")), - LEAF_LITTER("leaf_litter", false, - Identifier.withDefaultNamespace("leaf_litter"), Identifier.withDefaultNamespace("leaf_litter")), - DANDELION("dandelion", true, - TinyFlowers.id("tiny_dandelion"), Identifier.withDefaultNamespace("dandelion"), - new Entry(MobEffects.SATURATION, toTicks(0.35f))), - POPPY("poppy", true, - TinyFlowers.id("tiny_poppy"), Identifier.withDefaultNamespace("poppy"), - new Entry(MobEffects.NIGHT_VISION, toTicks(5.0f))), - BLUE_ORCHID("blue_orchid", true, - TinyFlowers.id("tiny_blue_orchid"), Identifier.withDefaultNamespace("blue_orchid"), - new Entry(MobEffects.SATURATION, toTicks(0.35f))), - ALLIUM("allium", true, - TinyFlowers.id("tiny_allium"), Identifier.withDefaultNamespace("allium"), - new Entry(MobEffects.FIRE_RESISTANCE, toTicks(3.0f))), - AZURE_BLUET("azure_bluet", true, - TinyFlowers.id("tiny_azure_bluet"), Identifier.withDefaultNamespace("azure_bluet"), - new Entry(MobEffects.BLINDNESS, toTicks(11.0f))), - RED_TULIP("red_tulip", true, - TinyFlowers.id("tiny_red_tulip"), Identifier.withDefaultNamespace("red_tulip"), - new Entry(MobEffects.WEAKNESS, toTicks(7.0f))), - ORANGE_TULIP("orange_tulip", true, - TinyFlowers.id("tiny_orange_tulip"), Identifier.withDefaultNamespace("orange_tulip"), - new Entry(MobEffects.WEAKNESS, toTicks(7.0f))), - WHITE_TULIP("white_tulip", true, - TinyFlowers.id("tiny_white_tulip"), Identifier.withDefaultNamespace("white_tulip"), - new Entry(MobEffects.WEAKNESS, toTicks(7.0f))), - PINK_TULIP("pink_tulip", true, - TinyFlowers.id("tiny_pink_tulip"), Identifier.withDefaultNamespace("pink_tulip"), - new Entry(MobEffects.WEAKNESS, toTicks(7.0f))), - OXEYE_DAISY("oxeye_daisy", true, - TinyFlowers.id("tiny_oxeye_daisy"), Identifier.withDefaultNamespace("oxeye_daisy"), - new Entry(MobEffects.REGENERATION, toTicks(7.0f))), - CORNFLOWER("cornflower", true, - TinyFlowers.id("tiny_cornflower"), Identifier.withDefaultNamespace("cornflower"), - new Entry(MobEffects.JUMP_BOOST, toTicks(5.0f))), - LILY_OF_THE_VALLEY("lily_of_the_valley", true, - TinyFlowers.id("tiny_lily_of_the_valley"), Identifier.withDefaultNamespace("lily_of_the_valley"), - new Entry(MobEffects.POISON, toTicks(11.0f))), - TORCHFLOWER("torchflower", true, - TinyFlowers.id("tiny_torchflower"), Identifier.withDefaultNamespace("torchflower"), - new Entry(MobEffects.NIGHT_VISION, toTicks(5.0f))), - CLOSED_EYEBLOSSOM("closed_eyeblossom", true, - TinyFlowers.id("tiny_closed_eyeblossom"), Identifier.withDefaultNamespace("closed_eyeblossom"), - new Entry(MobEffects.NAUSEA, toTicks(7.0f))), - OPEN_EYEBLOSSOM("open_eyeblossom", true, - TinyFlowers.id("tiny_open_eyeblossom"), Identifier.withDefaultNamespace("open_eyeblossom"), - new Entry(MobEffects.BLINDNESS, toTicks(11.0f))), - WITHER_ROSE("wither_rose", true, - TinyFlowers.id("tiny_wither_rose"), Identifier.withDefaultNamespace("wither_rose"), - new Entry(MobEffects.WITHER, toTicks(7.0f))), - CACTUS_FLOWER("cactus_flower", true, - TinyFlowers.id("tiny_cactus_flower"), Identifier.withDefaultNamespace("cactus_flower")); - - private final String name; - /** - * The identifier of the BlockItem this variant corresponds to. - * For Segmented blocks, this is the ID of the vanilla block. - * For items that are added by this mod, this is a mod-specific ID. - *

- * It would be nice to refer to the RegistryEntry directly, but that causes a - * circular initialisation loop. - */ - private final Identifier itemId; - /** - * For variants that correspond to non-Segmented blocks, this is the original - * flower type. This gets used when using shears to convert flowers to a tiny - * garden. - */ - @Nullable - private final Identifier originalBlockId; - private final boolean shouldCreateItem; - private final SuspiciousStewEffects stewEffectsComponent; - - private FlowerVariant(String name, boolean shouldCreateItem, Identifier itemId, Identifier originalBlockId) { - this(name, shouldCreateItem, itemId, originalBlockId, null); - } - - private FlowerVariant(String name, boolean shouldCreateItem, Identifier itemId, Identifier originalBlockId, - Entry stewEffect) { - this.name = name; - this.itemId = itemId; - this.originalBlockId = originalBlockId; - this.shouldCreateItem = shouldCreateItem; - - if (stewEffect == null) { - this.stewEffectsComponent = null; - } else { - this.stewEffectsComponent = SuspiciousStewEffects.EMPTY.withEffectAdded(stewEffect); - } - } - - @Override - public String getSerializedName() { - return this.name; - } - - @Override - public Item asItem() { - if (this.itemId == null) { - throw new IllegalStateException("Entry does not have an associated item"); - } - - return BuiltInRegistries.ITEM.getValue(this.itemId); - } - - @Override - public SuspiciousStewEffects getSuspiciousEffects() { - return stewEffectsComponent; - } - - public boolean isEmpty() { - return this == EMPTY; - } - - public Identifier getItemIdentifier() { - return this.itemId; - } - - public String getTranslationKey() { - if (this.isEmpty()) { - return "item.tiny-flowers.tiny_garden.empty"; - } - - return this.asItem().getDescriptionId(); - } - - @Nullable - public Block getOriginalBlock() { - return BuiltInRegistries.BLOCK.getValue(originalBlockId); - } - - public boolean shouldCreateItem() { - return this.shouldCreateItem; - } - - public static FlowerVariant fromItem(ItemLike itemConvertible) { - Item item = itemConvertible.asItem(); - - for (FlowerVariant variant : values()) { - if (variant.isEmpty()) { - continue; - } - - if (variant.asItem().equals(item)) { - return variant; - } - } - - return EMPTY; - } - - public static FlowerVariant fromOriginalBlock(Block block) { - for (FlowerVariant variant : values()) { - if (variant.isEmpty()) { - continue; - } - - Identifier blockId = BuiltInRegistries.BLOCK.getKey(block); - - if (blockId.equals(variant.originalBlockId)) { - return variant; - } - } - - return EMPTY; - } - - public static final Codec CODEC = StringRepresentable.fromEnum(FlowerVariant::values); - - private static int toTicks(float seconds) { - return Mth.floor(seconds * 20.0f); - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/blocks/GardenBlock.java b/src/main/java/co/secretonline/tinyflowers/blocks/GardenBlock.java deleted file mode 100644 index 9a8ee61d..00000000 --- a/src/main/java/co/secretonline/tinyflowers/blocks/GardenBlock.java +++ /dev/null @@ -1,417 +0,0 @@ -package co.secretonline.tinyflowers.blocks; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.BiFunction; -import net.minecraft.util.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.component.DataComponents; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.util.TriState; -import net.minecraft.world.attribute.EnvironmentAttributes; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.BlockItemStateProperties; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.BonemealableBlock; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.SegmentableBlock; -import net.minecraft.world.level.block.VegetationBlock; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition.Builder; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.gameevent.GameEvent.Context; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import com.mojang.serialization.MapCodec; - -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.components.ModComponents; -import co.secretonline.tinyflowers.components.TinyFlowersComponent; -import co.secretonline.tinyflowers.helper.EyeblossomHelper; - -public class GardenBlock extends VegetationBlock implements BonemealableBlock { - public static final MapCodec CODEC = simpleCodec(GardenBlock::new); - - public static final EnumProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public static final EnumProperty FLOWER_VARIANT_1 = ModBlockProperties.FLOWER_VARIANT_1; - public static final EnumProperty FLOWER_VARIANT_2 = ModBlockProperties.FLOWER_VARIANT_2; - public static final EnumProperty FLOWER_VARIANT_3 = ModBlockProperties.FLOWER_VARIANT_3; - public static final EnumProperty FLOWER_VARIANT_4 = ModBlockProperties.FLOWER_VARIANT_4; - - @SuppressWarnings("unchecked") - public static final EnumProperty[] FLOWER_VARIANT_PROPERTIES = new EnumProperty[] { - FLOWER_VARIANT_1, FLOWER_VARIANT_2, FLOWER_VARIANT_3, FLOWER_VARIANT_4 }; - - private static final BiFunction FACING_AND_AMOUNT_TO_SHAPE = Util.memoize( - (BiFunction) ((facing, bitmap) -> { - if (bitmap == 0) { - return Block.box(0.0, 0.0, 0.0, 16.0, 3.0, 16.0); - } - - VoxelShape[] voxelShapes = new VoxelShape[] { - Block.box(8.0, 0.0, 8.0, 16.0, 3.0, 16.0), - Block.box(8.0, 0.0, 0.0, 16.0, 3.0, 8.0), - Block.box(0.0, 0.0, 0.0, 8.0, 3.0, 8.0), - Block.box(0.0, 0.0, 8.0, 8.0, 3.0, 16.0) - }; - VoxelShape voxelShape = Shapes.empty(); - - for (int i = 0; i < FLOWER_VARIANT_PROPERTIES.length; i++) { - if ((bitmap & (1 << i)) > 0) { - int j = Math.floorMod(i - facing.get2DDataValue(), 4); - voxelShape = Shapes.or(voxelShape, voxelShapes[j]); - } - } - - return voxelShape.singleEncompassing(); - })); - - public GardenBlock(BlockBehaviour.Properties settings) { - super(settings); - this.registerDefaultState(this.stateDefinition.any() - .setValue(FACING, Direction.NORTH) - .setValue(FLOWER_VARIANT_1, FlowerVariant.EMPTY) - .setValue(FLOWER_VARIANT_2, FlowerVariant.EMPTY) - .setValue(FLOWER_VARIANT_3, FlowerVariant.EMPTY) - .setValue(FLOWER_VARIANT_4, FlowerVariant.EMPTY)); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - public BlockState rotate(BlockState state, Rotation rotation) { - return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); - } - - @Override - public BlockState mirror(BlockState state, Mirror mirror) { - return state.rotate(mirror.getRotation(state.getValue(FACING))); - } - - @Override - public boolean canBeReplaced(BlockState state, BlockPlaceContext context) { - return !context.isSecondaryUseActive() && context.getItemInHand().is(ModItemTags.TINY_FLOWERS) - && hasFreeSpace(state) - ? true - : super.canBeReplaced(state, context); - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { - return (VoxelShape) FACING_AND_AMOUNT_TO_SHAPE.apply((Direction) state.getValue(FACING), getFlowerBitmap(state)); - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - BlockState blockState = ctx.getLevel().getBlockState(ctx.getClickedPos()); - - ItemStack stack = ctx.getItemInHand(); - Item item = stack.getItem(); - FlowerVariant flowerVariant = FlowerVariant.fromItem(item); - if (flowerVariant.isEmpty()) { - // The item being placed down is not a flower variant in the enum, but is a - // GardenBlock block item. - // Currently, the only known case for this is a pre-formed garden item. - if (!blockState.is(this) && Block.byItem(item) == this) { - // The item is a GardenBlock block item, but not any of the variants. - // At this point we assume that the item is a pre-formed garden item. - - // Newer items (since v1.2.0 of this mod) have a TinyFlowersComponent that - // stores which flowers were picked. Older items (before v1.2.0) set this - // information on the BlockStateComponent instead. We need to check - // both of these in case the item was creted before the new component was - // added to the mod. - if (stack.has(ModComponents.TINY_FLOWERS_COMPONENT_TYPE)) { - // The item has a TinyFlowersComponent, so we can use that to get the - // flower variants. - TinyFlowersComponent tinyFlowersComponent = stack.get( - ModComponents.TINY_FLOWERS_COMPONENT_TYPE); - - return this.defaultBlockState() - .setValue(FACING, ctx.getHorizontalDirection().getOpposite()) - .setValue(FLOWER_VARIANT_1, tinyFlowersComponent.flower1()) - .setValue(FLOWER_VARIANT_2, tinyFlowersComponent.flower2()) - .setValue(FLOWER_VARIANT_3, tinyFlowersComponent.flower3()) - .setValue(FLOWER_VARIANT_4, tinyFlowersComponent.flower4()); - } else if (stack.has(DataComponents.BLOCK_STATE)) { - BlockItemStateProperties blockStateComponent = stack.get( - DataComponents.BLOCK_STATE); - - BlockState newBlockState = this.defaultBlockState() - .setValue(FACING, ctx.getHorizontalDirection().getOpposite()); - - for (EnumProperty property : FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = blockStateComponent.get(property); - variant = variant == null ? FlowerVariant.EMPTY : variant; - - newBlockState = newBlockState.setValue(property, variant); - } - - return newBlockState; - } else { - // Neither of the components are present, so do nothing. - return blockState; - } - } - - // The item is not a flower variant in the enum, and is not a GardenBlock block - // item, so there must be something weird going on. For now I've decided to do - // nothing, and just keep the current block state. It might consume an item, but - // that's better than a crash. - return blockState; - } - - if (blockState.is(this)) { - // Placing a tiny flower on a garden block. - return addFlowerToBlockState(blockState, flowerVariant); - } else if (blockState.getBlock() instanceof SegmentableBlock) { - // Placing a tiny flower on a segmented block. - // We need to convert the segmented block to a garden block - // and then add the flower variant to it. - BlockState baseState = getStateFromSegmented(blockState); - - // Add the new type in now that we've converted the block. - return addFlowerToBlockState(baseState, flowerVariant); - } else { - // Item is a valid tiny flower block item, but there's no block yet. - // Place a new garden with the flower variant. - return this.defaultBlockState() - .setValue(FACING, ctx.getHorizontalDirection().getOpposite()) - .setValue(FLOWER_VARIANT_1, flowerVariant); - } - } - - @Override - protected void createBlockStateDefinition(Builder builder) { - builder.add(FACING, FLOWER_VARIANT_1, FLOWER_VARIANT_2, FLOWER_VARIANT_3, FLOWER_VARIANT_4); - } - - @Override - public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state) { - return true; - } - - @Override - public boolean isBonemealSuccess(Level world, RandomSource random, BlockPos pos, BlockState state) { - return true; - } - - @Override - public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { - List flowers = getFlowers(state); - if (flowers.isEmpty()) { - TinyFlowers.LOGGER.warn("Tried to grow empty space in garden block"); - return; - } - - FlowerVariant flowerVariant = Util.getRandom(flowers, random); - - if (hasFreeSpace(state)) { - // Add flower to gerden - world.setBlock( - pos, - addFlowerToBlockState(state, flowerVariant), - Block.UPDATE_CLIENTS); - } else { - // Drop an item based on the variants in the garden. At this stage we can assume - // that the garden is full. - popResource(world, pos, new ItemStack(flowerVariant)); - } - } - - @Override - protected boolean isRandomlyTicking(BlockState state) { - // Block should receive ticks if there is an eyeblossom present. - for (EnumProperty property : FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = state.getValue(property); - if (variant == FlowerVariant.OPEN_EYEBLOSSOM || variant == FlowerVariant.CLOSED_EYEBLOSSOM) { - return true; - } - } - - return super.isRandomlyTicking(state); - } - - @Override - protected void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { - if (doEyeblossomTick(state, world, pos, random)) { - EyeblossomHelper.playSound(world, pos, world.isBrightOutside(), true); - } - - super.randomTick(state, world, pos, random); - } - - @Override - protected void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { - if (doEyeblossomTick(state, world, pos, random)) { - EyeblossomHelper.playSound(world, pos, world.isBrightOutside(), false); - } - - super.tick(state, world, pos, random); - } - - private static boolean doEyeblossomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { - TriState expectedState = world.environmentAttributes().getValue(EnvironmentAttributes.EYEBLOSSOM_OPEN, pos); - // - if (expectedState == TriState.DEFAULT) { - return false; - } - - boolean isDay = expectedState.toBoolean(false); - FlowerVariant correctVariant = EyeblossomHelper.getFlowerVariant(isDay); - FlowerVariant incorrectVariant = EyeblossomHelper.getFlowerVariant(!isDay); - - BlockState currentState = state; - boolean didChange = false; - for (EnumProperty property : GardenBlock.FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = currentState.getValue(property); - if (variant == incorrectVariant) { - currentState = currentState.setValue(property, correctVariant); - didChange = true; - } - } - - if (didChange) { - world.setBlock(pos, currentState, Block.UPDATE_CLIENTS); - world.gameEvent(GameEvent.BLOCK_CHANGE, pos, Context.of(state)); - - EyeblossomHelper.getState(isDay).spawnTransformParticle(world, pos, random); - - EyeblossomHelper.notifyNearbyEyeblossoms(state, world, pos, random); - } - - return didChange; - } - - @Override - protected ItemStack getCloneItemStack(LevelReader world, BlockPos pos, BlockState state, boolean includeData) { - if (includeData) { - TinyFlowersComponent tinyFlowersComponent = TinyFlowersComponent.of( - state.getValue(FLOWER_VARIANT_1), - state.getValue(FLOWER_VARIANT_2), - state.getValue(FLOWER_VARIANT_3), - state.getValue(FLOWER_VARIANT_4)); - - ItemStack stack = new ItemStack(this.asItem()); - stack.set(ModComponents.TINY_FLOWERS_COMPONENT_TYPE, tinyFlowersComponent); - - return stack; - } - - for (EnumProperty property : FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = state.getValue(property); - if (!variant.isEmpty()) { - return new ItemStack(variant); - } - } - - return ItemStack.EMPTY; - } - - public static boolean hasFreeSpace(BlockState state) { - return getNumFlowers(state) < FLOWER_VARIANT_PROPERTIES.length; - } - - public static boolean isEmpty(BlockState state) { - return getNumFlowers(state) == 0; - } - - private static int getNumFlowers(BlockState state) { - int numFlowers = 0; - for (EnumProperty property : FLOWER_VARIANT_PROPERTIES) { - if (!state.getValue(property).isEmpty()) { - numFlowers++; - } - } - - return numFlowers; - } - - public static List getFlowers(BlockState state) { - List flowers = new ArrayList<>(GardenBlock.FLOWER_VARIANT_PROPERTIES.length); - - for (EnumProperty property : GardenBlock.FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = state.getValue(property); - - if (!variant.isEmpty()) { - flowers.add(variant); - } - } - - return flowers; - } - - /** - * Since there can be "holes" in the variants, this creates a tiny bitmap of - * which positions has flowers. The reason this is useful is for the memoisation - * during hitbox creation, as keeping the number of cache entries down for that - * is important. - */ - private static int getFlowerBitmap(BlockState state) { - int bitmap = 0; - for (int i = 0; i < FLOWER_VARIANT_PROPERTIES.length; i++) { - EnumProperty property = FLOWER_VARIANT_PROPERTIES[i]; - if (state.getValue(property).isEmpty()) { - continue; - } - - bitmap = bitmap | (1 << i); - } - - return bitmap; - } - - public static BlockState addFlowerToBlockState(BlockState state, FlowerVariant flowerVariant) { - for (EnumProperty property : FLOWER_VARIANT_PROPERTIES) { - if (state.getValue(property).isEmpty()) { - return state.setValue(property, flowerVariant); - } - } - - return state; - } - - public BlockState getStateFromSegmented(BlockState blockState) { - // Convert Segmented (e.g. Pink petals, Leaf litter) to GardenBlock - Block block = blockState.getBlock(); - FlowerVariant existingVariant = FlowerVariant.fromItem(block); - if (existingVariant.isEmpty()) { - // Invalid state - throw new IllegalStateException("Segmented block has no valid flower variant"); - } - - if (block instanceof SegmentableBlock segmentedBlock) { - // This exists because FlowerbedBlocks had their own property before Segmented - // existed. - IntegerProperty amountProperty = segmentedBlock.getSegmentAmountProperty(); - int prevNumFlowers = blockState.getValue(amountProperty); - - BlockState baseState = this.defaultBlockState() - .setValue(FACING, blockState.getValue(BlockStateProperties.HORIZONTAL_FACING)) - .setValue(FLOWER_VARIANT_1, prevNumFlowers >= 1 ? existingVariant : FlowerVariant.EMPTY) - .setValue(FLOWER_VARIANT_2, prevNumFlowers >= 2 ? existingVariant : FlowerVariant.EMPTY) - .setValue(FLOWER_VARIANT_3, prevNumFlowers >= 3 ? existingVariant : FlowerVariant.EMPTY) - .setValue(FLOWER_VARIANT_4, prevNumFlowers >= 4 ? existingVariant : FlowerVariant.EMPTY); - return baseState; - - } else { - throw new IllegalStateException("Block is not a segmented block"); - } - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/blocks/ModBlockProperties.java b/src/main/java/co/secretonline/tinyflowers/blocks/ModBlockProperties.java deleted file mode 100644 index 11bc07a7..00000000 --- a/src/main/java/co/secretonline/tinyflowers/blocks/ModBlockProperties.java +++ /dev/null @@ -1,18 +0,0 @@ -package co.secretonline.tinyflowers.blocks; - -import net.minecraft.world.level.block.state.properties.EnumProperty; - -public class ModBlockProperties { - public static final EnumProperty FLOWER_VARIANT_1 = EnumProperty.create( - "flower_variant_1", - FlowerVariant.class); - public static final EnumProperty FLOWER_VARIANT_2 = EnumProperty.create( - "flower_variant_2", - FlowerVariant.class); - public static final EnumProperty FLOWER_VARIANT_3 = EnumProperty.create( - "flower_variant_3", - FlowerVariant.class); - public static final EnumProperty FLOWER_VARIANT_4 = EnumProperty.create( - "flower_variant_4", - FlowerVariant.class); -} diff --git a/src/main/java/co/secretonline/tinyflowers/blocks/ModBlocks.java b/src/main/java/co/secretonline/tinyflowers/blocks/ModBlocks.java deleted file mode 100644 index 97d3b3f7..00000000 --- a/src/main/java/co/secretonline/tinyflowers/blocks/ModBlocks.java +++ /dev/null @@ -1,37 +0,0 @@ -package co.secretonline.tinyflowers.blocks; - -import co.secretonline.tinyflowers.TinyFlowers; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.material.MapColor; -import net.minecraft.world.level.material.PushReaction; - -public class ModBlocks { - - public static final ResourceKey TINY_GARDEN_KEY = ResourceKey.create( - Registries.BLOCK, - TinyFlowers.id("tiny_garden")); - - public static final Block TINY_GARDEN = registerBlockOnly( - new GardenBlock( - BlockBehaviour.Properties.of() - .setId(TINY_GARDEN_KEY) - .mapColor(MapColor.PLANT) - .noCollision() - .sound(SoundType.PINK_PETALS) - .pushReaction(PushReaction.DESTROY)), - TINY_GARDEN_KEY); - - public static Block registerBlockOnly(Block block, ResourceKey blockKey) { - return Registry.register(BuiltInRegistries.BLOCK, blockKey, block); - } - - public static void initialize() { - Registry.register(BuiltInRegistries.BLOCK_TYPE, TinyFlowers.id("tiny_garden"), GardenBlock.CODEC); - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/blocks/ModItemTags.java b/src/main/java/co/secretonline/tinyflowers/blocks/ModItemTags.java deleted file mode 100644 index 4109a3ca..00000000 --- a/src/main/java/co/secretonline/tinyflowers/blocks/ModItemTags.java +++ /dev/null @@ -1,10 +0,0 @@ -package co.secretonline.tinyflowers.blocks; - -import co.secretonline.tinyflowers.TinyFlowers; -import net.minecraft.core.registries.Registries; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; - -public class ModItemTags { - public static final TagKey TINY_FLOWERS = TagKey.create(Registries.ITEM, TinyFlowers.id("tiny_flowers")); -} diff --git a/src/main/java/co/secretonline/tinyflowers/components/ModComponents.java b/src/main/java/co/secretonline/tinyflowers/components/ModComponents.java deleted file mode 100644 index d9ab83bd..00000000 --- a/src/main/java/co/secretonline/tinyflowers/components/ModComponents.java +++ /dev/null @@ -1,16 +0,0 @@ -package co.secretonline.tinyflowers.components; - -import co.secretonline.tinyflowers.TinyFlowers; -import net.minecraft.core.Registry; -import net.minecraft.core.component.DataComponentType; -import net.minecraft.core.registries.BuiltInRegistries; - -public class ModComponents { - public static final DataComponentType TINY_FLOWERS_COMPONENT_TYPE = Registry.register( - BuiltInRegistries.DATA_COMPONENT_TYPE, - TinyFlowers.id("tiny_flowers"), - DataComponentType.builder().persistent(TinyFlowersComponent.CODEC).build()); - - public static void initialize() { - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/components/TinyFlowersComponent.java b/src/main/java/co/secretonline/tinyflowers/components/TinyFlowersComponent.java deleted file mode 100644 index 9225c4a2..00000000 --- a/src/main/java/co/secretonline/tinyflowers/components/TinyFlowersComponent.java +++ /dev/null @@ -1,90 +0,0 @@ -package co.secretonline.tinyflowers.components; - -import java.util.function.Consumer; -import net.minecraft.ChatFormatting; -import net.minecraft.core.component.DataComponentGetter; -import net.minecraft.core.component.DataComponents; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.item.Item.TooltipContext; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.component.BlockItemStateProperties; -import net.minecraft.world.item.component.TooltipProvider; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; - -/** - * Since Minecraft 1.21.5, the tooltip system has been changed to use - * components, so in order to show the flower variants in a tooltip we need a - * component. - */ -public record TinyFlowersComponent(FlowerVariant flower1, FlowerVariant flower2, FlowerVariant flower3, - FlowerVariant flower4) implements TooltipProvider { - - public static final TinyFlowersComponent EMPTY = of( - FlowerVariant.EMPTY, FlowerVariant.EMPTY, - FlowerVariant.EMPTY, FlowerVariant.EMPTY); - - public static final TinyFlowersComponent of(FlowerVariant flower1, FlowerVariant flower2, FlowerVariant flower3, - FlowerVariant flower4) { - return new TinyFlowersComponent( - flower1 == null ? FlowerVariant.EMPTY : flower1, - flower2 == null ? FlowerVariant.EMPTY : flower2, - flower3 == null ? FlowerVariant.EMPTY : flower3, - flower4 == null ? FlowerVariant.EMPTY : flower4); - } - - public static final Codec CODEC = RecordCodecBuilder.create(builder -> { - return builder.group( - FlowerVariant.CODEC.fieldOf("flower_variant_1").forGetter(TinyFlowersComponent::flower1), - FlowerVariant.CODEC.fieldOf("flower_variant_2").forGetter(TinyFlowersComponent::flower2), - FlowerVariant.CODEC.fieldOf("flower_variant_3").forGetter(TinyFlowersComponent::flower3), - FlowerVariant.CODEC.fieldOf("flower_variant_4").forGetter(TinyFlowersComponent::flower4)) - .apply(builder, TinyFlowersComponent::new); - }); - - public boolean isEmpty() { - return flower1.isEmpty() && flower2.isEmpty() && flower3.isEmpty() && flower4.isEmpty(); - } - - @Override - public void addToTooltip(TooltipContext context, Consumer textConsumer, - TooltipFlag type, DataComponentGetter components) { - if (this.isEmpty()) { - // Since it's possible that garden items were created before this component was - // added to the mod, we also need to check for variants in the block state. - BlockItemStateProperties itemBlockState = components.get(DataComponents.BLOCK_STATE); - if (itemBlockState != null) { - for (EnumProperty property : GardenBlock.FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = itemBlockState.get(property); - variant = variant == null ? FlowerVariant.EMPTY : variant; - - MutableComponent text = Component.translatable(variant.getTranslationKey()); - if (variant.isEmpty()) { - text.withStyle(ChatFormatting.GRAY); - } - - textConsumer.accept(text); - } - } - - return; - } - - FlowerVariant[] flowers = { flower1, flower2, flower3, flower4 }; - for (int i = 0; i < flowers.length; i++) { - FlowerVariant variant = flowers[i]; - - MutableComponent text = Component.translatable(variant.getTranslationKey()); - if (variant.isEmpty()) { - text.withStyle(ChatFormatting.GRAY); - } - - textConsumer.accept(text); - } - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/helper/EyeblossomHelper.java b/src/main/java/co/secretonline/tinyflowers/helper/EyeblossomHelper.java deleted file mode 100644 index a21d8c05..00000000 --- a/src/main/java/co/secretonline/tinyflowers/helper/EyeblossomHelper.java +++ /dev/null @@ -1,93 +0,0 @@ -package co.secretonline.tinyflowers.helper; - -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; -import co.secretonline.tinyflowers.blocks.ModBlocks; -import co.secretonline.tinyflowers.mixin.EyeblossomStateAccessor; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.EyeblossomBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.EnumProperty; - -public class EyeblossomHelper { - public static FlowerVariant getFlowerVariant(boolean isDay) { - return isDay - ? FlowerVariant.CLOSED_EYEBLOSSOM - : FlowerVariant.OPEN_EYEBLOSSOM; - } - - public static Block getBlock(boolean isDay) { - return isDay - ? Blocks.CLOSED_EYEBLOSSOM - : Blocks.OPEN_EYEBLOSSOM; - } - - public static EyeblossomBlock.Type getState(boolean isDay) { - return isDay - ? EyeblossomBlock.Type.CLOSED - : EyeblossomBlock.Type.OPEN; - } - - public static void notifyNearbyEyeblossoms(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { - boolean isDay = world.isBrightOutside(); - - FlowerVariant incorrectFlowerVariant = getFlowerVariant(!isDay); - Block incorrectEyeblossom = getBlock(!isDay); - - // This is to detect whether the central block of the area is a real Eyeblossom - // flower. - // This method gets called in two places: - // 1. In GardenBlock, where we want to notify Eyeblossoms and gardens. - // 2. In EyeblossomBlockMixin, which injects after Eyeblossoms are already - // notified so we don't want to double up the scheduled ticks. - boolean blockIsEyeblossom = state.is(Blocks.CLOSED_EYEBLOSSOM) || state.is(Blocks.OPEN_EYEBLOSSOM); - - BlockPos.betweenClosed(pos.offset(-3, -2, -3), pos.offset(3, 2, 3)).forEach(otherPos -> { - BlockState nearbyBlockState = world.getBlockState(otherPos); - - // Eyeblossoms - if (!blockIsEyeblossom && nearbyBlockState.is(incorrectEyeblossom)) { - scheduleBlockTick(world, pos, otherPos, incorrectEyeblossom, random); - return; - } - - // Gardens - if (nearbyBlockState.is(ModBlocks.TINY_GARDEN)) { - // Tiny Gardens should also recieve updates if they have eyeblossoms. - for (EnumProperty property : GardenBlock.FLOWER_VARIANT_PROPERTIES) { - FlowerVariant variant = nearbyBlockState.getValue(property); - if (variant == incorrectFlowerVariant) { - scheduleBlockTick(world, pos, otherPos, ModBlocks.TINY_GARDEN, random); - return; - } - } - } - }); - } - - private static void scheduleBlockTick(ServerLevel world, BlockPos centerPos, BlockPos otherPos, Block block, - RandomSource random) { - double distance = Math.sqrt(centerPos.distSqr(otherPos)); - int numTicks = random.nextIntBetweenInclusive((int) (distance * 5.0), (int) (distance * - 10.0)); - - world.scheduleTick(otherPos, block, numTicks); - } - - public static void playSound(ServerLevel world, BlockPos pos, boolean isDay, boolean isLong) { - EyeblossomBlock.Type state = getState(isDay); - - if (isLong) { - world.playSound(null, pos, state.longSwitchSound(), - SoundSource.BLOCKS, 1.0F, 1.0F); - } else { - world.playSound(null, pos, ((EyeblossomStateAccessor) ((Object) (state))).getShortSwitchSound(), - SoundSource.BLOCKS, 1.0F, 1.0F); - } - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/helper/SegmentedMixinHelper.java b/src/main/java/co/secretonline/tinyflowers/helper/SegmentedMixinHelper.java deleted file mode 100644 index 7e6df0db..00000000 --- a/src/main/java/co/secretonline/tinyflowers/helper/SegmentedMixinHelper.java +++ /dev/null @@ -1,105 +0,0 @@ -package co.secretonline.tinyflowers.helper; - -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; -import co.secretonline.tinyflowers.blocks.ModBlocks; -import net.minecraft.core.Direction; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SegmentableBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; - -/** - * This class contains common logic for mixins targeting Segmented blocks. - * - * As Segmented is an interface, we can't use a mixin to inject into it - * directly. Instead, we need to inject into all classes that implement - * Segmented and call the methods in this class. - */ -public class SegmentedMixinHelper { - public static void shouldAddSegment(BlockState state, BlockPlaceContext context, - IntegerProperty property, CallbackInfoReturnable info) { - // Early exit for cases where no additional items should be placed. - if (context.isSecondaryUseActive() || state.getValue(property) >= SegmentableBlock.MAX_SEGMENT) { - return; - } - - ItemStack stack = context.getItemInHand(); - - // If the placement item is the same as the current block, then we don't want to - // overwrite it. This keeps more vanilla blocks in the world, which I think is - // an admirable goal. - if (stack.is(state.getBlock().asItem())) { - return; - } - - FlowerVariant flowerVariant = FlowerVariant.fromItem(stack.getItem()); - if (flowerVariant.isEmpty()) { - // The item is not a valid flower variant, so we don't need to do anything. - return; - } - - info.setReturnValue(true); - } - - public static void getPlacementState(BlockPlaceContext context, Block blockBeingUsed, IntegerProperty amountProperty, - EnumProperty directionProperty, CallbackInfoReturnable info) { - // We need to build a new BlockState if a Segmented block item is being placed - // inside a GardenBlock. - BlockState blockState = context.getLevel().getBlockState(context.getClickedPos()); - Block currentBlock = blockState.getBlock(); - - // Early exit if the block being placed is the same as the current block. - // This falls back to the original implementation. - if (currentBlock.equals(blockBeingUsed)) { - return; - } - - // If the current block is not currently a garden but is able to be converted to - // a FlowerVariant, then we need to convert the current blockstate to a - // GardenBlock to before continuing. - if (!(currentBlock instanceof GardenBlock)) { - FlowerVariant currentBlockFlowerVariant = FlowerVariant.fromItem(currentBlock.asItem()); - if (!currentBlockFlowerVariant.isEmpty()) { - try { - blockState = ((GardenBlock) ModBlocks.TINY_GARDEN).getStateFromSegmented(blockState); - currentBlock = blockState.getBlock(); - } catch (IllegalStateException e) { - // This is expected to occur only if there are new Segmented blocks that don't - // have tiny flowers. If the base game ever ends up doing this, then it's - // probably woth handling this better. For now just spitting out a warning isn't - // the worst thing. - TinyFlowers.LOGGER.warn("Failed to convert blockstate to garden block. Ignoring", e); - } - } - } - - if (currentBlock instanceof GardenBlock) { - if (!GardenBlock.hasFreeSpace(blockState)) { - // Can't add flower, so don't replace blockstate. - // This case shouldn't ever be hit, as GardenBlock should have prevented - // replacement. - info.setReturnValue(blockState); - return; - } - - // There's space in the garden, so add a flower. - FlowerVariant flowerVariant = FlowerVariant.fromItem(blockBeingUsed); - if (flowerVariant.isEmpty()) { - // Is this the correct thing to do? - // Do we need to do anything to prevent the item from being consumed? - info.setReturnValue(blockState); - return; - } - - BlockState newState = GardenBlock.addFlowerToBlockState(blockState, flowerVariant); - info.setReturnValue(newState); - } - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/items/FloristsShearsItem.java b/src/main/java/co/secretonline/tinyflowers/items/FloristsShearsItem.java deleted file mode 100644 index a8e8b49c..00000000 --- a/src/main/java/co/secretonline/tinyflowers/items/FloristsShearsItem.java +++ /dev/null @@ -1,130 +0,0 @@ -package co.secretonline.tinyflowers.items; - -import java.util.Arrays; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ShearsItem; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SegmentableBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.gameevent.GameEvent.Context; -import net.minecraft.world.phys.Vec3; -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.GardenBlock; -import co.secretonline.tinyflowers.blocks.ModBlocks; - -public class FloristsShearsItem extends ShearsItem { - private final static Direction[] DIRECTIONS = new Direction[] { - Direction.NORTH, Direction.EAST, - Direction.SOUTH, Direction.WEST, }; - - public FloristsShearsItem(Properties settings) { - super(settings); - } - - @Override - public ItemStack getRecipeRemainder(ItemStack stack) { - if (stack.getDamageValue() < stack.getMaxDamage() - 1) { - ItemStack moreDamaged = stack.copy(); - moreDamaged.setDamageValue(stack.getDamageValue() + 1); - return moreDamaged; - } - - return ItemStack.EMPTY; - } - - @Override - public InteractionResult useOn(UseOnContext ctx) { - Level world = ctx.getLevel(); - BlockPos pos = ctx.getClickedPos(); - BlockState blockState = world.getBlockState(pos); - - if (blockState.getBlock() instanceof SegmentableBlock) { - // Try convert segmented block to gardens so that shears can remove flowers from - // them. - try { - blockState = ((GardenBlock) ModBlocks.TINY_GARDEN).getStateFromSegmented(blockState); - } catch (IllegalStateException ex) { - // Segmented could not be converted to garden. - TinyFlowers.LOGGER.warn("Could not convert segmented block to garden. Ignoring action."); - - return InteractionResult.TRY_WITH_EMPTY_HAND; - } - } - - if (blockState.is(ModBlocks.TINY_GARDEN)) { - // Remove flower at certain part of garden. - Vec3 positionInBlock = ctx.getClickLocation().subtract(Vec3.atLowerCornerOf(pos)); - boolean isEast = positionInBlock.x >= 0.5; - boolean isSouth = positionInBlock.z >= 0.5; - - // Convert block quadrant into the correct property. - // Writing this was a little bit of trial and a lot of error. - int index = isSouth ? (isEast ? 2 : 3) : (isEast ? 1 : 0); - index = Arrays.asList(DIRECTIONS).indexOf(blockState.getValue(GardenBlock.FACING)) - index; - index = (index + 4) % 4; - EnumProperty property = GardenBlock.FLOWER_VARIANT_PROPERTIES[index]; - - FlowerVariant variant = blockState.getValue(property); - if (variant.isEmpty()) { - return InteractionResult.TRY_WITH_EMPTY_HAND; - } - - Block.popResource(world, pos, new ItemStack(variant)); - - // TODO: Figure out if there's a scenario where the player is null - if (ctx.getPlayer() != null) { - Player player = ctx.getPlayer(); - ctx.getItemInHand().hurtAndBreak(1, player, ctx.getHand()); - - world.playSound(player, pos, SoundEvents.GROWING_PLANT_CROP, SoundSource.BLOCKS, 1.0F, 1.0F); - } - - BlockState newBlockState = blockState.setValue(property, FlowerVariant.EMPTY); - if (GardenBlock.isEmpty(newBlockState)) { - world.removeBlock(pos, false); - } else { - world.setBlockAndUpdate(pos, newBlockState); - } - - world.gameEvent(GameEvent.BLOCK_CHANGE, pos, Context.of(ctx.getPlayer(), newBlockState)); - - return InteractionResult.SUCCESS; - } - - Block block = blockState.getBlock(); - FlowerVariant variant = FlowerVariant.fromOriginalBlock(block); - if (!variant.isEmpty()) { - BlockState newBlockState = ((GardenBlock) ModBlocks.TINY_GARDEN).defaultBlockState() - .setValue(GardenBlock.FACING, ctx.getHorizontalDirection().getOpposite()) - .setValue(GardenBlock.FLOWER_VARIANT_1, variant) - .setValue(GardenBlock.FLOWER_VARIANT_2, variant) - .setValue(GardenBlock.FLOWER_VARIANT_3, variant) - .setValue(GardenBlock.FLOWER_VARIANT_4, variant); - - if (ctx.getPlayer() != null) { - Player player = ctx.getPlayer(); - ctx.getItemInHand().hurtAndBreak(1, player, ctx.getHand()); - - world.playSound(player, pos, SoundEvents.GROWING_PLANT_CROP, SoundSource.BLOCKS, 1.0F, 1.0F); - } - - world.setBlockAndUpdate(pos, newBlockState); - world.gameEvent(GameEvent.BLOCK_CHANGE, pos, Context.of(ctx.getPlayer(), newBlockState)); - - return InteractionResult.SUCCESS; - } - - return super.useOn(ctx); - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/items/ModItems.java b/src/main/java/co/secretonline/tinyflowers/items/ModItems.java deleted file mode 100644 index b9fb0a46..00000000 --- a/src/main/java/co/secretonline/tinyflowers/items/ModItems.java +++ /dev/null @@ -1,86 +0,0 @@ -package co.secretonline.tinyflowers.items; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import co.secretonline.tinyflowers.TinyFlowers; -import co.secretonline.tinyflowers.blocks.FlowerVariant; -import co.secretonline.tinyflowers.blocks.ModBlocks; -import co.secretonline.tinyflowers.components.ModComponents; -import co.secretonline.tinyflowers.components.TinyFlowersComponent; -import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; -import net.minecraft.core.Registry; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ShearsItem; -import net.minecraft.world.item.component.DyedItemColor; - -public class ModItems { - - // This mod defines a bunch of duplicate block items of the tiny_garden block so - // that placing one of them will always place one. This does get a little weird - // in places, as it definitely does not feel intended, but it works so I'm not - // complaining. - private static final Map FLOWER_VARIANT_ITEMS = registerFlowerVariantItems(); - // This declaration MUST be last to keep the Block/Item mappings correct. - public static final Item TINY_GARDEN_ITEM = registerGardenBlockItem("tiny_garden", - // Add a default component so tooltips work for older items - (settings) -> settings.component(ModComponents.TINY_FLOWERS_COMPONENT_TYPE, TinyFlowersComponent.EMPTY)); - - public static final ResourceKey FLORISTS_SHEARS_ITEM_KEY = ResourceKey.create(Registries.ITEM, - TinyFlowers.id("florists_shears")); - public static final Item FLORISTS_SHEARS_ITEM = Registry.register(BuiltInRegistries.ITEM, FLORISTS_SHEARS_ITEM_KEY, - new FloristsShearsItem( - new Item.Properties() - .setId(FLORISTS_SHEARS_ITEM_KEY) - .stacksTo(1) - .durability(238) - .component(DataComponents.TOOL, ShearsItem.createToolProperties()) - .component(DataComponents.DYED_COLOR, - new DyedItemColor(DyeColor.RED.getTextureDiffuseColor())))); - - private static Map registerFlowerVariantItems() { - Map flowerVariantItems = new HashMap<>(); - - for (FlowerVariant variant : FlowerVariant.values()) { - if (!variant.shouldCreateItem()) { - continue; - } - - Item item = registerGardenBlockItem(variant.getItemIdentifier().getPath()); - flowerVariantItems.put(variant, item); - } - - return flowerVariantItems; - } - - public static Item registerGardenBlockItem(String path) { - return registerGardenBlockItem(path, Function.identity()); - } - - public static Item registerGardenBlockItem(String path, Function settings) { - ResourceKey itemKey = ResourceKey.create(Registries.ITEM, TinyFlowers.id(path)); - return Registry.register(BuiltInRegistries.ITEM, itemKey, - new BlockItem( - ModBlocks.TINY_GARDEN, - settings.apply(new Item.Properties().setId(itemKey)))); - } - - public static void initialize() { - ItemGroupEvents.modifyEntriesEvent(CreativeModeTabs.NATURAL_BLOCKS).register((itemGroup) -> { - for (Map.Entry entry : FLOWER_VARIANT_ITEMS.entrySet()) { - itemGroup.accept(entry.getValue()); - } - }); - ItemGroupEvents.modifyEntriesEvent(CreativeModeTabs.TOOLS_AND_UTILITIES).register((itemGroup) -> { - itemGroup.accept(FLORISTS_SHEARS_ITEM); - }); - } -} diff --git a/src/main/java/co/secretonline/tinyflowers/mixin/EyeblossomStateAccessor.java b/src/main/java/co/secretonline/tinyflowers/mixin/EyeblossomStateAccessor.java deleted file mode 100644 index 9351fd45..00000000 --- a/src/main/java/co/secretonline/tinyflowers/mixin/EyeblossomStateAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package co.secretonline.tinyflowers.mixin; - -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.level.block.EyeblossomBlock; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(EyeblossomBlock.Type.class) -public interface EyeblossomStateAccessor { - // EyeblossomState has a getter for the long sound (played on random tick) but - // not for the short sound (played on scheduled tick). - @Accessor - SoundEvent getShortSwitchSound(); -} diff --git a/src/main/resources/assets/tiny-flowers/lang/de_at.json b/src/main/resources/assets/tiny-flowers/lang/de_at.json deleted file mode 100644 index 24f4418d..00000000 --- a/src/main/resources/assets/tiny-flowers/lang/de_at.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "modmenu.descriptionTranslation.tiny-flowers": "Fügt winzige Varianten aller Vanilla-Blumen hinzu.", - "block.tiny-flowers.tiny_garden": "Winziger Garten", - "item.tiny-flowers.florists_shears": "Floristenschere", - "item.tiny-flowers.tiny_garden": "Winziger Garten", - "item.tiny-flowers.tiny_garden.empty": "Leer", - "item.tiny-flowers.tiny_cactus_flower": "Winzige Kaktusblüte", - "item.tiny-flowers.tiny_dandelion": "Winziger Löwenzahn", - "item.tiny-flowers.tiny_poppy": "Winziger Mohn", - "item.tiny-flowers.tiny_blue_orchid": "Winzige blaue Orchidee", - "item.tiny-flowers.tiny_allium": "Winziger Zierlauch", - "item.tiny-flowers.tiny_azure_bluet": "Winzige Porzellansternchen", - "item.tiny-flowers.tiny_red_tulip": "Winzige rote Tulpe", - "item.tiny-flowers.tiny_orange_tulip": "Winzige orange Tulpe", - "item.tiny-flowers.tiny_white_tulip": "Winzige weiße Tulpe", - "item.tiny-flowers.tiny_pink_tulip": "Winzige rosa Tulpe", - "item.tiny-flowers.tiny_oxeye_daisy": "Winzige Margerite", - "item.tiny-flowers.tiny_cornflower": "Winzige Kornblume", - "item.tiny-flowers.tiny_lily_of_the_valley": "Winziges Maiglöckchen", - "item.tiny-flowers.tiny_torchflower": "Winzige Fackellilie", - "item.tiny-flowers.tiny_open_eyeblossom": "Winzige geöffnete Augenblüte", - "item.tiny-flowers.tiny_closed_eyeblossom": "Winzige geschlossene Augenblüte", - "item.tiny-flowers.tiny_wither_rose": "Winzige Wither-Rose", - "tag.item.tiny-flowers.tiny_flowers": "Winzige Blumen" -} diff --git a/src/main/resources/assets/tiny-flowers/lang/de_ch.json b/src/main/resources/assets/tiny-flowers/lang/de_ch.json deleted file mode 100644 index 24f4418d..00000000 --- a/src/main/resources/assets/tiny-flowers/lang/de_ch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "modmenu.descriptionTranslation.tiny-flowers": "Fügt winzige Varianten aller Vanilla-Blumen hinzu.", - "block.tiny-flowers.tiny_garden": "Winziger Garten", - "item.tiny-flowers.florists_shears": "Floristenschere", - "item.tiny-flowers.tiny_garden": "Winziger Garten", - "item.tiny-flowers.tiny_garden.empty": "Leer", - "item.tiny-flowers.tiny_cactus_flower": "Winzige Kaktusblüte", - "item.tiny-flowers.tiny_dandelion": "Winziger Löwenzahn", - "item.tiny-flowers.tiny_poppy": "Winziger Mohn", - "item.tiny-flowers.tiny_blue_orchid": "Winzige blaue Orchidee", - "item.tiny-flowers.tiny_allium": "Winziger Zierlauch", - "item.tiny-flowers.tiny_azure_bluet": "Winzige Porzellansternchen", - "item.tiny-flowers.tiny_red_tulip": "Winzige rote Tulpe", - "item.tiny-flowers.tiny_orange_tulip": "Winzige orange Tulpe", - "item.tiny-flowers.tiny_white_tulip": "Winzige weiße Tulpe", - "item.tiny-flowers.tiny_pink_tulip": "Winzige rosa Tulpe", - "item.tiny-flowers.tiny_oxeye_daisy": "Winzige Margerite", - "item.tiny-flowers.tiny_cornflower": "Winzige Kornblume", - "item.tiny-flowers.tiny_lily_of_the_valley": "Winziges Maiglöckchen", - "item.tiny-flowers.tiny_torchflower": "Winzige Fackellilie", - "item.tiny-flowers.tiny_open_eyeblossom": "Winzige geöffnete Augenblüte", - "item.tiny-flowers.tiny_closed_eyeblossom": "Winzige geschlossene Augenblüte", - "item.tiny-flowers.tiny_wither_rose": "Winzige Wither-Rose", - "tag.item.tiny-flowers.tiny_flowers": "Winzige Blumen" -} diff --git a/src/main/resources/assets/tiny-flowers/lang/de_de.json b/src/main/resources/assets/tiny-flowers/lang/de_de.json deleted file mode 100644 index 24f4418d..00000000 --- a/src/main/resources/assets/tiny-flowers/lang/de_de.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "modmenu.descriptionTranslation.tiny-flowers": "Fügt winzige Varianten aller Vanilla-Blumen hinzu.", - "block.tiny-flowers.tiny_garden": "Winziger Garten", - "item.tiny-flowers.florists_shears": "Floristenschere", - "item.tiny-flowers.tiny_garden": "Winziger Garten", - "item.tiny-flowers.tiny_garden.empty": "Leer", - "item.tiny-flowers.tiny_cactus_flower": "Winzige Kaktusblüte", - "item.tiny-flowers.tiny_dandelion": "Winziger Löwenzahn", - "item.tiny-flowers.tiny_poppy": "Winziger Mohn", - "item.tiny-flowers.tiny_blue_orchid": "Winzige blaue Orchidee", - "item.tiny-flowers.tiny_allium": "Winziger Zierlauch", - "item.tiny-flowers.tiny_azure_bluet": "Winzige Porzellansternchen", - "item.tiny-flowers.tiny_red_tulip": "Winzige rote Tulpe", - "item.tiny-flowers.tiny_orange_tulip": "Winzige orange Tulpe", - "item.tiny-flowers.tiny_white_tulip": "Winzige weiße Tulpe", - "item.tiny-flowers.tiny_pink_tulip": "Winzige rosa Tulpe", - "item.tiny-flowers.tiny_oxeye_daisy": "Winzige Margerite", - "item.tiny-flowers.tiny_cornflower": "Winzige Kornblume", - "item.tiny-flowers.tiny_lily_of_the_valley": "Winziges Maiglöckchen", - "item.tiny-flowers.tiny_torchflower": "Winzige Fackellilie", - "item.tiny-flowers.tiny_open_eyeblossom": "Winzige geöffnete Augenblüte", - "item.tiny-flowers.tiny_closed_eyeblossom": "Winzige geschlossene Augenblüte", - "item.tiny-flowers.tiny_wither_rose": "Winzige Wither-Rose", - "tag.item.tiny-flowers.tiny_flowers": "Winzige Blumen" -} diff --git a/src/main/resources/assets/tiny-flowers/lang/en_us.json b/src/main/resources/assets/tiny-flowers/lang/en_us.json deleted file mode 100644 index 2d001ec7..00000000 --- a/src/main/resources/assets/tiny-flowers/lang/en_us.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "modmenu.descriptionTranslation.tiny-flowers": "Add tiny variants of all Vanilla flowers.", - "block.tiny-flowers.tiny_garden": "Tiny Garden", - "item.tiny-flowers.florists_shears": "Florists' Shears", - "item.tiny-flowers.tiny_garden": "Tiny Garden", - "item.tiny-flowers.tiny_garden.empty": "Empty", - "item.tiny-flowers.tiny_cactus_flower": "Tiny Cactus Flower", - "item.tiny-flowers.tiny_dandelion": "Tiny Dandelion", - "item.tiny-flowers.tiny_poppy": "Tiny Poppy", - "item.tiny-flowers.tiny_blue_orchid": "Tiny Blue Orchid", - "item.tiny-flowers.tiny_allium": "Tiny Allium", - "item.tiny-flowers.tiny_azure_bluet": "Tiny Azure Bluet", - "item.tiny-flowers.tiny_red_tulip": "Tiny Red Tulip", - "item.tiny-flowers.tiny_orange_tulip": "Tiny Orange Tulip", - "item.tiny-flowers.tiny_white_tulip": "Tiny White Tulip", - "item.tiny-flowers.tiny_pink_tulip": "Tiny Pink Tulip", - "item.tiny-flowers.tiny_oxeye_daisy": "Tiny Oxeye Daisy", - "item.tiny-flowers.tiny_cornflower": "Tiny Cornflower", - "item.tiny-flowers.tiny_lily_of_the_valley": "Tiny Lily of the Valley", - "item.tiny-flowers.tiny_torchflower": "Tiny Torchflower", - "item.tiny-flowers.tiny_open_eyeblossom": "Tiny Open Eyeblossom", - "item.tiny-flowers.tiny_closed_eyeblossom": "Tiny Closed Eyeblossom", - "item.tiny-flowers.tiny_wither_rose": "Tiny Wither Rose", - "tag.item.tiny-flowers.tiny_flowers": "Tiny Flowers" -} diff --git a/src/main/resources/assets/tiny-flowers/lang/zh_cn.json b/src/main/resources/assets/tiny-flowers/lang/zh_cn.json deleted file mode 100644 index 9ea6ada7..00000000 --- a/src/main/resources/assets/tiny-flowers/lang/zh_cn.json +++ /dev/null @@ -1,25 +0,0 @@ -{ -"modmenu.descriptionTranslation.tiny-flowers": "为所有原版花卉添加微缩变种。", -"block.tiny-flowers.tiny_garden": "微缩花园", -"item.tiny-flowers.florists_shears": "花匠剪刀", -"item.tiny-flowers.tiny_garden": "微缩花园", -"item.tiny-flowers.tiny_garden.empty": "空", -"item.tiny-flowers.tiny_cactus_flower": "微缩仙人掌花", -"item.tiny-flowers.tiny_dandelion": "微缩蒲公英", -"item.tiny-flowers.tiny_poppy": "微缩虞美人", -"item.tiny-flowers.tiny_blue_orchid": "微缩兰花", -"item.tiny-flowers.tiny_allium": "微缩绒球葱", -"item.tiny-flowers.tiny_azure_bluet": "微缩蓝花美耳草", -"item.tiny-flowers.tiny_red_tulip": "微缩红色郁金香", -"item.tiny-flowers.tiny_orange_tulip": "微缩橙色郁金香", -"item.tiny-flowers.tiny_white_tulip": "微缩白色郁金香", -"item.tiny-flowers.tiny_pink_tulip": "微缩粉红色郁金香", -"item.tiny-flowers.tiny_oxeye_daisy": "微缩滨菊", -"item.tiny-flowers.tiny_cornflower": "微缩矢车菊", -"item.tiny-flowers.tiny_lily_of_the_valley": "微缩铃兰", -"item.tiny-flowers.tiny_torchflower": "微缩火把花", -"item.tiny-flowers.tiny_open_eyeblossom": "张开的微缩眼眸花", -"item.tiny-flowers.tiny_closed_eyeblossom": "闭合的微缩眼眸花", -"item.tiny-flowers.tiny_wither_rose": "微缩凋灵玫瑰", -"tag.item.tiny-flowers.tiny_flowers": "微缩花卉" -} diff --git a/src/main/resources/tiny-flowers.mixins.json b/src/main/resources/tiny-flowers.mixins.json deleted file mode 100644 index 3f21b385..00000000 --- a/src/main/resources/tiny-flowers.mixins.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "required": true, - "package": "co.secretonline.tinyflowers.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "EyeblossomBlockMixin", - "EyeblossomStateAccessor", - "FlowerbedBlockMixin", - "ItemStackMixin", - "LeafLitterBlockMixin" - ], - "injectors": { - "defaultRequire": 1 - } -}