commit c84ba2549ddd135109d4bcfa5151ecf44a2d7c2b Author: a dinosaur Date: Mon Jul 3 15:45:00 2023 +1000 welcome to the world of javasound diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..f47af0c --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,39 @@ +plugins { + `kotlin-dsl` + kotlin("plugin.serialization") version "1.5.31" +} + +group = "gay.pizza.foundation" +version = "0.1.0-SNAPSHOT" + +repositories { + gradlePluginPortal() +} + +dependencies { + implementation("org.jetbrains.kotlinx", "kotlinx-serialization-json", "1.3.3") + + testImplementation(kotlin("test")) +} + +tasks.test { + useJUnitPlatform() +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +tasks.compileKotlin { + kotlinOptions.jvmTarget = "1.8" +} + +gradlePlugin { + plugins { + create(name) { + id = "${group}.${name}" + implementationClass = "${id}.ResourcesGeneratorPlugin" + } + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..e69de29 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..15de902 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..5141016 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,3 @@ + +rootProject.name = "drywall" + diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/ResourceWriter.kt b/src/main/kotlin/gay/pizza/foundation/drywall/ResourceWriter.kt new file mode 100644 index 0000000..c282f4a --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/ResourceWriter.kt @@ -0,0 +1,171 @@ +package gay.pizza.foundation.drywall + +import gay.pizza.foundation.drywall.enums.Lang +import gay.pizza.foundation.drywall.settings.* +import gay.pizza.foundation.drywall.util.ResourcePath +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.encodeToStream +import java.io.FileOutputStream +import java.nio.file.Files +import java.nio.file.Path +import kotlin.io.path.Path + +class ResourceWriter(private val modId: String) +{ + @Serializable + data class Tag(val replace: Boolean, val values: Collection) + + private val langs: MutableMap> = mutableMapOf() + private val mineables: MutableMap> = mutableMapOf() + private val needsTool: MutableMap> = mutableMapOf() + + private val blockStates: MutableMap = mutableMapOf() + private val blockModels: MutableMap = mutableMapOf() + private val itemModels: MutableMap = mutableMapOf() + private val lootTables: MutableMap = mutableMapOf() + private val recipes: MutableMap = mutableMapOf() + + private var defaultBlockState: BlockStateSettings? = null + private var defaultBlockModel: ModelSettings? = null + private var defaultItemModel: ModelSettings? = null + private var defaultLootTable: LootTableSettings? = null + + private var fabricMod: FabricModSettings.FabricMod? = null + private val mixins: MutableMap = mutableMapOf() + + fun defaultItemModel(settings: ModelSettings.() -> Unit) + { + defaultItemModel(ModelSettings().apply(settings)) + } + + fun defaultItemModel(settings: ModelSettings) + { + this.defaultItemModel = settings + } + + fun defaultLootTable(settings: LootTableSettings.() -> Unit) + { + defaultLootTable(LootTableSettings().apply(settings)) + } + + fun defaultLootTable(settings: LootTableSettings) + { + this.defaultLootTable = settings + } + + fun defaultBlockState(settings: BlockStateSettings.() -> Unit) + { + defaultBlockState(BlockStateSettings().apply(settings)) + } + + fun defaultBlockState(settings: BlockStateSettings) + { + this.defaultBlockState = settings + } + + fun text(key: String, string: String, lang: Lang = Lang.US_ENGLISH) + { + langs.getOrPut(lang.toString()) { mutableMapOf() }[key] = string + } + + fun itemGroupName(name: String, lang: Lang = Lang.US_ENGLISH) + { + text("itemGroup.$modId.$modId", name, lang) + } + + fun block(id: String, settings: BlockSettings.() -> Unit) + { + block(BlockSettings(id).apply(settings)) + } + + fun block(settings: BlockSettings) + { + val blockId = settings.id + val jsonName = "${blockId}.json" + val resPath = ResourcePath.PATH_BLOCK.resolve(modId, blockId) + + settings.displayNames.forEach { text("block.$modId.${blockId}", it.value, it.key) } + settings.tool?.let { mineables.getOrPut(it) { mutableListOf() }.add(resPath) } + settings.level?.let { needsTool.getOrPut("needs_${it}_tool") { mutableListOf() }.add(resPath) } + + (settings.blockState ?: defaultBlockState)?.let { blockStates[jsonName] = it.serialisable(modId, blockId) } + (settings.model ?: defaultBlockModel)?.let { blockModels[jsonName] = it.serialisable(modId, blockId) } + (settings.itemModel ?: defaultItemModel)?.let { itemModels[jsonName] = it.serialisable(modId, blockId) } + (settings.lootTable ?: defaultLootTable)?.let { lootTables[jsonName] = it.serialisable(modId, blockId) } + settings.recipes.forEachIndexed { idx, it -> + val recipeName = if (idx > 0) + "${blockId}_${(idx).toString(16)}.json" + else jsonName + recipes[recipeName] = it.serialisable(modId, blockId) + } + } + + fun fabricMod(settings: FabricModSettings.() -> Unit) + { + fabricMod(FabricModSettings().apply(settings)) + } + + fun fabricMod(settings: FabricModSettings) + { + fabricMod = settings.serialisable(modId) + settings.mixins.forEach { + if (it.value.packagePath != null) + mixins.put(it.key ?: "$modId.mixins.json", it.value.serialisable()) + } + } + + fun writeAll(dirResources: Path) + { + val dirAssets = dirResources.resolve(Path("assets", modId)) + val dirBlockStates = dirAssets.resolve("blockstates") + val dirLang = dirAssets.resolve("lang") + val dirBlockModel = dirAssets.resolve(Path("models", "block")) + val dirItemModel = dirAssets.resolve(Path("models", "item")) + var dirModData = dirResources.resolve(Path("data", modId)) + val dirLootBlocks = dirModData.resolve(Path("loot_tables", "blocks")) + var dirRecipes = dirModData.resolve(Path("recipes")) + val dirTagBlocks = dirResources.resolve(Path("data", "minecraft", "tags", "blocks")) + val dirMcMineable = dirTagBlocks.resolve("mineable") + + blockStates.forEach { encodeWrite(it.value, dirBlockStates.resolve(it.key)) } + blockModels.forEach { encodeWrite(it.value, dirBlockModel.resolve(it.key)) } + itemModels.forEach { encodeWrite(it.value, dirItemModel.resolve(it.key)) } + lootTables.forEach { encodeWrite(it.value, dirLootBlocks.resolve(it.key)) } + recipes.forEach { encodeWrite(it.value, dirRecipes.resolve(it.key)) } + + langs.forEach { encodeWrite(it.value, dirLang.resolve("${it.key}.json")) } + mineables.forEach { encodeWrite(Tag(false, it.value), dirMcMineable.resolve("${it.key}.json")) } + needsTool.forEach { encodeWrite(Tag(false, it.value), dirTagBlocks.resolve("${it.key}.json")) } + + fabricMod.let { encodeWrite(it, dirResources.resolve("fabric.mod.json")) } + mixins.forEach { encodeWrite(it.value, dirResources.resolve(it.key)) } + } + + @OptIn(ExperimentalSerializationApi::class) + private val json = Json { + encodeDefaults = true + explicitNulls = false + prettyPrint = true + prettyPrintIndent = " " + } + + private fun openFile(filePath: Path): FileOutputStream + { + val dirPath = filePath.parent + if (!dirPath.toFile().isDirectory) + Files.createDirectories(dirPath) + return FileOutputStream(filePath.toFile()) + } + + @OptIn(ExperimentalSerializationApi::class) + @SuppressWarnings("deprecation") + private inline fun encodeWrite(obj: T, fileName: Path) + { + val out = openFile(fileName) + json.encodeToStream(obj, out) + out.write('\n'.code) + out.flush() + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/ResourcesGenerator.kt b/src/main/kotlin/gay/pizza/foundation/drywall/ResourcesGenerator.kt new file mode 100644 index 0000000..b1d4c58 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/ResourcesGenerator.kt @@ -0,0 +1,24 @@ +package gay.pizza.foundation.drywall + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.TaskAction +import java.io.File + +open class ResourcesGenerator : DefaultTask() +{ + @get:Input + var modId: String = "" + @get:Input + var configuration: ResourceWriter.() -> Unit = {} + @get:InputFile + var outputDirectory: File = File("") + + @TaskAction + fun generateResources() + { + val writer = ResourceWriter(modId).apply(configuration) + writer.writeAll(outputDirectory.toPath()) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/ResourcesGeneratorPlugin.kt b/src/main/kotlin/gay/pizza/foundation/drywall/ResourcesGeneratorPlugin.kt new file mode 100644 index 0000000..3b5f29e --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/ResourcesGeneratorPlugin.kt @@ -0,0 +1,16 @@ +package gay.pizza.foundation.drywall + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.create + +class ResourcesGeneratorPlugin: Plugin +{ + override fun apply(target: Project) + { + val genResources = target.tasks.create("genResources") + target.afterEvaluate { + project.tasks.getByName("jar").dependsOn(genResources) + } + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/Blocks.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/Blocks.kt new file mode 100644 index 0000000..e1d314d --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/Blocks.kt @@ -0,0 +1,910 @@ +package gay.pizza.foundation.drywall.enums + +import gay.pizza.foundation.drywall.util.ResourcePath + +enum class Blocks(private val id: String) +{ + ACACIA_BUTTON("acacia_button"), + ACACIA_DOOR("acacia_door"), + ACACIA_FENCE("acacia_fence"), + ACACIA_FENCE_GATE("acacia_fence_gate"), + ACACIA_LEAVES("acacia_leaves"), + ACACIA_LOG("acacia_log"), + ACACIA_PLANKS("acacia_planks"), + ACACIA_PRESSURE_PLATE("acacia_pressure_plate"), + ACACIA_SAPLING("acacia_sapling"), + ACACIA_SIGN("acacia_sign"), + ACACIA_SLAB("acacia_slab"), + ACACIA_STAIRS("acacia_stairs"), + ACACIA_TRAPDOOR("acacia_trapdoor"), + ACACIA_WALL_SIGN("acacia_wall_sign"), + ACACIA_WOOD("acacia_wood"), + ACTIVATOR_RAIL("activator_rail"), + AIR("air"), + ALLIUM("allium"), + AMETHYST_BLOCK("amethyst_block"), + AMETHYST_CLUSTER("amethyst_cluster"), + ANCIENT_DEBRIS("ancient_debris"), + ANDESITE("andesite"), + ANDESITE_SLAB("andesite_slab"), + ANDESITE_STAIRS("andesite_stairs"), + ANDESITE_WALL("andesite_wall"), + ANVIL("anvil"), + ATTACHED_MELON_STEM("attached_melon_stem"), + ATTACHED_PUMPKIN_STEM("attached_pumpkin_stem"), + AZALEA("azalea"), + AZALEA_LEAVES("azalea_leaves"), + AZURE_BLUET("azure_bluet"), + BAMBOO("bamboo"), + BAMBOO_SAPLING("bamboo_sapling"), + BARREL("barrel"), + BARRIER("barrier"), + BASALT("basalt"), + BEACON("beacon"), + BEDROCK("bedrock"), + BEE_NEST("bee_nest"), + BEEHIVE("beehive"), + BEETROOTS("beetroots"), + BELL("bell"), + BIG_DRIPLEAF("big_dripleaf"), + BIG_DRIPLEAF_STEM("big_dripleaf_stem"), + BIRCH_BUTTON("birch_button"), + BIRCH_DOOR("birch_door"), + BIRCH_FENCE("birch_fence"), + BIRCH_FENCE_GATE("birch_fence_gate"), + BIRCH_LEAVES("birch_leaves"), + BIRCH_LOG("birch_log"), + BIRCH_PLANKS("birch_planks"), + BIRCH_PRESSURE_PLATE("birch_pressure_plate"), + BIRCH_SAPLING("birch_sapling"), + BIRCH_SIGN("birch_sign"), + BIRCH_SLAB("birch_slab"), + BIRCH_STAIRS("birch_stairs"), + BIRCH_TRAPDOOR("birch_trapdoor"), + BIRCH_WALL_SIGN("birch_wall_sign"), + BIRCH_WOOD("birch_wood"), + BLACK_BANNER("black_banner"), + BLACK_BED("black_bed"), + BLACK_CANDLE("black_candle"), + BLACK_CANDLE_CAKE("black_candle_cake"), + BLACK_CARPET("black_carpet"), + BLACK_CONCRETE("black_concrete"), + BLACK_CONCRETE_POWDER("black_concrete_powder"), + BLACK_GLAZED_TERRACOTTA("black_glazed_terracotta"), + BLACK_SHULKER_BOX("black_shulker_box"), + BLACK_STAINED_GLASS("black_stained_glass"), + BLACK_STAINED_GLASS_PANE("black_stained_glass_pane"), + BLACK_TERRACOTTA("black_terracotta"), + BLACK_WALL_BANNER("black_wall_banner"), + BLACK_WOOL("black_wool"), + BLACKSTONE("blackstone"), + BLACKSTONE_SLAB("blackstone_slab"), + BLACKSTONE_STAIRS("blackstone_stairs"), + BLACKSTONE_WALL("blackstone_wall"), + BLAST_FURNACE("blast_furnace"), + BLUE_BANNER("blue_banner"), + BLUE_BED("blue_bed"), + BLUE_CANDLE("blue_candle"), + BLUE_CANDLE_CAKE("blue_candle_cake"), + BLUE_CARPET("blue_carpet"), + BLUE_CONCRETE("blue_concrete"), + BLUE_CONCRETE_POWDER("blue_concrete_powder"), + BLUE_GLAZED_TERRACOTTA("blue_glazed_terracotta"), + BLUE_ICE("blue_ice"), + BLUE_ORCHID("blue_orchid"), + BLUE_SHULKER_BOX("blue_shulker_box"), + BLUE_STAINED_GLASS("blue_stained_glass"), + BLUE_STAINED_GLASS_PANE("blue_stained_glass_pane"), + BLUE_TERRACOTTA("blue_terracotta"), + BLUE_WALL_BANNER("blue_wall_banner"), + BLUE_WOOL("blue_wool"), + BONE_BLOCK("bone_block"), + BOOKSHELF("bookshelf"), + BRAIN_CORAL("brain_coral"), + BRAIN_CORAL_BLOCK("brain_coral_block"), + BRAIN_CORAL_FAN("brain_coral_fan"), + BRAIN_CORAL_WALL_FAN("brain_coral_wall_fan"), + BREWING_STAND("brewing_stand"), + BRICK_SLAB("brick_slab"), + BRICK_STAIRS("brick_stairs"), + BRICK_WALL("brick_wall"), + BRICKS("bricks"), + BROWN_BANNER("brown_banner"), + BROWN_BED("brown_bed"), + BROWN_CANDLE("brown_candle"), + BROWN_CANDLE_CAKE("brown_candle_cake"), + BROWN_CARPET("brown_carpet"), + BROWN_CONCRETE("brown_concrete"), + BROWN_CONCRETE_POWDER("brown_concrete_powder"), + BROWN_GLAZED_TERRACOTTA("brown_glazed_terracotta"), + BROWN_MUSHROOM("brown_mushroom"), + BROWN_MUSHROOM_BLOCK("brown_mushroom_block"), + BROWN_SHULKER_BOX("brown_shulker_box"), + BROWN_STAINED_GLASS("brown_stained_glass"), + BROWN_STAINED_GLASS_PANE("brown_stained_glass_pane"), + BROWN_TERRACOTTA("brown_terracotta"), + BROWN_WALL_BANNER("brown_wall_banner"), + BROWN_WOOL("brown_wool"), + BUBBLE_COLUMN("bubble_column"), + BUBBLE_CORAL("bubble_coral"), + BUBBLE_CORAL_BLOCK("bubble_coral_block"), + BUBBLE_CORAL_FAN("bubble_coral_fan"), + BUBBLE_CORAL_WALL_FAN("bubble_coral_wall_fan"), + BUDDING_AMETHYST("budding_amethyst"), + CACTUS("cactus"), + CAKE("cake"), + CALCITE("calcite"), + CAMPFIRE("campfire"), + CANDLE("candle"), + CANDLE_CAKE("candle_cake"), + CARROTS("carrots"), + CARTOGRAPHY_TABLE("cartography_table"), + CARVED_PUMPKIN("carved_pumpkin"), + CAULDRON("cauldron"), + CAVE_AIR("cave_air"), + CAVE_VINES("cave_vines"), + CAVE_VINES_PLANT("cave_vines_plant"), + CHAIN("chain"), + CHAIN_COMMAND_BLOCK("chain_command_block"), + CHEST("chest"), + CHIPPED_ANVIL("chipped_anvil"), + CHISELED_DEEPSLATE("chiseled_deepslate"), + CHISELED_NETHER_BRICKS("chiseled_nether_bricks"), + CHISELED_POLISHED_BLACKSTONE("chiseled_polished_blackstone"), + CHISELED_QUARTZ_BLOCK("chiseled_quartz_block"), + CHISELED_RED_SANDSTONE("chiseled_red_sandstone"), + CHISELED_SANDSTONE("chiseled_sandstone"), + CHISELED_STONE_BRICKS("chiseled_stone_bricks"), + CHORUS_FLOWER("chorus_flower"), + CHORUS_PLANT("chorus_plant"), + CLAY("clay"), + COAL_BLOCK("coal_block"), + COAL_ORE("coal_ore"), + COARSE_DIRT("coarse_dirt"), + COBBLED_DEEPSLATE("cobbled_deepslate"), + COBBLED_DEEPSLATE_SLAB("cobbled_deepslate_slab"), + COBBLED_DEEPSLATE_STAIRS("cobbled_deepslate_stairs"), + COBBLED_DEEPSLATE_WALL("cobbled_deepslate_wall"), + COBBLESTONE("cobblestone"), + COBBLESTONE_SLAB("cobblestone_slab"), + COBBLESTONE_STAIRS("cobblestone_stairs"), + COBBLESTONE_WALL("cobblestone_wall"), + COBWEB("cobweb"), + COCOA("cocoa"), + COMMAND_BLOCK("command_block"), + COMPARATOR("comparator"), + COMPOSTER("composter"), + CONDUIT("conduit"), + COPPER_BLOCK("copper_block"), + COPPER_ORE("copper_ore"), + CORNFLOWER("cornflower"), + CRACKED_DEEPSLATE_BRICKS("cracked_deepslate_bricks"), + CRACKED_DEEPSLATE_TILES("cracked_deepslate_tiles"), + CRACKED_NETHER_BRICKS("cracked_nether_bricks"), + CRACKED_POLISHED_BLACKSTONE_BRICKS("cracked_polished_blackstone_bricks"), + CRACKED_STONE_BRICKS("cracked_stone_bricks"), + CRAFTING_TABLE("crafting_table"), + CREEPER_HEAD("creeper_head"), + CREEPER_WALL_HEAD("creeper_wall_head"), + CRIMSON_BUTTON("crimson_button"), + CRIMSON_DOOR("crimson_door"), + CRIMSON_FENCE("crimson_fence"), + CRIMSON_FENCE_GATE("crimson_fence_gate"), + CRIMSON_FUNGUS("crimson_fungus"), + CRIMSON_HYPHAE("crimson_hyphae"), + CRIMSON_NYLIUM("crimson_nylium"), + CRIMSON_PLANKS("crimson_planks"), + CRIMSON_PRESSURE_PLATE("crimson_pressure_plate"), + CRIMSON_ROOTS("crimson_roots"), + CRIMSON_SIGN("crimson_sign"), + CRIMSON_SLAB("crimson_slab"), + CRIMSON_STAIRS("crimson_stairs"), + CRIMSON_STEM("crimson_stem"), + CRIMSON_TRAPDOOR("crimson_trapdoor"), + CRIMSON_WALL_SIGN("crimson_wall_sign"), + CRYING_OBSIDIAN("crying_obsidian"), + CUT_COPPER("cut_copper"), + CUT_COPPER_SLAB("cut_copper_slab"), + CUT_COPPER_STAIRS("cut_copper_stairs"), + CUT_RED_SANDSTONE("cut_red_sandstone"), + CUT_RED_SANDSTONE_SLAB("cut_red_sandstone_slab"), + CUT_SANDSTONE("cut_sandstone"), + CUT_SANDSTONE_SLAB("cut_sandstone_slab"), + CYAN_BANNER("cyan_banner"), + CYAN_BED("cyan_bed"), + CYAN_CANDLE("cyan_candle"), + CYAN_CANDLE_CAKE("cyan_candle_cake"), + CYAN_CARPET("cyan_carpet"), + CYAN_CONCRETE("cyan_concrete"), + CYAN_CONCRETE_POWDER("cyan_concrete_powder"), + CYAN_GLAZED_TERRACOTTA("cyan_glazed_terracotta"), + CYAN_SHULKER_BOX("cyan_shulker_box"), + CYAN_STAINED_GLASS("cyan_stained_glass"), + CYAN_STAINED_GLASS_PANE("cyan_stained_glass_pane"), + CYAN_TERRACOTTA("cyan_terracotta"), + CYAN_WALL_BANNER("cyan_wall_banner"), + CYAN_WOOL("cyan_wool"), + DAMAGED_ANVIL("damaged_anvil"), + DANDELION("dandelion"), + DARK_OAK_BUTTON("dark_oak_button"), + DARK_OAK_DOOR("dark_oak_door"), + DARK_OAK_FENCE("dark_oak_fence"), + DARK_OAK_FENCE_GATE("dark_oak_fence_gate"), + DARK_OAK_LEAVES("dark_oak_leaves"), + DARK_OAK_LOG("dark_oak_log"), + DARK_OAK_PLANKS("dark_oak_planks"), + DARK_OAK_PRESSURE_PLATE("dark_oak_pressure_plate"), + DARK_OAK_SAPLING("dark_oak_sapling"), + DARK_OAK_SIGN("dark_oak_sign"), + DARK_OAK_SLAB("dark_oak_slab"), + DARK_OAK_STAIRS("dark_oak_stairs"), + DARK_OAK_TRAPDOOR("dark_oak_trapdoor"), + DARK_OAK_WALL_SIGN("dark_oak_wall_sign"), + DARK_OAK_WOOD("dark_oak_wood"), + DARK_PRISMARINE("dark_prismarine"), + DARK_PRISMARINE_SLAB("dark_prismarine_slab"), + DARK_PRISMARINE_STAIRS("dark_prismarine_stairs"), + DAYLIGHT_DETECTOR("daylight_detector"), + DEAD_BRAIN_CORAL("dead_brain_coral"), + DEAD_BRAIN_CORAL_BLOCK("dead_brain_coral_block"), + DEAD_BRAIN_CORAL_FAN("dead_brain_coral_fan"), + DEAD_BRAIN_CORAL_WALL_FAN("dead_brain_coral_wall_fan"), + DEAD_BUBBLE_CORAL("dead_bubble_coral"), + DEAD_BUBBLE_CORAL_BLOCK("dead_bubble_coral_block"), + DEAD_BUBBLE_CORAL_FAN("dead_bubble_coral_fan"), + DEAD_BUBBLE_CORAL_WALL_FAN("dead_bubble_coral_wall_fan"), + DEAD_BUSH("dead_bush"), + DEAD_FIRE_CORAL("dead_fire_coral"), + DEAD_FIRE_CORAL_BLOCK("dead_fire_coral_block"), + DEAD_FIRE_CORAL_FAN("dead_fire_coral_fan"), + DEAD_FIRE_CORAL_WALL_FAN("dead_fire_coral_wall_fan"), + DEAD_HORN_CORAL("dead_horn_coral"), + DEAD_HORN_CORAL_BLOCK("dead_horn_coral_block"), + DEAD_HORN_CORAL_FAN("dead_horn_coral_fan"), + DEAD_HORN_CORAL_WALL_FAN("dead_horn_coral_wall_fan"), + DEAD_TUBE_CORAL("dead_tube_coral"), + DEAD_TUBE_CORAL_BLOCK("dead_tube_coral_block"), + DEAD_TUBE_CORAL_FAN("dead_tube_coral_fan"), + DEAD_TUBE_CORAL_WALL_FAN("dead_tube_coral_wall_fan"), + DEEPSLATE("deepslate"), + DEEPSLATE_BRICK_SLAB("deepslate_brick_slab"), + DEEPSLATE_BRICK_STAIRS("deepslate_brick_stairs"), + DEEPSLATE_BRICK_WALL("deepslate_brick_wall"), + DEEPSLATE_BRICKS("deepslate_bricks"), + DEEPSLATE_COAL_ORE("deepslate_coal_ore"), + DEEPSLATE_COPPER_ORE("deepslate_copper_ore"), + DEEPSLATE_DIAMOND_ORE("deepslate_diamond_ore"), + DEEPSLATE_EMERALD_ORE("deepslate_emerald_ore"), + DEEPSLATE_GOLD_ORE("deepslate_gold_ore"), + DEEPSLATE_IRON_ORE("deepslate_iron_ore"), + DEEPSLATE_LAPIS_ORE("deepslate_lapis_ore"), + DEEPSLATE_REDSTONE_ORE("deepslate_redstone_ore"), + DEEPSLATE_TILE_SLAB("deepslate_tile_slab"), + DEEPSLATE_TILE_STAIRS("deepslate_tile_stairs"), + DEEPSLATE_TILE_WALL("deepslate_tile_wall"), + DEEPSLATE_TILES("deepslate_tiles"), + DETECTOR_RAIL("detector_rail"), + DIAMOND_BLOCK("diamond_block"), + DIAMOND_ORE("diamond_ore"), + DIORITE("diorite"), + DIORITE_SLAB("diorite_slab"), + DIORITE_STAIRS("diorite_stairs"), + DIORITE_WALL("diorite_wall"), + DIRT("dirt"), + DIRT_PATH("dirt_path"), + DISPENSER("dispenser"), + DRAGON_EGG("dragon_egg"), + DRAGON_HEAD("dragon_head"), + DRAGON_WALL_HEAD("dragon_wall_head"), + DRIED_KELP_BLOCK("dried_kelp_block"), + DRIPSTONE_BLOCK("dripstone_block"), + DROPPER("dropper"), + EMERALD_BLOCK("emerald_block"), + EMERALD_ORE("emerald_ore"), + ENCHANTING_TABLE("enchanting_table"), + END_GATEWAY("end_gateway"), + END_PORTAL("end_portal"), + END_PORTAL_FRAME("end_portal_frame"), + END_ROD("end_rod"), + END_STONE("end_stone"), + END_STONE_BRICK_SLAB("end_stone_brick_slab"), + END_STONE_BRICK_STAIRS("end_stone_brick_stairs"), + END_STONE_BRICK_WALL("end_stone_brick_wall"), + END_STONE_BRICKS("end_stone_bricks"), + ENDER_CHEST("ender_chest"), + EXPOSED_COPPER("exposed_copper"), + EXPOSED_CUT_COPPER("exposed_cut_copper"), + EXPOSED_CUT_COPPER_SLAB("exposed_cut_copper_slab"), + EXPOSED_CUT_COPPER_STAIRS("exposed_cut_copper_stairs"), + FARMLAND("farmland"), + FERN("fern"), + FIRE("fire"), + FIRE_CORAL("fire_coral"), + FIRE_CORAL_BLOCK("fire_coral_block"), + FIRE_CORAL_FAN("fire_coral_fan"), + FIRE_CORAL_WALL_FAN("fire_coral_wall_fan"), + FLETCHING_TABLE("fletching_table"), + FLOWER_POT("flower_pot"), + FLOWERING_AZALEA("flowering_azalea"), + FLOWERING_AZALEA_LEAVES("flowering_azalea_leaves"), + FROSTED_ICE("frosted_ice"), + FURNACE("furnace"), + GILDED_BLACKSTONE("gilded_blackstone"), + GLASS("glass"), + GLASS_PANE("glass_pane"), + GLOW_LICHEN("glow_lichen"), + GLOWSTONE("glowstone"), + GOLD_BLOCK("gold_block"), + GOLD_ORE("gold_ore"), + GRANITE("granite"), + GRANITE_SLAB("granite_slab"), + GRANITE_STAIRS("granite_stairs"), + GRANITE_WALL("granite_wall"), + GRASS("grass"), + GRASS_BLOCK("grass_block"), + GRAVEL("gravel"), + GRAY_BANNER("gray_banner"), + GRAY_BED("gray_bed"), + GRAY_CANDLE("gray_candle"), + GRAY_CANDLE_CAKE("gray_candle_cake"), + GRAY_CARPET("gray_carpet"), + GRAY_CONCRETE("gray_concrete"), + GRAY_CONCRETE_POWDER("gray_concrete_powder"), + GRAY_GLAZED_TERRACOTTA("gray_glazed_terracotta"), + GRAY_SHULKER_BOX("gray_shulker_box"), + GRAY_STAINED_GLASS("gray_stained_glass"), + GRAY_STAINED_GLASS_PANE("gray_stained_glass_pane"), + GRAY_TERRACOTTA("gray_terracotta"), + GRAY_WALL_BANNER("gray_wall_banner"), + GRAY_WOOL("gray_wool"), + GREEN_BANNER("green_banner"), + GREEN_BED("green_bed"), + GREEN_CANDLE("green_candle"), + GREEN_CANDLE_CAKE("green_candle_cake"), + GREEN_CARPET("green_carpet"), + GREEN_CONCRETE("green_concrete"), + GREEN_CONCRETE_POWDER("green_concrete_powder"), + GREEN_GLAZED_TERRACOTTA("green_glazed_terracotta"), + GREEN_SHULKER_BOX("green_shulker_box"), + GREEN_STAINED_GLASS("green_stained_glass"), + GREEN_STAINED_GLASS_PANE("green_stained_glass_pane"), + GREEN_TERRACOTTA("green_terracotta"), + GREEN_WALL_BANNER("green_wall_banner"), + GREEN_WOOL("green_wool"), + GRINDSTONE("grindstone"), + HANGING_ROOTS("hanging_roots"), + HAY_BLOCK("hay_block"), + HEAVY_WEIGHTED_PRESSURE_PLATE("heavy_weighted_pressure_plate"), + HONEY_BLOCK("honey_block"), + HONEYCOMB_BLOCK("honeycomb_block"), + HOPPER("hopper"), + HORN_CORAL("horn_coral"), + HORN_CORAL_BLOCK("horn_coral_block"), + HORN_CORAL_FAN("horn_coral_fan"), + HORN_CORAL_WALL_FAN("horn_coral_wall_fan"), + ICE("ice"), + INFESTED_CHISELED_STONE_BRICKS("infested_chiseled_stone_bricks"), + INFESTED_COBBLESTONE("infested_cobblestone"), + INFESTED_CRACKED_STONE_BRICKS("infested_cracked_stone_bricks"), + INFESTED_DEEPSLATE("infested_deepslate"), + INFESTED_MOSSY_STONE_BRICKS("infested_mossy_stone_bricks"), + INFESTED_STONE("infested_stone"), + INFESTED_STONE_BRICKS("infested_stone_bricks"), + IRON_BARS("iron_bars"), + IRON_BLOCK("iron_block"), + IRON_DOOR("iron_door"), + IRON_ORE("iron_ore"), + IRON_TRAPDOOR("iron_trapdoor"), + JACK_O_LANTERN("jack_o_lantern"), + JIGSAW("jigsaw"), + JUKEBOX("jukebox"), + JUNGLE_BUTTON("jungle_button"), + JUNGLE_DOOR("jungle_door"), + JUNGLE_FENCE("jungle_fence"), + JUNGLE_FENCE_GATE("jungle_fence_gate"), + JUNGLE_LEAVES("jungle_leaves"), + JUNGLE_LOG("jungle_log"), + JUNGLE_PLANKS("jungle_planks"), + JUNGLE_PRESSURE_PLATE("jungle_pressure_plate"), + JUNGLE_SAPLING("jungle_sapling"), + JUNGLE_SIGN("jungle_sign"), + JUNGLE_SLAB("jungle_slab"), + JUNGLE_STAIRS("jungle_stairs"), + JUNGLE_TRAPDOOR("jungle_trapdoor"), + JUNGLE_WALL_SIGN("jungle_wall_sign"), + JUNGLE_WOOD("jungle_wood"), + KELP("kelp"), + KELP_PLANT("kelp_plant"), + LADDER("ladder"), + LANTERN("lantern"), + LAPIS_BLOCK("lapis_block"), + LAPIS_ORE("lapis_ore"), + LARGE_AMETHYST_BUD("large_amethyst_bud"), + LARGE_FERN("large_fern"), + LAVA("lava"), + LAVA_CAULDRON("lava_cauldron"), + LECTERN("lectern"), + LEVER("lever"), + LIGHT("light"), + LIGHT_BLUE_BANNER("light_blue_banner"), + LIGHT_BLUE_BED("light_blue_bed"), + LIGHT_BLUE_CANDLE("light_blue_candle"), + LIGHT_BLUE_CANDLE_CAKE("light_blue_candle_cake"), + LIGHT_BLUE_CARPET("light_blue_carpet"), + LIGHT_BLUE_CONCRETE("light_blue_concrete"), + LIGHT_BLUE_CONCRETE_POWDER("light_blue_concrete_powder"), + LIGHT_BLUE_GLAZED_TERRACOTTA("light_blue_glazed_terracotta"), + LIGHT_BLUE_SHULKER_BOX("light_blue_shulker_box"), + LIGHT_BLUE_STAINED_GLASS("light_blue_stained_glass"), + LIGHT_BLUE_STAINED_GLASS_PANE("light_blue_stained_glass_pane"), + LIGHT_BLUE_TERRACOTTA("light_blue_terracotta"), + LIGHT_BLUE_WALL_BANNER("light_blue_wall_banner"), + LIGHT_BLUE_WOOL("light_blue_wool"), + LIGHT_GRAY_BANNER("light_gray_banner"), + LIGHT_GRAY_BED("light_gray_bed"), + LIGHT_GRAY_CANDLE("light_gray_candle"), + LIGHT_GRAY_CANDLE_CAKE("light_gray_candle_cake"), + LIGHT_GRAY_CARPET("light_gray_carpet"), + LIGHT_GRAY_CONCRETE("light_gray_concrete"), + LIGHT_GRAY_CONCRETE_POWDER("light_gray_concrete_powder"), + LIGHT_GRAY_GLAZED_TERRACOTTA("light_gray_glazed_terracotta"), + LIGHT_GRAY_SHULKER_BOX("light_gray_shulker_box"), + LIGHT_GRAY_STAINED_GLASS("light_gray_stained_glass"), + LIGHT_GRAY_STAINED_GLASS_PANE("light_gray_stained_glass_pane"), + LIGHT_GRAY_TERRACOTTA("light_gray_terracotta"), + LIGHT_GRAY_WALL_BANNER("light_gray_wall_banner"), + LIGHT_GRAY_WOOL("light_gray_wool"), + LIGHT_WEIGHTED_PRESSURE_PLATE("light_weighted_pressure_plate"), + LIGHTNING_ROD("lightning_rod"), + LILAC("lilac"), + LILY_OF_THE_VALLEY("lily_of_the_valley"), + LILY_PAD("lily_pad"), + LIME_BANNER("lime_banner"), + LIME_BED("lime_bed"), + LIME_CANDLE("lime_candle"), + LIME_CANDLE_CAKE("lime_candle_cake"), + LIME_CARPET("lime_carpet"), + LIME_CONCRETE("lime_concrete"), + LIME_CONCRETE_POWDER("lime_concrete_powder"), + LIME_GLAZED_TERRACOTTA("lime_glazed_terracotta"), + LIME_SHULKER_BOX("lime_shulker_box"), + LIME_STAINED_GLASS("lime_stained_glass"), + LIME_STAINED_GLASS_PANE("lime_stained_glass_pane"), + LIME_TERRACOTTA("lime_terracotta"), + LIME_WALL_BANNER("lime_wall_banner"), + LIME_WOOL("lime_wool"), + LODESTONE("lodestone"), + LOOM("loom"), + MAGENTA_BANNER("magenta_banner"), + MAGENTA_BED("magenta_bed"), + MAGENTA_CANDLE("magenta_candle"), + MAGENTA_CANDLE_CAKE("magenta_candle_cake"), + MAGENTA_CARPET("magenta_carpet"), + MAGENTA_CONCRETE("magenta_concrete"), + MAGENTA_CONCRETE_POWDER("magenta_concrete_powder"), + MAGENTA_GLAZED_TERRACOTTA("magenta_glazed_terracotta"), + MAGENTA_SHULKER_BOX("magenta_shulker_box"), + MAGENTA_STAINED_GLASS("magenta_stained_glass"), + MAGENTA_STAINED_GLASS_PANE("magenta_stained_glass_pane"), + MAGENTA_TERRACOTTA("magenta_terracotta"), + MAGENTA_WALL_BANNER("magenta_wall_banner"), + MAGENTA_WOOL("magenta_wool"), + MAGMA_BLOCK("magma_block"), + MEDIUM_AMETHYST_BUD("medium_amethyst_bud"), + MELON("melon"), + MELON_STEM("melon_stem"), + MOSS_BLOCK("moss_block"), + MOSS_CARPET("moss_carpet"), + MOSSY_COBBLESTONE("mossy_cobblestone"), + MOSSY_COBBLESTONE_SLAB("mossy_cobblestone_slab"), + MOSSY_COBBLESTONE_STAIRS("mossy_cobblestone_stairs"), + MOSSY_COBBLESTONE_WALL("mossy_cobblestone_wall"), + MOSSY_STONE_BRICK_SLAB("mossy_stone_brick_slab"), + MOSSY_STONE_BRICK_STAIRS("mossy_stone_brick_stairs"), + MOSSY_STONE_BRICK_WALL("mossy_stone_brick_wall"), + MOSSY_STONE_BRICKS("mossy_stone_bricks"), + MOVING_PISTON("moving_piston"), + MUSHROOM_STEM("mushroom_stem"), + MYCELIUM("mycelium"), + NETHER_BRICK_FENCE("nether_brick_fence"), + NETHER_BRICK_SLAB("nether_brick_slab"), + NETHER_BRICK_STAIRS("nether_brick_stairs"), + NETHER_BRICK_WALL("nether_brick_wall"), + NETHER_BRICKS("nether_bricks"), + NETHER_GOLD_ORE("nether_gold_ore"), + NETHER_PORTAL("nether_portal"), + NETHER_QUARTZ_ORE("nether_quartz_ore"), + NETHER_SPROUTS("nether_sprouts"), + NETHER_WART("nether_wart"), + NETHER_WART_BLOCK("nether_wart_block"), + NETHERITE_BLOCK("netherite_block"), + NETHERRACK("netherrack"), + NOTE_BLOCK("note_block"), + OAK_BUTTON("oak_button"), + OAK_DOOR("oak_door"), + OAK_FENCE("oak_fence"), + OAK_FENCE_GATE("oak_fence_gate"), + OAK_LEAVES("oak_leaves"), + OAK_LOG("oak_log"), + OAK_PLANKS("oak_planks"), + OAK_PRESSURE_PLATE("oak_pressure_plate"), + OAK_SAPLING("oak_sapling"), + OAK_SIGN("oak_sign"), + OAK_SLAB("oak_slab"), + OAK_STAIRS("oak_stairs"), + OAK_TRAPDOOR("oak_trapdoor"), + OAK_WALL_SIGN("oak_wall_sign"), + OAK_WOOD("oak_wood"), + OBSERVER("observer"), + OBSIDIAN("obsidian"), + ORANGE_BANNER("orange_banner"), + ORANGE_BED("orange_bed"), + ORANGE_CANDLE("orange_candle"), + ORANGE_CANDLE_CAKE("orange_candle_cake"), + ORANGE_CARPET("orange_carpet"), + ORANGE_CONCRETE("orange_concrete"), + ORANGE_CONCRETE_POWDER("orange_concrete_powder"), + ORANGE_GLAZED_TERRACOTTA("orange_glazed_terracotta"), + ORANGE_SHULKER_BOX("orange_shulker_box"), + ORANGE_STAINED_GLASS("orange_stained_glass"), + ORANGE_STAINED_GLASS_PANE("orange_stained_glass_pane"), + ORANGE_TERRACOTTA("orange_terracotta"), + ORANGE_TULIP("orange_tulip"), + ORANGE_WALL_BANNER("orange_wall_banner"), + ORANGE_WOOL("orange_wool"), + OXEYE_DAISY("oxeye_daisy"), + OXIDIZED_COPPER("oxidized_copper"), + OXIDIZED_CUT_COPPER("oxidized_cut_copper"), + OXIDIZED_CUT_COPPER_SLAB("oxidized_cut_copper_slab"), + OXIDIZED_CUT_COPPER_STAIRS("oxidized_cut_copper_stairs"), + PACKED_ICE("packed_ice"), + PEONY("peony"), + PETRIFIED_OAK_SLAB("petrified_oak_slab"), + PINK_BANNER("pink_banner"), + PINK_BED("pink_bed"), + PINK_CANDLE("pink_candle"), + PINK_CANDLE_CAKE("pink_candle_cake"), + PINK_CARPET("pink_carpet"), + PINK_CONCRETE("pink_concrete"), + PINK_CONCRETE_POWDER("pink_concrete_powder"), + PINK_GLAZED_TERRACOTTA("pink_glazed_terracotta"), + PINK_SHULKER_BOX("pink_shulker_box"), + PINK_STAINED_GLASS("pink_stained_glass"), + PINK_STAINED_GLASS_PANE("pink_stained_glass_pane"), + PINK_TERRACOTTA("pink_terracotta"), + PINK_TULIP("pink_tulip"), + PINK_WALL_BANNER("pink_wall_banner"), + PINK_WOOL("pink_wool"), + PISTON("piston"), + PISTON_HEAD("piston_head"), + PLAYER_HEAD("player_head"), + PLAYER_WALL_HEAD("player_wall_head"), + PODZOL("podzol"), + POINTED_DRIPSTONE("pointed_dripstone"), + POLISHED_ANDESITE("polished_andesite"), + POLISHED_ANDESITE_SLAB("polished_andesite_slab"), + POLISHED_ANDESITE_STAIRS("polished_andesite_stairs"), + POLISHED_BASALT("polished_basalt"), + POLISHED_BLACKSTONE("polished_blackstone"), + POLISHED_BLACKSTONE_BRICK_SLAB("polished_blackstone_brick_slab"), + POLISHED_BLACKSTONE_BRICK_STAIRS("polished_blackstone_brick_stairs"), + POLISHED_BLACKSTONE_BRICK_WALL("polished_blackstone_brick_wall"), + POLISHED_BLACKSTONE_BRICKS("polished_blackstone_bricks"), + POLISHED_BLACKSTONE_BUTTON("polished_blackstone_button"), + POLISHED_BLACKSTONE_PRESSURE_PLATE("polished_blackstone_pressure_plate"), + POLISHED_BLACKSTONE_SLAB("polished_blackstone_slab"), + POLISHED_BLACKSTONE_STAIRS("polished_blackstone_stairs"), + POLISHED_BLACKSTONE_WALL("polished_blackstone_wall"), + POLISHED_DEEPSLATE("polished_deepslate"), + POLISHED_DEEPSLATE_SLAB("polished_deepslate_slab"), + POLISHED_DEEPSLATE_STAIRS("polished_deepslate_stairs"), + POLISHED_DEEPSLATE_WALL("polished_deepslate_wall"), + POLISHED_DIORITE("polished_diorite"), + POLISHED_DIORITE_SLAB("polished_diorite_slab"), + POLISHED_DIORITE_STAIRS("polished_diorite_stairs"), + POLISHED_GRANITE("polished_granite"), + POLISHED_GRANITE_SLAB("polished_granite_slab"), + POLISHED_GRANITE_STAIRS("polished_granite_stairs"), + POPPY("poppy"), + POTATOES("potatoes"), + POTTED_ACACIA_SAPLING("potted_acacia_sapling"), + POTTED_ALLIUM("potted_allium"), + POTTED_AZALEA_BUSH("potted_azalea_bush"), + POTTED_AZURE_BLUET("potted_azure_bluet"), + POTTED_BAMBOO("potted_bamboo"), + POTTED_BIRCH_SAPLING("potted_birch_sapling"), + POTTED_BLUE_ORCHID("potted_blue_orchid"), + POTTED_BROWN_MUSHROOM("potted_brown_mushroom"), + POTTED_CACTUS("potted_cactus"), + POTTED_CORNFLOWER("potted_cornflower"), + POTTED_CRIMSON_FUNGUS("potted_crimson_fungus"), + POTTED_CRIMSON_ROOTS("potted_crimson_roots"), + POTTED_DANDELION("potted_dandelion"), + POTTED_DARK_OAK_SAPLING("potted_dark_oak_sapling"), + POTTED_DEAD_BUSH("potted_dead_bush"), + POTTED_FERN("potted_fern"), + POTTED_FLOWERING_AZALEA_BUSH("potted_flowering_azalea_bush"), + POTTED_JUNGLE_SAPLING("potted_jungle_sapling"), + POTTED_LILY_OF_THE_VALLEY("potted_lily_of_the_valley"), + POTTED_OAK_SAPLING("potted_oak_sapling"), + POTTED_ORANGE_TULIP("potted_orange_tulip"), + POTTED_OXEYE_DAISY("potted_oxeye_daisy"), + POTTED_PINK_TULIP("potted_pink_tulip"), + POTTED_POPPY("potted_poppy"), + POTTED_RED_MUSHROOM("potted_red_mushroom"), + POTTED_RED_TULIP("potted_red_tulip"), + POTTED_SPRUCE_SAPLING("potted_spruce_sapling"), + POTTED_WARPED_FUNGUS("potted_warped_fungus"), + POTTED_WARPED_ROOTS("potted_warped_roots"), + POTTED_WHITE_TULIP("potted_white_tulip"), + POTTED_WITHER_ROSE("potted_wither_rose"), + POWDER_SNOW("powder_snow"), + POWDER_SNOW_CAULDRON("powder_snow_cauldron"), + POWERED_RAIL("powered_rail"), + PRISMARINE("prismarine"), + PRISMARINE_BRICK_SLAB("prismarine_brick_slab"), + PRISMARINE_BRICK_STAIRS("prismarine_brick_stairs"), + PRISMARINE_BRICKS("prismarine_bricks"), + PRISMARINE_SLAB("prismarine_slab"), + PRISMARINE_STAIRS("prismarine_stairs"), + PRISMARINE_WALL("prismarine_wall"), + PUMPKIN("pumpkin"), + PUMPKIN_STEM("pumpkin_stem"), + PURPLE_BANNER("purple_banner"), + PURPLE_BED("purple_bed"), + PURPLE_CANDLE("purple_candle"), + PURPLE_CANDLE_CAKE("purple_candle_cake"), + PURPLE_CARPET("purple_carpet"), + PURPLE_CONCRETE("purple_concrete"), + PURPLE_CONCRETE_POWDER("purple_concrete_powder"), + PURPLE_GLAZED_TERRACOTTA("purple_glazed_terracotta"), + PURPLE_SHULKER_BOX("purple_shulker_box"), + PURPLE_STAINED_GLASS("purple_stained_glass"), + PURPLE_STAINED_GLASS_PANE("purple_stained_glass_pane"), + PURPLE_TERRACOTTA("purple_terracotta"), + PURPLE_WALL_BANNER("purple_wall_banner"), + PURPLE_WOOL("purple_wool"), + PURPUR_BLOCK("purpur_block"), + PURPUR_PILLAR("purpur_pillar"), + PURPUR_SLAB("purpur_slab"), + PURPUR_STAIRS("purpur_stairs"), + QUARTZ_BLOCK("quartz_block"), + QUARTZ_BRICKS("quartz_bricks"), + QUARTZ_PILLAR("quartz_pillar"), + QUARTZ_SLAB("quartz_slab"), + QUARTZ_STAIRS("quartz_stairs"), + RAIL("rail"), + RAW_COPPER_BLOCK("raw_copper_block"), + RAW_GOLD_BLOCK("raw_gold_block"), + RAW_IRON_BLOCK("raw_iron_block"), + RED_BANNER("red_banner"), + RED_BED("red_bed"), + RED_CANDLE("red_candle"), + RED_CANDLE_CAKE("red_candle_cake"), + RED_CARPET("red_carpet"), + RED_CONCRETE("red_concrete"), + RED_CONCRETE_POWDER("red_concrete_powder"), + RED_GLAZED_TERRACOTTA("red_glazed_terracotta"), + RED_MUSHROOM("red_mushroom"), + RED_MUSHROOM_BLOCK("red_mushroom_block"), + RED_NETHER_BRICK_SLAB("red_nether_brick_slab"), + RED_NETHER_BRICK_STAIRS("red_nether_brick_stairs"), + RED_NETHER_BRICK_WALL("red_nether_brick_wall"), + RED_NETHER_BRICKS("red_nether_bricks"), + RED_SAND("red_sand"), + RED_SANDSTONE("red_sandstone"), + RED_SANDSTONE_SLAB("red_sandstone_slab"), + RED_SANDSTONE_STAIRS("red_sandstone_stairs"), + RED_SANDSTONE_WALL("red_sandstone_wall"), + RED_SHULKER_BOX("red_shulker_box"), + RED_STAINED_GLASS("red_stained_glass"), + RED_STAINED_GLASS_PANE("red_stained_glass_pane"), + RED_TERRACOTTA("red_terracotta"), + RED_TULIP("red_tulip"), + RED_WALL_BANNER("red_wall_banner"), + RED_WOOL("red_wool"), + REDSTONE_BLOCK("redstone_block"), + REDSTONE_LAMP("redstone_lamp"), + REDSTONE_ORE("redstone_ore"), + REDSTONE_TORCH("redstone_torch"), + REDSTONE_WALL_TORCH("redstone_wall_torch"), + REDSTONE_WIRE("redstone_wire"), + REPEATER("repeater"), + REPEATING_COMMAND_BLOCK("repeating_command_block"), + RESPAWN_ANCHOR("respawn_anchor"), + ROOTED_DIRT("rooted_dirt"), + ROSE_BUSH("rose_bush"), + SAND("sand"), + SANDSTONE("sandstone"), + SANDSTONE_SLAB("sandstone_slab"), + SANDSTONE_STAIRS("sandstone_stairs"), + SANDSTONE_WALL("sandstone_wall"), + SCAFFOLDING("scaffolding"), + SCULK_SENSOR("sculk_sensor"), + SEA_LANTERN("sea_lantern"), + SEA_PICKLE("sea_pickle"), + SEAGRASS("seagrass"), + SHROOMLIGHT("shroomlight"), + SHULKER_BOX("shulker_box"), + SKELETON_SKULL("skeleton_skull"), + SKELETON_WALL_SKULL("skeleton_wall_skull"), + SLIME_BLOCK("slime_block"), + SMALL_AMETHYST_BUD("small_amethyst_bud"), + SMALL_DRIPLEAF("small_dripleaf"), + SMITHING_TABLE("smithing_table"), + SMOKER("smoker"), + SMOOTH_BASALT("smooth_basalt"), + SMOOTH_QUARTZ("smooth_quartz"), + SMOOTH_QUARTZ_SLAB("smooth_quartz_slab"), + SMOOTH_QUARTZ_STAIRS("smooth_quartz_stairs"), + SMOOTH_RED_SANDSTONE("smooth_red_sandstone"), + SMOOTH_RED_SANDSTONE_SLAB("smooth_red_sandstone_slab"), + SMOOTH_RED_SANDSTONE_STAIRS("smooth_red_sandstone_stairs"), + SMOOTH_SANDSTONE("smooth_sandstone"), + SMOOTH_SANDSTONE_SLAB("smooth_sandstone_slab"), + SMOOTH_SANDSTONE_STAIRS("smooth_sandstone_stairs"), + SMOOTH_STONE("smooth_stone"), + SMOOTH_STONE_SLAB("smooth_stone_slab"), + SNOW("snow"), + SNOW_BLOCK("snow_block"), + SOUL_CAMPFIRE("soul_campfire"), + SOUL_FIRE("soul_fire"), + SOUL_LANTERN("soul_lantern"), + SOUL_SAND("soul_sand"), + SOUL_SOIL("soul_soil"), + SOUL_TORCH("soul_torch"), + SOUL_WALL_TORCH("soul_wall_torch"), + SPAWNER("spawner"), + SPONGE("sponge"), + SPORE_BLOSSOM("spore_blossom"), + SPRUCE_BUTTON("spruce_button"), + SPRUCE_DOOR("spruce_door"), + SPRUCE_FENCE("spruce_fence"), + SPRUCE_FENCE_GATE("spruce_fence_gate"), + SPRUCE_LEAVES("spruce_leaves"), + SPRUCE_LOG("spruce_log"), + SPRUCE_PLANKS("spruce_planks"), + SPRUCE_PRESSURE_PLATE("spruce_pressure_plate"), + SPRUCE_SAPLING("spruce_sapling"), + SPRUCE_SIGN("spruce_sign"), + SPRUCE_SLAB("spruce_slab"), + SPRUCE_STAIRS("spruce_stairs"), + SPRUCE_TRAPDOOR("spruce_trapdoor"), + SPRUCE_WALL_SIGN("spruce_wall_sign"), + SPRUCE_WOOD("spruce_wood"), + STICKY_PISTON("sticky_piston"), + STONE("stone"), + STONE_BRICK_SLAB("stone_brick_slab"), + STONE_BRICK_STAIRS("stone_brick_stairs"), + STONE_BRICK_WALL("stone_brick_wall"), + STONE_BRICKS("stone_bricks"), + STONE_BUTTON("stone_button"), + STONE_PRESSURE_PLATE("stone_pressure_plate"), + STONE_SLAB("stone_slab"), + STONE_STAIRS("stone_stairs"), + STONECUTTER("stonecutter"), + STRIPPED_ACACIA_LOG("stripped_acacia_log"), + STRIPPED_ACACIA_WOOD("stripped_acacia_wood"), + STRIPPED_BIRCH_LOG("stripped_birch_log"), + STRIPPED_BIRCH_WOOD("stripped_birch_wood"), + STRIPPED_CRIMSON_HYPHAE("stripped_crimson_hyphae"), + STRIPPED_CRIMSON_STEM("stripped_crimson_stem"), + STRIPPED_DARK_OAK_LOG("stripped_dark_oak_log"), + STRIPPED_DARK_OAK_WOOD("stripped_dark_oak_wood"), + STRIPPED_JUNGLE_LOG("stripped_jungle_log"), + STRIPPED_JUNGLE_WOOD("stripped_jungle_wood"), + STRIPPED_OAK_LOG("stripped_oak_log"), + STRIPPED_OAK_WOOD("stripped_oak_wood"), + STRIPPED_SPRUCE_LOG("stripped_spruce_log"), + STRIPPED_SPRUCE_WOOD("stripped_spruce_wood"), + STRIPPED_WARPED_HYPHAE("stripped_warped_hyphae"), + STRIPPED_WARPED_STEM("stripped_warped_stem"), + STRUCTURE_BLOCK("structure_block"), + STRUCTURE_VOID("structure_void"), + SUGAR_CANE("sugar_cane"), + SUNFLOWER("sunflower"), + SWEET_BERRY_BUSH("sweet_berry_bush"), + TALL_GRASS("tall_grass"), + TALL_SEAGRASS("tall_seagrass"), + TARGET("target"), + TERRACOTTA("terracotta"), + TINTED_GLASS("tinted_glass"), + TNT("tnt"), + TORCH("torch"), + TRAPPED_CHEST("trapped_chest"), + TRIPWIRE("tripwire"), + TRIPWIRE_HOOK("tripwire_hook"), + TUBE_CORAL("tube_coral"), + TUBE_CORAL_BLOCK("tube_coral_block"), + TUBE_CORAL_FAN("tube_coral_fan"), + TUBE_CORAL_WALL_FAN("tube_coral_wall_fan"), + TUFF("tuff"), + TURTLE_EGG("turtle_egg"), + TWISTING_VINES("twisting_vines"), + TWISTING_VINES_PLANT("twisting_vines_plant"), + VINE("vine"), + VOID_AIR("void_air"), + WALL_TORCH("wall_torch"), + WARPED_BUTTON("warped_button"), + WARPED_DOOR("warped_door"), + WARPED_FENCE("warped_fence"), + WARPED_FENCE_GATE("warped_fence_gate"), + WARPED_FUNGUS("warped_fungus"), + WARPED_HYPHAE("warped_hyphae"), + WARPED_NYLIUM("warped_nylium"), + WARPED_PLANKS("warped_planks"), + WARPED_PRESSURE_PLATE("warped_pressure_plate"), + WARPED_ROOTS("warped_roots"), + WARPED_SIGN("warped_sign"), + WARPED_SLAB("warped_slab"), + WARPED_STAIRS("warped_stairs"), + WARPED_STEM("warped_stem"), + WARPED_TRAPDOOR("warped_trapdoor"), + WARPED_WALL_SIGN("warped_wall_sign"), + WARPED_WART_BLOCK("warped_wart_block"), + WATER("water"), + WATER_CAULDRON("water_cauldron"), + WAXED_COPPER_BLOCK("waxed_copper_block"), + WAXED_CUT_COPPER("waxed_cut_copper"), + WAXED_CUT_COPPER_SLAB("waxed_cut_copper_slab"), + WAXED_CUT_COPPER_STAIRS("waxed_cut_copper_stairs"), + WAXED_EXPOSED_COPPER("waxed_exposed_copper"), + WAXED_EXPOSED_CUT_COPPER("waxed_exposed_cut_copper"), + WAXED_EXPOSED_CUT_COPPER_SLAB("waxed_exposed_cut_copper_slab"), + WAXED_EXPOSED_CUT_COPPER_STAIRS("waxed_exposed_cut_copper_stairs"), + WAXED_OXIDIZED_COPPER("waxed_oxidized_copper"), + WAXED_OXIDIZED_CUT_COPPER("waxed_oxidized_cut_copper"), + WAXED_OXIDIZED_CUT_COPPER_SLAB("waxed_oxidized_cut_copper_slab"), + WAXED_OXIDIZED_CUT_COPPER_STAIRS("waxed_oxidized_cut_copper_stairs"), + WAXED_WEATHERED_COPPER("waxed_weathered_copper"), + WAXED_WEATHERED_CUT_COPPER("waxed_weathered_cut_copper"), + WAXED_WEATHERED_CUT_COPPER_SLAB("waxed_weathered_cut_copper_slab"), + WAXED_WEATHERED_CUT_COPPER_STAIRS("waxed_weathered_cut_copper_stairs"), + WEATHERED_COPPER("weathered_copper"), + WEATHERED_CUT_COPPER("weathered_cut_copper"), + WEATHERED_CUT_COPPER_SLAB("weathered_cut_copper_slab"), + WEATHERED_CUT_COPPER_STAIRS("weathered_cut_copper_stairs"), + WEEPING_VINES("weeping_vines"), + WEEPING_VINES_PLANT("weeping_vines_plant"), + WET_SPONGE("wet_sponge"), + WHEAT("wheat"), + WHITE_BANNER("white_banner"), + WHITE_BED("white_bed"), + WHITE_CANDLE("white_candle"), + WHITE_CANDLE_CAKE("white_candle_cake"), + WHITE_CARPET("white_carpet"), + WHITE_CONCRETE("white_concrete"), + WHITE_CONCRETE_POWDER("white_concrete_powder"), + WHITE_GLAZED_TERRACOTTA("white_glazed_terracotta"), + WHITE_SHULKER_BOX("white_shulker_box"), + WHITE_STAINED_GLASS("white_stained_glass"), + WHITE_STAINED_GLASS_PANE("white_stained_glass_pane"), + WHITE_TERRACOTTA("white_terracotta"), + WHITE_TULIP("white_tulip"), + WHITE_WALL_BANNER("white_wall_banner"), + WHITE_WOOL("white_wool"), + WITHER_ROSE("wither_rose"), + WITHER_SKELETON_SKULL("wither_skeleton_skull"), + WITHER_SKELETON_WALL_SKULL("wither_skeleton_wall_skull"), + YELLOW_BANNER("yellow_banner"), + YELLOW_BED("yellow_bed"), + YELLOW_CANDLE("yellow_candle"), + YELLOW_CANDLE_CAKE("yellow_candle_cake"), + YELLOW_CARPET("yellow_carpet"), + YELLOW_CONCRETE("yellow_concrete"), + YELLOW_CONCRETE_POWDER("yellow_concrete_powder"), + YELLOW_GLAZED_TERRACOTTA("yellow_glazed_terracotta"), + YELLOW_SHULKER_BOX("yellow_shulker_box"), + YELLOW_STAINED_GLASS("yellow_stained_glass"), + YELLOW_STAINED_GLASS_PANE("yellow_stained_glass_pane"), + YELLOW_TERRACOTTA("yellow_terracotta"), + YELLOW_WALL_BANNER("yellow_wall_banner"), + YELLOW_WOOL("yellow_wool"), + ZOMBIE_HEAD("zombie_head"), + ZOMBIE_WALL_HEAD("zombie_wall_head"); + + fun toPath(): ResourcePath + { + return ResourcePath.ofNamespace("minecraft", id) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/ConditionType.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/ConditionType.kt new file mode 100644 index 0000000..d67a026 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/ConditionType.kt @@ -0,0 +1,11 @@ +package gay.pizza.foundation.drywall.enums + +enum class ConditionType(private val value: String) +{ + SURVIVES_EXPLOSION("survives_explosion"); + + override fun toString(): String + { + return "minecraft:$value" + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/EntryPoint.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/EntryPoint.kt new file mode 100644 index 0000000..a25ece7 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/EntryPoint.kt @@ -0,0 +1,11 @@ +package gay.pizza.foundation.drywall.enums + +data class EntryPoint(val name: String) +{ + companion object + { + final val MAIN = EntryPoint("main") + final val CLIENT = EntryPoint("client") + final val SERVER = EntryPoint("server") + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/EnvironmentType.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/EnvironmentType.kt new file mode 100644 index 0000000..a4491df --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/EnvironmentType.kt @@ -0,0 +1,13 @@ +package gay.pizza.foundation.drywall.enums + +enum class EnvironmentType(private val value: String) +{ + EVERYWHERE("*"), + CLIENT("client"), + SERVER("server"); + + override fun toString(): String + { + return value + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/Items.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/Items.kt new file mode 100644 index 0000000..a22f243 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/Items.kt @@ -0,0 +1,342 @@ +package gay.pizza.foundation.drywall.enums + +import gay.pizza.foundation.drywall.util.ResourcePath + +enum class Items(private val id: String) +{ + ACACIA_BOAT("acacia_boat"), + AMETHYST_SHARD("amethyst_shard"), + APPLE("apple"), + ARMOR_STAND("armor_stand"), + ARROW("arrow"), + AXOLOTL_BUCKET("axolotl_bucket"), + AXOLOTL_SPAWN_EGG("axolotl_spawn_egg"), + BAKED_POTATO("baked_potato"), + BAT_SPAWN_EGG("bat_spawn_egg"), + BEE_SPAWN_EGG("bee_spawn_egg"), + BEEF("beef"), + BEETROOT("beetroot"), + BEETROOT_SEEDS("beetroot_seeds"), + BEETROOT_SOUP("beetroot_soup"), + BIRCH_BOAT("birch_boat"), + BLACK_DYE("black_dye"), + BLAZE_POWDER("blaze_powder"), + BLAZE_ROD("blaze_rod"), + BLAZE_SPAWN_EGG("blaze_spawn_egg"), + BLUE_DYE("blue_dye"), + BONE("bone"), + BONE_MEAL("bone_meal"), + BOOK("book"), + BOW("bow"), + BOWL("bowl"), + BREAD("bread"), + BRICK("brick"), + BROWN_DYE("brown_dye"), + BUCKET("bucket"), + BUNDLE("bundle"), + CARROT("carrot"), + CARROT_ON_A_STICK("carrot_on_a_stick"), + CAT_SPAWN_EGG("cat_spawn_egg"), + CAVE_SPIDER_SPAWN_EGG("cave_spider_spawn_egg"), + CHAINMAIL_BOOTS("chainmail_boots"), + CHAINMAIL_CHESTPLATE("chainmail_chestplate"), + CHAINMAIL_HELMET("chainmail_helmet"), + CHAINMAIL_LEGGINGS("chainmail_leggings"), + CHARCOAL("charcoal"), + CHEST_MINECART("chest_minecart"), + CHICKEN("chicken"), + CHICKEN_SPAWN_EGG("chicken_spawn_egg"), + CHORUS_FRUIT("chorus_fruit"), + CLAY_BALL("clay_ball"), + CLOCK("clock"), + COAL("coal"), + COCOA_BEANS("cocoa_beans"), + COD("cod"), + COD_BUCKET("cod_bucket"), + COD_SPAWN_EGG("cod_spawn_egg"), + COMMAND_BLOCK_MINECART("command_block_minecart"), + COMPASS("compass"), + COOKED_BEEF("cooked_beef"), + COOKED_CHICKEN("cooked_chicken"), + COOKED_COD("cooked_cod"), + COOKED_MUTTON("cooked_mutton"), + COOKED_PORKCHOP("cooked_porkchop"), + COOKED_RABBIT("cooked_rabbit"), + COOKED_SALMON("cooked_salmon"), + COOKIE("cookie"), + COPPER_INGOT("copper_ingot"), + COW_SPAWN_EGG("cow_spawn_egg"), + CREEPER_BANNER_PATTERN("creeper_banner_pattern"), + CREEPER_SPAWN_EGG("creeper_spawn_egg"), + CROSSBOW("crossbow"), + CYAN_DYE("cyan_dye"), + DARK_OAK_BOAT("dark_oak_boat"), + DEBUG_STICK("debug_stick"), + DIAMOND("diamond"), + DIAMOND_AXE("diamond_axe"), + DIAMOND_BOOTS("diamond_boots"), + DIAMOND_CHESTPLATE("diamond_chestplate"), + DIAMOND_HELMET("diamond_helmet"), + DIAMOND_HOE("diamond_hoe"), + DIAMOND_HORSE_ARMOR("diamond_horse_armor"), + DIAMOND_LEGGINGS("diamond_leggings"), + DIAMOND_PICKAXE("diamond_pickaxe"), + DIAMOND_SHOVEL("diamond_shovel"), + DIAMOND_SWORD("diamond_sword"), + DOLPHIN_SPAWN_EGG("dolphin_spawn_egg"), + DONKEY_SPAWN_EGG("donkey_spawn_egg"), + DRAGON_BREATH("dragon_breath"), + DRIED_KELP("dried_kelp"), + DROWNED_SPAWN_EGG("drowned_spawn_egg"), + EGG("egg"), + ELDER_GUARDIAN_SPAWN_EGG("elder_guardian_spawn_egg"), + ELYTRA("elytra"), + EMERALD("emerald"), + ENCHANTED_BOOK("enchanted_book"), + ENCHANTED_GOLDEN_APPLE("enchanted_golden_apple"), + END_CRYSTAL("end_crystal"), + ENDER_EYE("ender_eye"), + ENDER_PEARL("ender_pearl"), + ENDERMAN_SPAWN_EGG("enderman_spawn_egg"), + ENDERMITE_SPAWN_EGG("endermite_spawn_egg"), + EVOKER_SPAWN_EGG("evoker_spawn_egg"), + EXPERIENCE_BOTTLE("experience_bottle"), + FEATHER("feather"), + FERMENTED_SPIDER_EYE("fermented_spider_eye"), + FILLED_MAP("filled_map"), + FIRE_CHARGE("fire_charge"), + FIREWORK_ROCKET("firework_rocket"), + FIREWORK_STAR("firework_star"), + FISHING_ROD("fishing_rod"), + FLINT("flint"), + FLINT_AND_STEEL("flint_and_steel"), + FLOWER_BANNER_PATTERN("flower_banner_pattern"), + FOX_SPAWN_EGG("fox_spawn_egg"), + FURNACE_MINECART("furnace_minecart"), + GHAST_SPAWN_EGG("ghast_spawn_egg"), + GHAST_TEAR("ghast_tear"), + GLASS_BOTTLE("glass_bottle"), + GLISTERING_MELON_SLICE("glistering_melon_slice"), + GLOBE_BANNER_PATTERN("globe_banner_pattern"), + GLOW_BERRIES("glow_berries"), + GLOW_INK_SAC("glow_ink_sac"), + GLOW_ITEM_FRAME("glow_item_frame"), + GLOW_SQUID_SPAWN_EGG("glow_squid_spawn_egg"), + GLOWSTONE_DUST("glowstone_dust"), + GOAT_SPAWN_EGG("goat_spawn_egg"), + GOLD_INGOT("gold_ingot"), + GOLD_NUGGET("gold_nugget"), + GOLDEN_APPLE("golden_apple"), + GOLDEN_AXE("golden_axe"), + GOLDEN_BOOTS("golden_boots"), + GOLDEN_CARROT("golden_carrot"), + GOLDEN_CHESTPLATE("golden_chestplate"), + GOLDEN_HELMET("golden_helmet"), + GOLDEN_HOE("golden_hoe"), + GOLDEN_HORSE_ARMOR("golden_horse_armor"), + GOLDEN_LEGGINGS("golden_leggings"), + GOLDEN_PICKAXE("golden_pickaxe"), + GOLDEN_SHOVEL("golden_shovel"), + GOLDEN_SWORD("golden_sword"), + GRAY_DYE("gray_dye"), + GREEN_DYE("green_dye"), + GUARDIAN_SPAWN_EGG("guardian_spawn_egg"), + GUNPOWDER("gunpowder"), + HEART_OF_THE_SEA("heart_of_the_sea"), + HOGLIN_SPAWN_EGG("hoglin_spawn_egg"), + HONEY_BOTTLE("honey_bottle"), + HONEYCOMB("honeycomb"), + HOPPER_MINECART("hopper_minecart"), + HORSE_SPAWN_EGG("horse_spawn_egg"), + HUSK_SPAWN_EGG("husk_spawn_egg"), + INK_SAC("ink_sac"), + IRON_AXE("iron_axe"), + IRON_BOOTS("iron_boots"), + IRON_CHESTPLATE("iron_chestplate"), + IRON_HELMET("iron_helmet"), + IRON_HOE("iron_hoe"), + IRON_HORSE_ARMOR("iron_horse_armor"), + IRON_INGOT("iron_ingot"), + IRON_LEGGINGS("iron_leggings"), + IRON_NUGGET("iron_nugget"), + IRON_PICKAXE("iron_pickaxe"), + IRON_SHOVEL("iron_shovel"), + IRON_SWORD("iron_sword"), + ITEM_FRAME("item_frame"), + JUNGLE_BOAT("jungle_boat"), + KNOWLEDGE_BOOK("knowledge_book"), + LAPIS_LAZULI("lapis_lazuli"), + LAVA_BUCKET("lava_bucket"), + LEAD("lead"), + LEATHER("leather"), + LEATHER_BOOTS("leather_boots"), + LEATHER_CHESTPLATE("leather_chestplate"), + LEATHER_HELMET("leather_helmet"), + LEATHER_HORSE_ARMOR("leather_horse_armor"), + LEATHER_LEGGINGS("leather_leggings"), + LIGHT_BLUE_DYE("light_blue_dye"), + LIGHT_GRAY_DYE("light_gray_dye"), + LIME_DYE("lime_dye"), + LINGERING_POTION("lingering_potion"), + LLAMA_SPAWN_EGG("llama_spawn_egg"), + MAGENTA_DYE("magenta_dye"), + MAGMA_CREAM("magma_cream"), + MAGMA_CUBE_SPAWN_EGG("magma_cube_spawn_egg"), + MAP("map"), + MELON_SEEDS("melon_seeds"), + MELON_SLICE("melon_slice"), + MILK_BUCKET("milk_bucket"), + MINECART("minecart"), + MOJANG_BANNER_PATTERN("mojang_banner_pattern"), + MOOSHROOM_SPAWN_EGG("mooshroom_spawn_egg"), + MULE_SPAWN_EGG("mule_spawn_egg"), + MUSHROOM_STEW("mushroom_stew"), + MUSIC_DISC_11("music_disc_11"), + MUSIC_DISC_13("music_disc_13"), + MUSIC_DISC_BLOCKS("music_disc_blocks"), + MUSIC_DISC_CAT("music_disc_cat"), + MUSIC_DISC_CHIRP("music_disc_chirp"), + MUSIC_DISC_FAR("music_disc_far"), + MUSIC_DISC_MALL("music_disc_mall"), + MUSIC_DISC_MELLOHI("music_disc_mellohi"), + MUSIC_DISC_OTHERSIDE("music_disc_otherside"), + MUSIC_DISC_PIGSTEP("music_disc_pigstep"), + MUSIC_DISC_STAL("music_disc_stal"), + MUSIC_DISC_STRAD("music_disc_strad"), + MUSIC_DISC_WAIT("music_disc_wait"), + MUSIC_DISC_WARD("music_disc_ward"), + MUTTON("mutton"), + NAME_TAG("name_tag"), + NAUTILUS_SHELL("nautilus_shell"), + NETHER_BRICK("nether_brick"), + NETHER_STAR("nether_star"), + NETHERITE_AXE("netherite_axe"), + NETHERITE_BOOTS("netherite_boots"), + NETHERITE_CHESTPLATE("netherite_chestplate"), + NETHERITE_HELMET("netherite_helmet"), + NETHERITE_HOE("netherite_hoe"), + NETHERITE_INGOT("netherite_ingot"), + NETHERITE_LEGGINGS("netherite_leggings"), + NETHERITE_PICKAXE("netherite_pickaxe"), + NETHERITE_SCRAP("netherite_scrap"), + NETHERITE_SHOVEL("netherite_shovel"), + NETHERITE_SWORD("netherite_sword"), + OAK_BOAT("oak_boat"), + OCELOT_SPAWN_EGG("ocelot_spawn_egg"), + ORANGE_DYE("orange_dye"), + PAINTING("painting"), + PANDA_SPAWN_EGG("panda_spawn_egg"), + PAPER("paper"), + PARROT_SPAWN_EGG("parrot_spawn_egg"), + PHANTOM_MEMBRANE("phantom_membrane"), + PHANTOM_SPAWN_EGG("phantom_spawn_egg"), + PIG_SPAWN_EGG("pig_spawn_egg"), + PIGLIN_BRUTE_SPAWN_EGG("piglin_brute_spawn_egg"), + PIGLIN_SPAWN_EGG("piglin_spawn_egg"), + PILLAGER_SPAWN_EGG("pillager_spawn_egg"), + PINK_DYE("pink_dye"), + POISONOUS_POTATO("poisonous_potato"), + POLAR_BEAR_SPAWN_EGG("polar_bear_spawn_egg"), + POPPED_CHORUS_FRUIT("popped_chorus_fruit"), + PORKCHOP("porkchop"), + POTATO("potato"), + POTION("potion"), + POWDER_SNOW_BUCKET("powder_snow_bucket"), + PRISMARINE_CRYSTALS("prismarine_crystals"), + PRISMARINE_SHARD("prismarine_shard"), + PUFFERFISH("pufferfish"), + PUFFERFISH_BUCKET("pufferfish_bucket"), + PUFFERFISH_SPAWN_EGG("pufferfish_spawn_egg"), + PUMPKIN_PIE("pumpkin_pie"), + PUMPKIN_SEEDS("pumpkin_seeds"), + PURPLE_DYE("purple_dye"), + QUARTZ("quartz"), + RABBIT("rabbit"), + RABBIT_FOOT("rabbit_foot"), + RABBIT_HIDE("rabbit_hide"), + RABBIT_SPAWN_EGG("rabbit_spawn_egg"), + RABBIT_STEW("rabbit_stew"), + RAVAGER_SPAWN_EGG("ravager_spawn_egg"), + RAW_COPPER("raw_copper"), + RAW_GOLD("raw_gold"), + RAW_IRON("raw_iron"), + RED_DYE("red_dye"), + REDSTONE("redstone"), + ROTTEN_FLESH("rotten_flesh"), + SADDLE("saddle"), + SALMON("salmon"), + SALMON_BUCKET("salmon_bucket"), + SALMON_SPAWN_EGG("salmon_spawn_egg"), + SCUTE("scute"), + SHEARS("shears"), + SHEEP_SPAWN_EGG("sheep_spawn_egg"), + SHIELD("shield"), + SHULKER_SHELL("shulker_shell"), + SHULKER_SPAWN_EGG("shulker_spawn_egg"), + SILVERFISH_SPAWN_EGG("silverfish_spawn_egg"), + SKELETON_HORSE_SPAWN_EGG("skeleton_horse_spawn_egg"), + SKELETON_SPAWN_EGG("skeleton_spawn_egg"), + SKULL_BANNER_PATTERN("skull_banner_pattern"), + SLIME_BALL("slime_ball"), + SLIME_SPAWN_EGG("slime_spawn_egg"), + SNOWBALL("snowball"), + SPECTRAL_ARROW("spectral_arrow"), + SPIDER_EYE("spider_eye"), + SPIDER_SPAWN_EGG("spider_spawn_egg"), + SPLASH_POTION("splash_potion"), + SPRUCE_BOAT("spruce_boat"), + SPYGLASS("spyglass"), + SQUID_SPAWN_EGG("squid_spawn_egg"), + STICK("stick"), + STONE_AXE("stone_axe"), + STONE_HOE("stone_hoe"), + STONE_PICKAXE("stone_pickaxe"), + STONE_SHOVEL("stone_shovel"), + STONE_SWORD("stone_sword"), + STRAY_SPAWN_EGG("stray_spawn_egg"), + STRIDER_SPAWN_EGG("strider_spawn_egg"), + STRING("string"), + SUGAR("sugar"), + SUSPICIOUS_STEW("suspicious_stew"), + SWEET_BERRIES("sweet_berries"), + TIPPED_ARROW("tipped_arrow"), + TNT_MINECART("tnt_minecart"), + TOTEM_OF_UNDYING("totem_of_undying"), + TRADER_LLAMA_SPAWN_EGG("trader_llama_spawn_egg"), + TRIDENT("trident"), + TROPICAL_FISH("tropical_fish"), + TROPICAL_FISH_BUCKET("tropical_fish_bucket"), + TROPICAL_FISH_SPAWN_EGG("tropical_fish_spawn_egg"), + TURTLE_HELMET("turtle_helmet"), + TURTLE_SPAWN_EGG("turtle_spawn_egg"), + VEX_SPAWN_EGG("vex_spawn_egg"), + VILLAGER_SPAWN_EGG("villager_spawn_egg"), + VINDICATOR_SPAWN_EGG("vindicator_spawn_egg"), + WANDERING_TRADER_SPAWN_EGG("wandering_trader_spawn_egg"), + WARPED_FUNGUS_ON_A_STICK("warped_fungus_on_a_stick"), + WATER_BUCKET("water_bucket"), + WHEAT("wheat"), + WHEAT_SEEDS("wheat_seeds"), + WHITE_DYE("white_dye"), + WITCH_SPAWN_EGG("witch_spawn_egg"), + WITHER_SKELETON_SPAWN_EGG("wither_skeleton_spawn_egg"), + WOLF_SPAWN_EGG("wolf_spawn_egg"), + WOODEN_AXE("wooden_axe"), + WOODEN_HOE("wooden_hoe"), + WOODEN_PICKAXE("wooden_pickaxe"), + WOODEN_SHOVEL("wooden_shovel"), + WOODEN_SWORD("wooden_sword"), + WRITABLE_BOOK("writable_book"), + WRITTEN_BOOK("written_book"), + YELLOW_DYE("yellow_dye"), + ZOGLIN_SPAWN_EGG("zoglin_spawn_egg"), + ZOMBIE_HORSE_SPAWN_EGG("zombie_horse_spawn_egg"), + ZOMBIE_SPAWN_EGG("zombie_spawn_egg"), + ZOMBIE_VILLAGER_SPAWN_EGG("zombie_villager_spawn_egg"), + ZOMBIFIED_PIGLIN_SPAWN_EGG("zombified_piglin_spawn_egg"); + + fun toPath(): ResourcePath + { + return ResourcePath.ofNamespace("minecraft", id) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/Lang.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/Lang.kt new file mode 100644 index 0000000..802d0ab --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/Lang.kt @@ -0,0 +1,12 @@ +package gay.pizza.foundation.drywall.enums + +public enum class Lang(val value: String) +{ + US_ENGLISH("en_us"), + FRENCH("fr_fr"); + + override fun toString(): String + { + return value + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/LootContextType.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/LootContextType.kt new file mode 100644 index 0000000..b2ecebd --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/LootContextType.kt @@ -0,0 +1,22 @@ +package gay.pizza.foundation.drywall.enums + +enum class LootContextType(val value: String) +{ + EMPTY("empty"), + CHEST("chest"), + COMMAND("command"), + SELECTOR("selector"), + FISHING("fishing"), + ENTITY("entity"), + GIFT("gift"), + BARTER("barter"), + ADVANCEMENT_REWARD("advancement_reward"), + ADVANCEMENT_ENTITY("advancement_entity"), + GENERIC("generic"), + BLOCK("block"); + + override fun toString(): String + { + return "minecraft:$value" + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/LootEntryType.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/LootEntryType.kt new file mode 100644 index 0000000..893b0a1 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/LootEntryType.kt @@ -0,0 +1,18 @@ +package gay.pizza.foundation.drywall.enums + +enum class LootEntryType(val value: String) +{ + ITEM("item"), + TAG("tag"), + LOOT_TABLE("loot_table"), + GROUP("group"), + ALTERNATIVES("alternatives"), + SEQUENCE("sequence"), + DYNAMIC("dynamic"), + EMPTY("empty"); + + override fun toString(): String + { + return "minecraft:$value" + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/MixinCompatibilityLevel.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/MixinCompatibilityLevel.kt new file mode 100644 index 0000000..53a36ae --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/MixinCompatibilityLevel.kt @@ -0,0 +1,18 @@ +package gay.pizza.foundation.drywall.enums + +enum class MixinCompatibilityLevel +{ + JAVA_6, + JAVA_7, + JAVA_8, + JAVA_9, + JAVA_10, + JAVA_11, + JAVA_12, + JAVA_13, + JAVA_14, + JAVA_15, + JAVA_16, + JAVA_17, + JAVA_18 +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/enums/RecipeType.kt b/src/main/kotlin/gay/pizza/foundation/drywall/enums/RecipeType.kt new file mode 100644 index 0000000..6b43baa --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/enums/RecipeType.kt @@ -0,0 +1,32 @@ +package gay.pizza.foundation.drywall.enums + +enum class RecipeType(val value: String, val special: String? = null) +{ + BLASTING("blasting"), + COOKING("campfire_cooking"), + SHAPED("crafting_shaped"), + SHAPELESS("crafting_shapeless"), + SMELTING("smelting"), + SMITHING("smithing"), + SMOKING("smoking"), + STONECUTTING("stonecutting"), + + SPECIAL_ARMORDYE("crafting_special_", "armordye"), + SPECIAL_BANNERDUPLICATE("crafting_special_", "bannerduplicate"), + SPECIAL_BOOKCLONING("crafting_special_", "bookcloning"), + SPECIAL_FIREWORK_ROCKET("crafting_special_", "firework_rocket"), + SPECIAL_FIREWORK_STAR("crafting_special_", "firework_star"), + SPECIAL_FIREWORK_STAR_FADE("crafting_special_", "firework_star_fade"), + SPECIAL_MAPCLONING("crafting_special_", "mapcloning"), + SPECIAL_MAPEXTENDING("crafting_special_", "mapextending"), + SPECIAL_REPAIRITEM("crafting_special_", "repairitem"), + SPECIAL_SHIELDDECORATION("crafting_special_", "shielddecoration"), + SPECIAL_SHULKERBOXCOLORING("crafting_special_", "shulkerboxcoloring"), + SPECIAL_TIPPEDARROW("crafting_special_", "tippedarrow"), + SPECIAL_SUSPICIOUSSTEW("crafting_special_", "suspiciousstew"); + + override fun toString(): String + { + return special?.let { "minecraft:$value$special" } ?: "minecraft:$value" + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/AbstractRecipeSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/AbstractRecipeSettings.kt new file mode 100644 index 0000000..da2a252 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/AbstractRecipeSettings.kt @@ -0,0 +1,30 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.enums.RecipeType +import kotlinx.serialization.Serializable + +abstract class AbstractRecipeSettings(protected val type: RecipeType) +{ + @Serializable + data class Recipe( + val type: String, + val group: String? = null, + val pattern: List?, + val key: Map?, + val ingredients: List?, + val result: Result) + { + @Serializable + data class Item( + val item: String, + val tag: String? = null) + + //TODO: this looks different in non crafting recipes + @Serializable + data class Result( + val count: Int? = null, + val item: String) + } + + abstract fun serialisable(namespace: String, id: String): Recipe +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/BlockSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/BlockSettings.kt new file mode 100644 index 0000000..8dd09b4 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/BlockSettings.kt @@ -0,0 +1,110 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.enums.Lang +import gay.pizza.foundation.drywall.enums.RecipeType + +class BlockSettings(val id: String) +{ + private val _displayNames: MutableMap = mutableMapOf() + private var _tool: String? = null + private var _level: String? = null + + private var _model: ModelSettings? = null + private var _itemModel: ModelSettings? = null + private var _blockState: BlockStateSettings? = null + private var _lootTable: LootTableSettings? = null + private var _recipes: MutableList = mutableListOf() + + val displayNames: Map get() = _displayNames.toMap() + val tool: String? get() = _tool + val level: String? get() = _level + val model: ModelSettings? get() = _model + val itemModel: ModelSettings? get() = _itemModel + val blockState: BlockStateSettings? get() = _blockState + val lootTable: LootTableSettings? get() = _lootTable + val recipes: List get() = _recipes.toList() + + fun displayName(text: String, lang: Lang = Lang.US_ENGLISH): BlockSettings + { + this._displayNames[lang] = text + return this + } + + fun needsTool(tool: String): BlockSettings + { + this._tool = tool + return this + } + + fun needsToolLevel(level: String): BlockSettings + { + this._level = level + return this + } + + fun model(settings: ModelSettings.() -> Unit): BlockSettings + { + return model(ModelSettings().apply(settings)) + } + + fun model(settings: ModelSettings): BlockSettings + { + this._model = settings + return this + } + + fun itemModel(settings: ModelSettings.() -> Unit): BlockSettings + { + return itemModel(ModelSettings().apply(settings)) + } + + fun itemModel(settings: ModelSettings): BlockSettings + { + this._itemModel = settings + return this + } + + fun blockState(settings: BlockStateSettings.() -> Unit): BlockSettings + { + return blockState(BlockStateSettings().apply(settings)) + } + + fun blockState(settings: BlockStateSettings): BlockSettings + { + this._blockState = settings + return this + } + + fun lootTable(settings: LootTableSettings.() -> Unit): BlockSettings + { + return lootTable(LootTableSettings().apply(settings)) + } + + fun lootTable(settings: LootTableSettings): BlockSettings + { + this._lootTable = settings + return this + } + + fun shapedRecipe(settings: ShapedRecipeSettings.() -> Unit): BlockSettings + { + return shapedRecipe(ShapedRecipeSettings().apply(settings)) + } + + fun shapedRecipe(settings: ShapedRecipeSettings): BlockSettings + { + this._recipes.add(settings) + return this + } + + fun shapelessRecipe(settings: ShapelessRecipeSettings.() -> Unit): BlockSettings + { + return shapelessRecipe(ShapelessRecipeSettings().apply(settings)) + } + + fun shapelessRecipe(settings: ShapelessRecipeSettings): BlockSettings + { + this._recipes.add(settings) + return this + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/BlockStateSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/BlockStateSettings.kt new file mode 100644 index 0000000..762a899 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/BlockStateSettings.kt @@ -0,0 +1,105 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.util.ResourcePath +import kotlinx.serialization.Serializable + +class BlockStateSettings +{ + private data class Variant( + val model: ResourcePath, + val x: Int, + val y: Int, + val uvlock: Boolean) + + companion object + { + const val STATE_NORMAL = "" + + val DEFAULT_BLOCK_MODEL = BlockStateSettings() + .variant(model = ResourcePath.PATH_BLOCK_MODEL) + val DEFAULT_HORIZONTAL_FACING_VARIANTS = BlockStateSettings() + .horizontalFacingVariants() + val DEFAULT_AXIS_VARIANTS = BlockStateSettings() + .axisVariants() + val DEFAULT_HORIZONTAL_AXIS_VARIANTS = BlockStateSettings() + .horizontalAxisVariants() + } + + private val variants: MutableMap = mutableMapOf() + + fun variant(state: String = STATE_NORMAL, + model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL, + x: Int = 0, + y: Int = 0, + uvlock: Boolean = false): BlockStateSettings + { + variants[state] = Variant(model, x, y, uvlock) + return this + } + + fun horizontalFacingVariants(extra: String, model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL, yNorth: Int = 0): BlockStateSettings + { + variant("${extra},facing=north", model, y = Math.floorMod(yNorth, 360)) + variant("${extra},facing=east", model, y = Math.floorMod(yNorth + 90, 360)) + variant("${extra},facing=south", model, y = Math.floorMod(yNorth + 180, 360)) + variant("${extra},facing=west", model, y = Math.floorMod(yNorth + 270, 360)) + return this + } + + fun horizontalFacingVariants(model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL, yNorth: Int = 0): BlockStateSettings + { + variant("facing=north", model, y = Math.floorMod(yNorth, 360)) + variant("facing=east", model, y = Math.floorMod(yNorth + 90, 360)) + variant("facing=south", model, y = Math.floorMod(yNorth + 180, 360)) + variant("facing=west", model, y = Math.floorMod(yNorth + 270, 360)) + return this + } + + fun axisVariants(extra: String, model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL): BlockStateSettings + { + variant("${extra},axis=y", model) + variant("${extra},axis=z", model, x = 270) + variant("${extra},axis=x", model, x = 90, y = 90) + return this + } + + fun axisVariants(model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL): BlockStateSettings + { + variant("axis=y", model) + variant("axis=z", model, x = 270) + variant("axis=x", model, x = 90, y = 90) + return this + } + + fun horizontalAxisVariants(model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL, x: Int = 90, z: Int = 0): BlockStateSettings + { + variant("axis=x", model, y = Math.floorMod(x, 360)) + variant("axis=z", model, y = Math.floorMod(z, 360)) + return this + } + + fun horizontalAxisVariants(extra: String, model: ResourcePath = ResourcePath.PATH_BLOCK_MODEL, x: Int = 90, z: Int = 0): BlockStateSettings + { + variant("${extra},axis=x", model, y = Math.floorMod(x, 360)) + variant("${extra},axis=z", model, y = Math.floorMod(z, 360)) + return this + } + + @Serializable + data class BlockState(val variants: Map) + { + @Serializable + data class Variant(val model: String, val x: Int? = null, val y: Int? = null, val uvlock: Boolean? = null) + } + + fun serialisable(namespace: String, blockId: String): BlockState + { + return BlockState(this.variants.entries.associate { + it.key to BlockState.Variant( + it.value.model.resolve(namespace, blockId), + if (it.value.x != 0) it.value.x else null, + if (it.value.y != 0) it.value.y else null, + if (it.value.uvlock) true else null) + }) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/FabricModSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/FabricModSettings.kt new file mode 100644 index 0000000..2075327 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/FabricModSettings.kt @@ -0,0 +1,147 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.enums.EntryPoint +import gay.pizza.foundation.drywall.enums.EnvironmentType +import kotlinx.serialization.Serializable +import org.gradle.api.internal.provider.MissingValueException + +class FabricModSettings +{ + private var _modId: String? = null + private var _version: String? = null + + private var _name: String? = null + private var _description: String? = null + private var _license: String? = null + private var _icon: String? = null + private var _environment: EnvironmentType = EnvironmentType.EVERYWHERE + + private val _authors: MutableList = mutableListOf() + private val _entrypoints: MutableMap> = mutableMapOf() + private val _depends: MutableMap = mutableMapOf() + + private val _mixins: MutableMap = mutableMapOf() + + val mixins: Map get() = _mixins.toMap() + + fun id(id: String): FabricModSettings + { + _modId = id + return this + } + + fun version(version: Any): FabricModSettings + { + _version = "${version}" + return this + } + + fun displayName(name: String): FabricModSettings + { + _name = name + return this + } + + fun description(text: String): FabricModSettings + { + _description = text + return this + } + + fun author(name: String): FabricModSettings + { + _authors.add(name) + return this + } + + fun license(name: String): FabricModSettings + { + _license = name + return this + } + + fun icon(path: String): FabricModSettings + { + _icon = path + return this + } + + fun environment(environment: EnvironmentType): FabricModSettings + { + _environment = environment + return this + } + + fun entryPoint(entryPoint: EntryPoint, vararg classPath: String): FabricModSettings + { + _entrypoints.getOrPut(entryPoint) { mutableListOf() } += classPath + return this + } + + fun depends(modName: String, modVersion: String = "*"): FabricModSettings + { + _depends[modName] = modVersion + return this + } + + fun mixins(settings: MixinSettings.() -> Unit): FabricModSettings + { + return mixins(MixinSettings().apply(settings)) + } + + fun mixins(settings: MixinSettings): FabricModSettings + { + _mixins.put(null, settings) + return this + } + + fun mixins(name: String): FabricModSettings + { + return mixins(name, MixinSettings()) + } + + fun mixins(name: String, settings: MixinSettings.() -> Unit): FabricModSettings + { + return mixins(name, MixinSettings().apply(settings)) + } + + fun mixins(name: String, settings: MixinSettings): FabricModSettings + { + _mixins.put(name, settings) + return this + } + + @Serializable + data class FabricMod( + val schemaVersion: Int, + val id: String, + val version: String, + val name: String?, + val description: String?, + val authors: List?, + val license: String?, + val icon: String?, + val environment: String?, + val entrypoints: Map>?, + val mixins: List?, + val depends: Map?) + + fun serialisable(namespace: String): FabricMod + { + if (_version.isNullOrBlank()) + throw MissingValueException("missing required version string") + + return FabricMod(1, + _modId ?: namespace, + _version!!, + _name, + _description, + _authors, + _license, + _icon ?: "assets/$namespace/icon.png", + "$_environment", + _entrypoints.entries.associate { it.key.name to it.value.toList() }, + mixins.ifEmpty { null }?.let{it.keys.map { it ?: "$namespace.mixins.json" } }, + _depends) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/LootTableSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/LootTableSettings.kt new file mode 100644 index 0000000..cc6e776 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/LootTableSettings.kt @@ -0,0 +1,69 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.util.ResourcePath +import gay.pizza.foundation.drywall.enums.ConditionType +import gay.pizza.foundation.drywall.enums.LootContextType +import gay.pizza.foundation.drywall.enums.LootEntryType +import kotlinx.serialization.Serializable + +class LootTableSettings +{ + data class Pool(val rolls: Int, val entries: List, val conditions: List) + { + data class Entry(val type: LootEntryType, val name: ResourcePath) + data class Predicate(val condition: ConditionType) + } + + companion object + { + val DEFAULT_BLOCK = LootTableSettings() + .type(LootContextType.BLOCK) + .pool(1, listOf( + Pool.Entry(LootEntryType.ITEM, ResourcePath.PATH_BLOCK) + )) + } + + private var ctxType: LootContextType? = null + private val pools: MutableList = mutableListOf() + + fun type(type: LootContextType): LootTableSettings + { + this.ctxType = type + return this + } + + fun pool(rolls: Int, entries: List, conditions: List = emptyList()): LootTableSettings + { + this.pools.add(Pool(rolls, entries, conditions)) + return this + } + + @Serializable + data class LootTable(val type: String?, val pools: List) + { + @Serializable + data class Pool(val rolls: Int, val entries: List, val conditions: List? = null) + { + @Serializable + data class Predicate(val condition: String) + @Serializable + data class Entry(val type: String, val name: String) + } + } + + fun serialisable(namespace: String, blockId: String): LootTable + { + // TODO: conditions + return LootTable(this.ctxType?.toString(), this.pools.map { + LootTable.Pool( + it.rolls, + it.entries.map { + LootTable.Pool.Entry(it.type.toString(), it.name.resolve(namespace, blockId)) + }, + if (it.conditions.isNotEmpty()) it.conditions.map { + LootTable.Pool.Predicate(it.condition.toString()) + } else null + ) + }) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/MixinSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/MixinSettings.kt new file mode 100644 index 0000000..e7bc5e9 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/MixinSettings.kt @@ -0,0 +1,85 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.enums.MixinCompatibilityLevel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +class MixinSettings() +{ + private var _packagePath: String? = null + private var _compatibilityLevel: MixinCompatibilityLevel? = null + private val _mixins: MutableList = mutableListOf() + private val _client: MutableList = mutableListOf() + private val _server: MutableList = mutableListOf() + //private val _injectors: MutableMap = mutableMapOf() + + val packagePath: String? get() = _packagePath + + fun packagePath(path: String): MixinSettings + { + _packagePath = path + return this + } + + fun compatibilityLevel(javaVersion: MixinCompatibilityLevel): MixinSettings + { + _compatibilityLevel = javaVersion + return this + } + + fun mixin(className: String): MixinSettings + { + _mixins.add(className) + return this + } + + fun clientMixin(className: String): MixinSettings + { + _client.add(className) + return this + } + + fun serverMixin(className: String): MixinSettings + { + _server.add(className) + return this + } + + //fun injector(className: String, what: Int): MixinSettings + //{ + // _injectors.put(className, what) + // return this + //} + + @Serializable + data class Mixins( + val required: Boolean, + val minVersion: String, + @SerialName("package") val packagePath: String, + val compatibilityLevel: String?, + val mixins: List?, + val client: List?, + val server: List?) + //val injectors: Map?) + + //TODO: injector settings + //defaultRequire: int + //defaultGroup: str + //namespace: str + //injectionPoints: list + //dynamicSelectors: list + //maxShiftBy: int + + fun serialisable(): Mixins + { + return Mixins( + true, + "0.8", + _packagePath!!, + _compatibilityLevel?.let { "$it" }, + _mixins.ifEmpty { null }, + _client.ifEmpty { null }, + _server.ifEmpty { null }) + //_injectors.ifEmpty { null }) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/ModelSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/ModelSettings.kt new file mode 100644 index 0000000..f0baac4 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/ModelSettings.kt @@ -0,0 +1,29 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.util.ResourcePath +import kotlinx.serialization.Serializable + +class ModelSettings +{ + companion object + { + val DEFAULT_ITEM_BLOCK_MODEL = ModelSettings().parent(ResourcePath.PATH_BLOCK_MODEL) + } + + private var parent: ResourcePath? = null + + fun parent(path: ResourcePath): ModelSettings + { + this.parent = path + return this + } + + @Serializable + data class Model(val parent: String?, val textures: Map? = null) + + fun serialisable(namespace: String, blockId: String): Model + { + //TODO: textures + return Model(this.parent?.resolve(namespace, blockId)) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/ShapedRecipeSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/ShapedRecipeSettings.kt new file mode 100644 index 0000000..f0b4d48 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/ShapedRecipeSettings.kt @@ -0,0 +1,62 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.enums.Blocks +import gay.pizza.foundation.drywall.enums.Items +import gay.pizza.foundation.drywall.enums.RecipeType +import gay.pizza.foundation.drywall.util.ResourcePath + +class ShapedRecipeSettings: AbstractRecipeSettings(RecipeType.SHAPED) +{ + private val patternLines: MutableList = mutableListOf() + private val keys: MutableMap = mutableMapOf() + private var result: ResourcePath? = null + private var resultCount = 1 + + fun pattern(line1: String, line2: String, line3: String): ShapedRecipeSettings + { + patternLines.add(line1) + patternLines.add(line2) + patternLines.add(line3) + return this + } + + fun key(key: Char, item: Items): ShapedRecipeSettings + { + return key(key, item.toPath()) + } + + fun key(key: Char, blockItem: Blocks): ShapedRecipeSettings + { + return key(key, blockItem.toPath()) + } + + fun key(key: Char, itemPath: ResourcePath): ShapedRecipeSettings + { + // TODO: Tag??? + keys[key] = itemPath + return this + } + + fun result(count: Int): ShapedRecipeSettings + { + resultCount = count + return this + } + + fun result(itemPath: ResourcePath, count: Int = 1): ShapedRecipeSettings + { + result = itemPath + resultCount = count + return this + } + + override fun serialisable(namespace: String, id: String): Recipe + { + return Recipe("$type", null, + this.patternLines.toList(), + this.keys.entries.associate { "${it.key}" to Recipe.Item(it.value.resolve(namespace, id)) }, + null, + Recipe.Result(this.resultCount, result?.resolve(namespace, id) ?: "$namespace:$id") + ) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/settings/ShapelessRecipeSettings.kt b/src/main/kotlin/gay/pizza/foundation/drywall/settings/ShapelessRecipeSettings.kt new file mode 100644 index 0000000..758ba8b --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/settings/ShapelessRecipeSettings.kt @@ -0,0 +1,52 @@ +package gay.pizza.foundation.drywall.settings + +import gay.pizza.foundation.drywall.enums.Blocks +import gay.pizza.foundation.drywall.enums.Items +import gay.pizza.foundation.drywall.enums.RecipeType +import gay.pizza.foundation.drywall.util.ResourcePath + +class ShapelessRecipeSettings: AbstractRecipeSettings(RecipeType.SHAPELESS) +{ + private val ingredients: MutableList = mutableListOf() + private var result: ResourcePath? = null + private var resultCount = 1 + + fun ingredient(item: Items): ShapelessRecipeSettings + { + return ingredient(item.toPath()) + } + + fun ingredient(blockItem: Blocks): ShapelessRecipeSettings + { + return ingredient(blockItem.toPath()) + } + + fun ingredient(itemPath: ResourcePath): ShapelessRecipeSettings + { + ingredients.add(itemPath) + return this + } + + fun result(count: Int): ShapelessRecipeSettings + { + resultCount = count + return this + } + + fun result(itemPath: ResourcePath, count: Int = 1): ShapelessRecipeSettings + { + result = itemPath + resultCount = count + return this + } + + override fun serialisable(namespace: String, id: String): Recipe + { + return Recipe("$type", null, + null, + null, + ingredients.map { Recipe.Item(it.resolve(namespace, id)) }, + Recipe.Result(this.resultCount, result?.resolve(namespace, id) ?: "$namespace:$id") + ) + } +} diff --git a/src/main/kotlin/gay/pizza/foundation/drywall/util/ResourcePath.kt b/src/main/kotlin/gay/pizza/foundation/drywall/util/ResourcePath.kt new file mode 100644 index 0000000..cc46479 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/drywall/util/ResourcePath.kt @@ -0,0 +1,47 @@ +package gay.pizza.foundation.drywall.util + +class ResourcePath private constructor(private val namespace: String?, vararg path: String) +{ + companion object + { + val ID = "*" + + val PATH_BLOCK = ResourcePath.of(ID) + val PATH_BLOCK_MODEL = ResourcePath.of("block", ID) + + fun of(vararg path: String): ResourcePath + { + return ResourcePath(null, *path) + } + + fun ofNamespace(namespace: String, vararg path: String): ResourcePath + { + return ResourcePath(namespace, *path) + } + } + + private val tokens: List + + init + { + this.tokens = path.asList() + } + + fun resolve(namespace: String, id: String): String + { + return "${this.namespace ?: namespace}:${ + tokens.joinToString(separator = "/") { + when (it) + { + ID -> id + else -> it + } + }}" + } + + override fun toString(): String + { + val path = tokens.joinToString(separator = "/") + return namespace?.let { "$it:$path" } ?: path + } +}