diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore index 524f0963b..d75aa5c24 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,7 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* replay_pid* + +build/ +.gradle/ +.idea/ \ No newline at end of file diff --git a/LICENSE b/LICENSE index f288702d2..e62ec04cd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - GNU GENERAL PUBLIC LICENSE +GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. diff --git a/README.md b/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..bf9fcc3bd --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,66 @@ +import org.gradle.process.internal.ExecException +import java.io.ByteArrayOutputStream + +plugins { + id("java") +} + +val git : String = versionBanner() +val builder : String = builder() +ext["git_version"] = git +ext["builder"] = builder + +subprojects { + + apply(plugin = "java") + apply(plugin = "java-library") + + repositories { + mavenCentral() + maven("https://jitpack.io/") + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://oss.sonatype.org/content/repositories/snapshots") + maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") + } + + tasks.processResources { + filteringCharset = "UTF-8" + + filesMatching(arrayListOf("craft-engine.properties")) { + expand(rootProject.properties) + } + + filesMatching(arrayListOf("commands.yml", "config.yml", "*/*.yml", "ignite.mod.json")) { + expand( + Pair("project_version", rootProject.properties["project_version"]), + Pair("config_version", rootProject.properties["config_version"]) + ) + } + } +} + +fun versionBanner(): String { + val os = ByteArrayOutputStream() + try { + project.exec { + commandLine = "git rev-parse --short=8 HEAD".split(" ") + standardOutput = os + } + } catch (e: ExecException) { + return "Unknown" + } + return String(os.toByteArray()).trim() +} + +fun builder(): String { + val os = ByteArrayOutputStream() + try { + project.exec { + commandLine = "git config user.name".split(" ") + standardOutput = os + } + } catch (e: ExecException) { + return "Unknown" + } + return String(os.toByteArray()).trim() +} \ No newline at end of file diff --git a/bukkit-loader/build.gradle.kts b/bukkit-loader/build.gradle.kts new file mode 100644 index 000000000..e7bbe4019 --- /dev/null +++ b/bukkit-loader/build.gradle.kts @@ -0,0 +1,64 @@ +plugins { + id("io.github.goooler.shadow") version "8.1.8" + id("net.minecrell.plugin-yml.bukkit") version "0.6.0" +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") + mavenCentral() +} + +dependencies { + implementation(project(":shared")) + implementation(project(":core")) + implementation(project(":bukkit")) + // Platform + compileOnly("dev.folia:folia-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +bukkit { + load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.POSTWORLD + main = "net.momirealms.craftengine.bukkit.BukkitBootstrap" + version = rootProject.properties["project_version"] as String + name = "CraftEngine" + apiVersion = "1.20" + authors = listOf("XiaoMoMi") + softDepend = listOf("PlaceholderAPI", "WorldEdit", "FastAsyncWorldEdit") + foliaSupported = true +} + +artifacts { + archives(tasks.shadowJar) +} + +tasks { + shadowJar { + archiveFileName = "${rootProject.name}-bukkit-plugin-${rootProject.properties["project_version"]}.jar" + destinationDirectory.set(file("$rootDir/target")) + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("net.momirealms.sparrow.nbt", "net.momirealms.craftengine.libraries.nbt") + relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.tag") + relocate("org.incendo", "net.momirealms.craftengine.libraries") + relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") + relocate("org.apache.commons.io", "net.momirealms.craftengine.libraries.commons.io") + relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") + relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine") + relocate("net.objecthunter.exp4j", "net.momirealms.craftengine.libraries.exp4j") + relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy") + relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") + } +} diff --git a/bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java b/bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java new file mode 100644 index 000000000..27c93a874 --- /dev/null +++ b/bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import org.bukkit.plugin.java.JavaPlugin; + +public class BukkitBootstrap extends JavaPlugin { + private final BukkitCraftEngine plugin; + + public BukkitBootstrap() { + this.plugin = new BukkitCraftEngine(this); + } + + @Override + public void onLoad() { + this.plugin.load(); + } + + @Override + public void onEnable() { + this.plugin.enable(); + } + + @Override + public void onDisable() { + this.plugin.disable(); + } +} diff --git a/bukkit-loader/src/main/resources/additional-real-blocks.yml b/bukkit-loader/src/main/resources/additional-real-blocks.yml new file mode 100644 index 000000000..c7610f031 --- /dev/null +++ b/bukkit-loader/src/main/resources/additional-real-blocks.yml @@ -0,0 +1,18 @@ +# This file will register an additional number of block states to the server, based on the mappings defined in mappings.yml. +# If you're unsure what this means, you can read the following explanation below. + +# Suppose you create a new type of leaf, but its appearance has only two states (waterlogged and normal). +# However, because of the defined properties such as distance, persistent, and waterlogged, it requires at least 2x2x7 = 28 different block states. +# By default, the plugin only registers the same number of block states as those defined in the mappings.yml file. +# Therefore, during actual configuration, you will notice that the internal IDs are insufficient +# (without configuring additional-real-block, one type of leaf can only provide 26 states, whereas creating a new leaf requires 28 states). +# The purpose of this file is to register additional block states with the server when starting it, ensuring the correct mapping between real blocks and the visual appearance of fake blocks on the server. + +# Some common questions: +# Q: Do I need to restart the server for the changes to take effect? +# A: Yes! Modifying the block registry while the server is running is extremely risky. +# Q: When do I need to configure this file? +# A: When the number of real block IDs is insufficient, but there are still available appearances. + +# By default, the plugin only registers an additional 112 oak leaf block states (for the default configuration needs [>=28 states]). +minecraft:oak_leaves: 112 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/blockstates.yml b/bukkit-loader/src/main/resources/blockstates.yml new file mode 100644 index 000000000..d0d5e4c1c --- /dev/null +++ b/bukkit-loader/src/main/resources/blockstates.yml @@ -0,0 +1,68 @@ +minecraft:note_block: + instrument=harp: + model: "minecraft:block/note_block" +minecraft:tripwire: + attached=true,east=true,north=true,south=true,disarmed=true,west=true,powered=true: + model: "minecraft:block/tripwire_attached_nsew" +minecraft:red_mushroom_block: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/red_mushroom_block_inventory" +minecraft:brown_mushroom_block: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/brown_mushroom_block_inventory" +minecraft:mushroom_stem: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/mushroom_stem_inventory" +minecraft:kelp: + age=0: + model: "minecraft:block/kelp" +minecraft:weeping_vines: + age=0: + model: "minecraft:block/weeping_vines" +minecraft:twisting_vines: + age=0: + model: "minecraft:block/twisting_vines" +minecraft:cave_vines: + age=0,berries=false: + model: "minecraft:block/cave_vines" + age=0,berries=true: + model: "minecraft:block/cave_vines_lit" +minecraft:sugar_cane: + age=0: + model: "minecraft:block/sugar_cane" +minecraft:oak_leaves: + distance=7,persistent=true: + model: "minecraft:block/oak_leaves" +minecraft:acacia_leaves: + distance=7,persistent=true: + model: "minecraft:block/acacia_leaves" +minecraft:jungle_leaves: + distance=7,persistent=true: + model: "minecraft:block/jungle_leaves" +minecraft:birch_leaves: + distance=7,persistent=true: + model: "minecraft:block/birch_leaves" +minecraft:mangrove_leaves: + distance=7,persistent=true: + model: "minecraft:block/mangrove_leaves" +minecraft:cherry_leaves: + distance=7,persistent=true: + model: "minecraft:block/cherry_leaves" +minecraft:dark_oak_leaves: + distance=7,persistent=true: + model: "minecraft:block/dark_oak_leaves" +minecraft:azalea_leaves: + distance=7,persistent=true: + model: "minecraft:block/azalea_leaves" +minecraft:flowering_azalea_leaves: + distance=7,persistent=true: + model: "minecraft:block/flowering_azalea_leaves" +minecraft:spruce_leaves: + distance=7,persistent=true: + model: "minecraft:block/spruce_leaves" +minecraft:pale_oak_leaves: + distance=7,persistent=true: + model: "minecraft:block/pale_oak_leaves" +minecraft:chorus_plant: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/default_chorus_plant" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/commands.yml b/bukkit-loader/src/main/resources/commands.yml new file mode 100644 index 000000000..2ed7ddf66 --- /dev/null +++ b/bukkit-loader/src/main/resources/commands.yml @@ -0,0 +1,54 @@ +# +# Don't change this +# +config-version: "${config_version}" + +# +# For safety reasons, editing this file requires a restart to apply +# + +# A command to reload the plugin +# Usage: [COMMAND] +reload: + enable: true + permission: ce.command.reload + usage: + - /craftengine reload + - /ce reload + +get_item: + enable: true + permission: ce.command.get_item + usage: + - /craftengine item get + - /ce item get + +give_item: + enable: true + permission: ce.command.give_item + usage: + - /craftengine item give + - /ce item give + +setblock: + enable: true + permission: ce.command.setblock + usage: + - /craftengine setblock + - /ce setblock + +# A command to test some stuffs +# Usage: [COMMAND] +debug_state: + enable: true + permission: ce.command.debug.state + usage: + - /craftengine debug state + - /ce debug state + +debug_test: + enable: true + permission: ce.command.debug.test + usage: + - /craftengine debug test + - /ce debug test \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/config.yml b/bukkit-loader/src/main/resources/config.yml new file mode 100644 index 000000000..77862e31a --- /dev/null +++ b/bukkit-loader/src/main/resources/config.yml @@ -0,0 +1,90 @@ +# Do not modify this value +config-version: '${config_version}' +# Enables or disables debug mode +debug: false +# Enables or disables metrics collection via BStats +metrics: true +# Enables automatic update checks +update-checker: true +# Forces a specific locale (e.g., zh_cn) +force-locale: '' + +resource-pack: + # Should those images in minecraft:default font also work in minecraft:uniform + override-uniform-font: true + protection: + break-zip-format: true + obfuscation: false + supported-version: + min: 1.20 + max: LATEST + +block: + sound-system: + enable: true + +furniture: + # Should the plugin remove invalid furniture on chunk load + remove-invalid-furniture-on-chunk-load: + enable: false + # If you want to remove all invalid furniture, please set this list to empty, otherwise only furniture in the list will be removed. + list: + - "xxx:invalid_furniture" + +recipe: + enable: true + +performance: + # Maximum chain update depth when fixing client visuals + max-block-chain-update-limit: 64 + light-system: + enable: true + # Turning this option on will reduce lighting system issues to some extent, but will increase server bandwidth consumption + force-update-light: false + +offset-characters: + font: minecraft:default + -1: '\uf800' + -2: '\uf801' + -3: '\uf802' + -4: '\uf803' + -5: '\uf804' + -6: '\uf805' + -7: '\uf806' + -8: '\uf807' + -9: '\uf808' + -10: '\uf809' + -11: '\uf80a' + -12: '\uf80b' + -13: '\uf80c' + -14: '\uf80d' + -15: '\uf80e' + -16: '\uf80f' + -24: '\uf810' + -32: '\uf811' + -48: '\uf812' + -64: '\uf813' + -128: '\uf814' + -256: '\uf815' + 1: '\uf830' + 2: '\uf831' + 3: '\uf832' + 4: '\uf833' + 5: '\uf834' + 6: '\uf835' + 7: '\uf836' + 8: '\uf837' + 9: '\uf838' + 10: '\uf839' + 11: '\uf83a' + 12: '\uf83b' + 13: '\uf83c' + 14: '\uf83d' + 15: '\uf83e' + 16: '\uf83f' + 24: '\uf840' + 32: '\uf841' + 48: '\uf842' + 64: '\uf843' + 128: '\uf844' + 256: '\uf845' \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/craft-engine.properties b/bukkit-loader/src/main/resources/craft-engine.properties new file mode 100644 index 000000000..d166130f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/craft-engine.properties @@ -0,0 +1,25 @@ +config=${config_version} +builder=${builder} +lang=${lang} +legacy-templates=${legacy_model_templates_version} +latest-templates=${latest_model_templates_version} +latest-version=${latest_minecraft_version} +asm=${asm_version} +asm-commons=${asm_commons_version} +jar-relocator=${jar_relocator_version} +cloud-core=${cloud_core_version} +cloud-services=${cloud_services_version} +cloud-brigadier=${cloud_brigadier_version} +cloud-bukkit=${cloud_bukkit_version} +cloud-paper=${cloud_paper_version} +cloud-minecraft-extras=${cloud_minecraft_extras_version} +boosted-yaml=${boosted_yaml_version} +bstats-base=${bstats_version} +geantyref=${geantyref_version} +gson=${gson_version} +caffeine=${caffeine_version} +slf4j-api=${slf4j_version} +zstd-jni=${zstd_version} +commons-io=${commons_io_version} +byte-buddy=${byte_buddy_version} +snake-yaml=${snake_yaml_version} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/sounds.json b/bukkit-loader/src/main/resources/internal/sounds.json new file mode 100644 index 000000000..bda7661d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/sounds.json @@ -0,0 +1,23122 @@ +{ + "ambient.basalt_deltas.additions": { + "sounds": [ + { + "name": "ambient/nether/basalt_deltas/basaltground1", + "volume": 0.55, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/basaltground2", + "volume": 0.55, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/basaltground3", + "volume": 0.55, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/click1", + "volume": 0.19, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click2", + "volume": 0.19, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click3", + "volume": 0.19, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click4", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click5", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click6", + "volume": 0.01, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click7", + "volume": 0.01, + "weight": 25 + }, + { + "name": "ambient/nether/basalt_deltas/click8", + "volume": 0.01, + "weight": 25 + }, + { + "name": "ambient/nether/basalt_deltas/debris1", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/debris2", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/debris3", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/heavy_click1", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/heavy_click2", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/long_debris1", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/long_debris2", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/plode1", + "volume": 0.5, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/plode2", + "volume": 0.5, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/plode3", + "volume": 0.5, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/twist1", + "volume": 0.66 + }, + { + "name": "ambient/nether/basalt_deltas/twist2", + "volume": 0.66 + }, + { + "name": "ambient/nether/basalt_deltas/twist3", + "volume": 0.77 + }, + { + "name": "ambient/nether/basalt_deltas/twist4", + "volume": 0.66 + }, + { + "name": "ambient/nether/soulsand_valley/wind1", + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind2", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind3", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind4", + "volume": 0.3, + "weight": 25 + } + ] + }, + "ambient.basalt_deltas.loop": { + "sounds": [ + { + "name": "ambient/nether/basalt_deltas/ambience", + "stream": true, + "volume": 0.5 + } + ] + }, + "ambient.basalt_deltas.mood": { + "sounds": [ + "ambient/nether/nether_wastes/mood1", + "ambient/nether/nether_wastes/mood2", + "ambient/nether/nether_wastes/mood3", + "ambient/nether/nether_wastes/mood4", + "ambient/nether/nether_wastes/mood5" + ] + }, + "ambient.cave": { + "sounds": [ + "ambient/cave/cave1", + "ambient/cave/cave2", + "ambient/cave/cave3", + "ambient/cave/cave4", + "ambient/cave/cave5", + "ambient/cave/cave6", + "ambient/cave/cave7", + "ambient/cave/cave8", + "ambient/cave/cave9", + "ambient/cave/cave10", + "ambient/cave/cave11", + "ambient/cave/cave12", + "ambient/cave/cave13", + "ambient/cave/cave14", + "ambient/cave/cave15", + "ambient/cave/cave16", + "ambient/cave/cave17", + "ambient/cave/cave18", + "ambient/cave/cave19", + "ambient/cave/cave20", + "ambient/cave/cave21", + "ambient/cave/cave22", + "ambient/cave/cave23" + ], + "subtitle": "subtitles.ambient.sound" + }, + "ambient.crimson_forest.additions": { + "sounds": [ + { + "name": "ambient/nether/crimson_forest/addition1", + "volume": 0.4, + "weight": 3 + }, + { + "name": "ambient/nether/crimson_forest/addition2", + "volume": 0.5, + "weight": 3 + }, + { + "name": "ambient/nether/crimson_forest/addition3", + "volume": 0.32, + "weight": 3 + }, + { + "name": "ambient/nether/crimson_forest/particles1", + "volume": 0.4, + "weight": 35 + }, + { + "name": "ambient/nether/crimson_forest/particles2", + "volume": 0.4, + "weight": 35 + }, + { + "name": "ambient/nether/crimson_forest/particles3", + "volume": 0.4, + "weight": 35 + }, + { + "name": "ambient/nether/crimson_forest/shine1", + "pitch": 0.5, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/crimson_forest/shine2", + "pitch": 0.5, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/crimson_forest/shine3", + "pitch": 0.5, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/crimson_forest/shroom1", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/shroom2", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/shroom3", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/twang1", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/voom1", + "volume": 0.7, + "weight": 4 + }, + { + "name": "ambient/nether/crimson_forest/voom1", + "pitch": 0.8, + "volume": 0.7, + "weight": 4 + }, + { + "name": "ambient/nether/crimson_forest/voom2", + "volume": 0.7, + "weight": 4 + }, + { + "name": "ambient/nether/crimson_forest/voom2", + "pitch": 0.8, + "volume": 0.7, + "weight": 4 + } + ] + }, + "ambient.crimson_forest.loop": { + "sounds": [ + { + "name": "ambient/nether/crimson_forest/ambience", + "stream": true, + "volume": 0.74 + } + ] + }, + "ambient.crimson_forest.mood": { + "sounds": [ + "ambient/nether/crimson_forest/mood1", + "ambient/nether/crimson_forest/mood2", + "ambient/nether/crimson_forest/mood3", + "ambient/nether/crimson_forest/mood4" + ] + }, + "ambient.nether_wastes.additions": { + "sounds": [ + { + "name": "ambient/nether/nether_wastes/addition1", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition2", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition3", + "volume": 0.1 + }, + { + "name": "ambient/nether/nether_wastes/addition4", + "volume": 0.67, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/addition5", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition6", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition7", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition8", + "volume": 0.67, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/dark1", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/dark2", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/ground1", + "volume": 0.25, + "weight": 3 + }, + { + "name": "ambient/nether/nether_wastes/ground2", + "volume": 0.4 + }, + { + "name": "ambient/nether/nether_wastes/ground3", + "volume": 0.4 + }, + { + "name": "ambient/nether/nether_wastes/ground4", + "volume": 0.4 + } + ] + }, + "ambient.nether_wastes.loop": { + "sounds": [ + { + "name": "ambient/nether/nether_wastes/ambience", + "stream": true, + "volume": 0.77 + } + ] + }, + "ambient.nether_wastes.mood": { + "sounds": [ + "ambient/nether/nether_wastes/mood1", + "ambient/nether/nether_wastes/mood2", + "ambient/nether/nether_wastes/mood3", + "ambient/nether/nether_wastes/mood4", + "ambient/nether/nether_wastes/mood5" + ] + }, + "ambient.soul_sand_valley.additions": { + "sounds": [ + { + "name": "ambient/nether/soulsand_valley/sand1", + "volume": 0.2, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/sand2", + "volume": 0.2, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/sand3", + "volume": 0.4, + "weight": 2 + }, + { + "name": "ambient/nether/soulsand_valley/voices1", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices2", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices3", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices4", + "volume": 0.8, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices5", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices5", + "pitch": 0.7, + "volume": 0.15, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper1", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper2", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper3", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper4", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper5", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper6", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper7", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper8", + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/wind1", + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind1", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind2", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind2", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind3", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind3", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind4", + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind4", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/with1", + "volume": 0.6, + "weight": 4 + } + ] + }, + "ambient.soul_sand_valley.loop": { + "sounds": [ + { + "name": "ambient/nether/soulsand_valley/ambience", + "stream": true, + "volume": 0.85 + } + ] + }, + "ambient.soul_sand_valley.mood": { + "sounds": [ + "ambient/nether/soulsand_valley/mood1", + "ambient/nether/soulsand_valley/mood2", + "ambient/nether/soulsand_valley/mood3", + "ambient/nether/soulsand_valley/mood4" + ] + }, + "ambient.underwater.enter": { + "sounds": [ + { + "name": "ambient/underwater/enter1", + "volume": 0.5 + }, + { + "name": "ambient/underwater/enter2", + "volume": 0.5 + }, + { + "name": "ambient/underwater/enter3", + "volume": 0.5 + } + ] + }, + "ambient.underwater.exit": { + "sounds": [ + { + "name": "ambient/underwater/exit1", + "volume": 0.3 + }, + { + "name": "ambient/underwater/exit2", + "volume": 0.3 + }, + { + "name": "ambient/underwater/exit3", + "volume": 0.3 + } + ] + }, + "ambient.underwater.loop": { + "sounds": [ + { + "name": "ambient/underwater/underwater_ambience", + "stream": true, + "volume": 0.65 + } + ] + }, + "ambient.underwater.loop.additions": { + "sounds": [ + "ambient/underwater/additions/bubbles1", + "ambient/underwater/additions/bubbles2", + "ambient/underwater/additions/bubbles3", + "ambient/underwater/additions/bubbles4", + "ambient/underwater/additions/bubbles5", + "ambient/underwater/additions/bubbles6", + "ambient/underwater/additions/water1", + "ambient/underwater/additions/water2" + ] + }, + "ambient.underwater.loop.additions.rare": { + "sounds": [ + "ambient/underwater/additions/animal1", + { + "name": "ambient/underwater/additions/bass_whale1", + "volume": 0.45 + }, + { + "name": "ambient/underwater/additions/bass_whale2", + "volume": 0.5 + }, + { + "name": "ambient/underwater/additions/crackles1", + "volume": 0.7 + }, + "ambient/underwater/additions/crackles2", + { + "name": "ambient/underwater/additions/driplets1", + "volume": 0.5 + }, + { + "name": "ambient/underwater/additions/driplets2", + "volume": 0.5 + }, + "ambient/underwater/additions/earth_crack" + ] + }, + "ambient.underwater.loop.additions.ultra_rare": { + "sounds": [ + "ambient/underwater/additions/animal2", + "ambient/underwater/additions/dark1", + { + "name": "ambient/underwater/additions/dark2", + "volume": 0.7 + }, + "ambient/underwater/additions/dark3", + "ambient/underwater/additions/dark4" + ] + }, + "ambient.warped_forest.additions": { + "sounds": [ + { + "name": "ambient/nether/crimson_forest/addition1", + "volume": 0.3 + }, + { + "name": "ambient/nether/crimson_forest/particles1", + "pitch": 0.8, + "volume": 0.4, + "weight": 40 + }, + { + "name": "ambient/nether/crimson_forest/particles2", + "pitch": 0.8, + "volume": 0.3, + "weight": 40 + }, + { + "name": "ambient/nether/crimson_forest/particles3", + "pitch": 0.8, + "volume": 0.3, + "weight": 40 + }, + { + "name": "ambient/nether/warped_forest/addition1", + "pitch": 0.8, + "volume": 0.06, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition2", + "pitch": 0.7, + "volume": 0.06, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition3", + "pitch": 0.1, + "volume": 0.06, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition4", + "volume": 0.07, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition5", + "volume": 0.07, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition6", + "volume": 0.15 + }, + { + "name": "ambient/nether/warped_forest/enish1", + "pitch": 0.2, + "volume": 0.1, + "weight": 10 + }, + { + "name": "ambient/nether/warped_forest/enish2", + "pitch": 0.2, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/warped_forest/enish3", + "pitch": 0.2, + "volume": 0.07, + "weight": 6 + }, + { + "name": "ambient/nether/warped_forest/help1", + "volume": 0.2 + }, + { + "name": "ambient/nether/warped_forest/help2", + "volume": 0.2 + }, + { + "name": "ambient/nether/warped_forest/here1", + "volume": 0.1, + "weight": 2 + }, + { + "name": "ambient/nether/warped_forest/here1", + "pitch": 0.7, + "volume": 0.1, + "weight": 2 + }, + { + "name": "ambient/nether/warped_forest/here2", + "volume": 0.2, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/here2", + "pitch": 0.7, + "volume": 0.2, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/here3", + "volume": 0.2, + "weight": 3 + } + ] + }, + "ambient.warped_forest.loop": { + "sounds": [ + { + "name": "ambient/nether/warped_forest/ambience", + "stream": true, + "volume": 0.71 + } + ] + }, + "ambient.warped_forest.mood": { + "sounds": [ + "ambient/nether/warped_forest/creak1", + "ambient/nether/warped_forest/creak2", + "ambient/nether/warped_forest/creak3", + "ambient/nether/warped_forest/creak4", + "ambient/nether/warped_forest/creak5", + "ambient/nether/warped_forest/mood1", + "ambient/nether/warped_forest/mood2", + "ambient/nether/warped_forest/mood3", + "ambient/nether/warped_forest/mood4", + "ambient/nether/warped_forest/mood5", + "ambient/nether/warped_forest/mood6", + "ambient/nether/warped_forest/mood7" + ] + }, + "block.amethyst_block.break": { + "sounds": [ + "block/amethyst/break1", + "block/amethyst/break2", + "block/amethyst/break3", + "block/amethyst/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.amethyst_block.chime": { + "sounds": [ + { + "name": "block/amethyst/shimmer", + "volume": 0.2 + } + ], + "subtitle": "subtitles.block.amethyst_block.chime" + }, + "block.amethyst_block.fall": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.amethyst_block.hit": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.amethyst_block.place": { + "sounds": [ + "block/amethyst/place1", + "block/amethyst/place2", + "block/amethyst/place3", + "block/amethyst/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.amethyst_block.resonate": { + "sounds": [ + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate1" + }, + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate2" + }, + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate3" + }, + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate4" + } + ], + "subtitle": "subtitles.block.amethyst_block.resonate" + }, + "block.amethyst_block.step": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step13", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.amethyst_cluster.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/amethyst_cluster/break2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/amethyst_cluster/break3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/amethyst_cluster/break4", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.amethyst_cluster.fall": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.amethyst_cluster.hit": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.amethyst_cluster.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "volume": 0.9 + }, + { + "name": "block/amethyst_cluster/place2", + "volume": 0.9 + }, + { + "name": "block/amethyst_cluster/place3", + "volume": 0.9 + }, + { + "name": "block/amethyst_cluster/place4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.amethyst_cluster.step": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step13", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.ancient_debris.break": { + "sounds": [ + "block/ancient_debris/break1", + "block/ancient_debris/break2", + "block/ancient_debris/break3", + "block/ancient_debris/break4", + "block/ancient_debris/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.ancient_debris.fall": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.ancient_debris.hit": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.ancient_debris.place": { + "sounds": [ + "block/ancient_debris/break1", + "block/ancient_debris/break2", + "block/ancient_debris/break3", + "block/ancient_debris/break4", + "block/ancient_debris/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.ancient_debris.step": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.anvil.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.anvil.destroy": { + "sounds": [ + "random/anvil_break" + ], + "subtitle": "subtitles.block.anvil.destroy" + }, + "block.anvil.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.anvil.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.anvil.land": { + "sounds": [ + "random/anvil_land" + ], + "subtitle": "subtitles.block.anvil.land" + }, + "block.anvil.place": { + "sounds": [ + "random/anvil_land" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.anvil.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.anvil.use": { + "sounds": [ + "random/anvil_use" + ], + "subtitle": "subtitles.block.anvil.use" + }, + "block.azalea.break": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.azalea.fall": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.azalea.hit": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.azalea.place": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.azalea.step": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.azalea_leaves.break": { + "sounds": [ + { + "name": "block/azalea_leaves/break1", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break1", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "pitch": 0.92, + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.azalea_leaves.fall": { + "sounds": [ + "block/azalea_leaves/step1", + "block/azalea_leaves/step2", + "block/azalea_leaves/step3", + "block/azalea_leaves/step4", + "block/azalea_leaves/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.azalea_leaves.hit": { + "sounds": [ + { + "name": "block/azalea_leaves/step1", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step2", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step3", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step4", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.azalea_leaves.place": { + "sounds": [ + { + "name": "block/azalea_leaves/break1", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break1", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "pitch": 0.92, + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.azalea_leaves.step": { + "sounds": [ + { + "name": "block/azalea_leaves/step1", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step2", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step3", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step4", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step5", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo.break": { + "sounds": [ + { + "name": "block/bamboo/place1", + "volume": 0.8 + }, + { + "name": "block/bamboo/place2", + "volume": 0.8 + }, + { + "name": "block/bamboo/place3", + "volume": 0.8 + }, + { + "name": "block/bamboo/place4", + "volume": 0.8 + }, + { + "name": "block/bamboo/place5", + "volume": 0.8 + }, + { + "name": "block/bamboo/place6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo.fall": { + "sounds": [ + "block/bamboo/step1", + "block/bamboo/step2", + "block/bamboo/step3", + "block/bamboo/step4", + "block/bamboo/step5", + "block/bamboo/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bamboo.hit": { + "sounds": [ + "block/bamboo/step1", + "block/bamboo/step2", + "block/bamboo/step3", + "block/bamboo/step4", + "block/bamboo/step5", + "block/bamboo/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo.place": { + "sounds": [ + { + "name": "block/bamboo/place1", + "volume": 0.8 + }, + { + "name": "block/bamboo/place2", + "volume": 0.8 + }, + { + "name": "block/bamboo/place3", + "volume": 0.8 + }, + { + "name": "block/bamboo/place4", + "volume": 0.8 + }, + { + "name": "block/bamboo/place5", + "volume": 0.8 + }, + { + "name": "block/bamboo/place6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo.step": { + "sounds": [ + "block/bamboo/step1", + { + "name": "block/bamboo/step2", + "pitch": 0.7 + }, + "block/bamboo/step3", + { + "name": "block/bamboo/step4", + "pitch": 0.7 + }, + "block/bamboo/step5", + "block/bamboo/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo_sapling.break": { + "sounds": [ + { + "name": "block/bamboo/sapling_place1", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place2", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place3", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place4", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place5", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo_sapling.hit": { + "sounds": [ + { + "name": "block/bamboo/sapling_hit1", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit2", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit3", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit4", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo_sapling.place": { + "sounds": [ + { + "name": "block/bamboo/sapling_place1", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place2", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place3", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place4", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place5", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo_wood.break": { + "sounds": [ + { + "name": "block/bamboo_wood/break1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break4", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo_wood.fall": { + "sounds": [ + "block/bamboo_wood/step1", + "block/bamboo_wood/step2", + "block/bamboo_wood/step3", + "block/bamboo_wood/step4", + "block/bamboo_wood/step5", + "block/bamboo_wood/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bamboo_wood.hit": { + "sounds": [ + { + "name": "block/bamboo_wood/step1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step4", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step5", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo_wood.place": { + "sounds": [ + { + "name": "block/bamboo_wood/break1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break4", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo_wood.step": { + "sounds": [ + "block/bamboo_wood/step1", + "block/bamboo_wood/step2", + "block/bamboo_wood/step3", + "block/bamboo_wood/step4", + "block/bamboo_wood/step5", + "block/bamboo_wood/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo_wood_button.click_off": { + "sounds": [ + { + "name": "block/bamboo_wood_button/bamboo_wood_button", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.bamboo_wood_button.click_on": { + "sounds": [ + { + "name": "block/bamboo_wood_button/bamboo_wood_button", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.bamboo_wood_door.close": { + "sounds": [ + { + "name": "block/bamboo_wood_door/toggle1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.bamboo_wood_door.open": { + "sounds": [ + { + "name": "block/bamboo_wood_door/toggle1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.bamboo_wood_fence_gate.close": { + "sounds": [ + { + "name": "block/bamboo_wood_fence/toggle1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle4", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.bamboo_wood_fence_gate.open": { + "sounds": [ + { + "name": "block/bamboo_wood_fence/toggle1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle4", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.bamboo_wood_hanging_sign.break": { + "sounds": [ + { + "name": "block/bamboo_wood_hanging_sign/break1", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break2", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break3", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo_wood_hanging_sign.fall": { + "sounds": [ + "block/bamboo_wood_hanging_sign/step1", + "block/bamboo_wood_hanging_sign/step2", + "block/bamboo_wood_hanging_sign/step3", + "block/bamboo_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bamboo_wood_hanging_sign.hit": { + "sounds": [ + { + "name": "block/bamboo_wood_hanging_sign/step1", + "pitch": 1.1, + "volume": 0.7 + }, + { + "name": "block/bamboo_wood_hanging_sign/step2", + "pitch": 1.1, + "volume": 0.7 + }, + { + "name": "block/bamboo_wood_hanging_sign/step3", + "pitch": 1.1, + "volume": 0.7 + }, + { + "name": "block/bamboo_wood_hanging_sign/step4", + "pitch": 1.1, + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo_wood_hanging_sign.place": { + "sounds": [ + { + "name": "block/bamboo_wood_hanging_sign/break1", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break2", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break3", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo_wood_hanging_sign.step": { + "sounds": [ + "block/bamboo_wood_hanging_sign/step1", + "block/bamboo_wood_hanging_sign/step2", + "block/bamboo_wood_hanging_sign/step3", + "block/bamboo_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo_wood_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.bamboo_wood_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.bamboo_wood_trapdoor.close": { + "sounds": [ + "block/bamboo_wood_trapdoor/toggle1", + "block/bamboo_wood_trapdoor/toggle2", + "block/bamboo_wood_trapdoor/toggle3", + "block/bamboo_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.bamboo_wood_trapdoor.open": { + "sounds": [ + "block/bamboo_wood_trapdoor/toggle1", + "block/bamboo_wood_trapdoor/toggle2", + "block/bamboo_wood_trapdoor/toggle3", + "block/bamboo_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.barrel.close": { + "sounds": [ + "block/barrel/close" + ], + "subtitle": "subtitles.block.barrel.close" + }, + "block.barrel.open": { + "sounds": [ + "block/barrel/open1", + "block/barrel/open2" + ], + "subtitle": "subtitles.block.barrel.open" + }, + "block.basalt.break": { + "sounds": [ + "block/basalt/break1", + "block/basalt/break2", + "block/basalt/break3", + "block/basalt/break4", + "block/basalt/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.basalt.fall": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.basalt.hit": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.basalt.place": { + "sounds": [ + "block/basalt/break1", + "block/basalt/break2", + "block/basalt/break3", + "block/basalt/break4", + "block/basalt/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.basalt.step": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.beacon.activate": { + "sounds": [ + "block/beacon/activate" + ], + "subtitle": "subtitles.block.beacon.activate" + }, + "block.beacon.ambient": { + "sounds": [ + { + "attenuation_distance": 7, + "name": "block/beacon/ambient", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.beacon.ambient" + }, + "block.beacon.deactivate": { + "sounds": [ + "block/beacon/deactivate" + ], + "subtitle": "subtitles.block.beacon.deactivate" + }, + "block.beacon.power_select": { + "sounds": [ + "block/beacon/power1", + "block/beacon/power2", + "block/beacon/power3" + ], + "subtitle": "subtitles.block.beacon.power_select" + }, + "block.beehive.drip": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/beehive/drip1", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip1", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip2", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip2", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip3", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip3", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip4", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip4", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip5", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip5", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip6", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip6", + "pitch": 0.9, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.beehive.drip" + }, + "block.beehive.enter": { + "sounds": [ + { + "attenuation_distance": 14, + "name": "block/beehive/enter", + "pitch": 0.7 + }, + { + "attenuation_distance": 14, + "name": "block/beehive/enter", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.beehive.enter" + }, + "block.beehive.exit": { + "sounds": [ + { + "attenuation_distance": 14, + "name": "block/beehive/exit" + }, + { + "attenuation_distance": 14, + "name": "block/beehive/exit", + "pitch": 0.9 + }, + { + "attenuation_distance": 14, + "name": "block/beehive/exit", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.block.beehive.exit" + }, + "block.beehive.shear": { + "sounds": [ + { + "name": "block/beehive/shear", + "volume": 0.8 + }, + { + "name": "block/beehive/shear", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/beehive/shear", + "pitch": 0.9, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.beehive.shear" + }, + "block.beehive.work": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "block/beehive/work1", + "volume": 0.6 + }, + { + "attenuation_distance": 12, + "name": "block/beehive/work2", + "volume": 0.6 + }, + { + "attenuation_distance": 12, + "name": "block/beehive/work3", + "volume": 0.6 + }, + { + "attenuation_distance": 12, + "name": "block/beehive/work4", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.beehive.work" + }, + "block.bell.resonate": { + "sounds": [ + "block/bell/resonate", + { + "name": "block/bell/resonate", + "pitch": 0.85 + }, + { + "name": "block/bell/resonate", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.bell.resonate" + }, + "block.bell.use": { + "sounds": [ + { + "name": "block/bell/bell_use01", + "pitch": 0.93, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use01", + "pitch": 0.95, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use01", + "pitch": 0.97, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use02", + "pitch": 0.93, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use02", + "pitch": 0.95, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use02", + "pitch": 0.97, + "volume": 12.0 + } + ], + "subtitle": "subtitles.block.bell.use" + }, + "block.big_dripleaf.break": { + "sounds": [ + "block/big_dripleaf/break1", + "block/big_dripleaf/break2", + "block/big_dripleaf/break3", + "block/big_dripleaf/break4", + "block/big_dripleaf/break5", + "block/big_dripleaf/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.big_dripleaf.fall": { + "sounds": [ + "block/big_dripleaf/step1", + "block/big_dripleaf/step2", + "block/big_dripleaf/step3", + "block/big_dripleaf/step4", + "block/big_dripleaf/step5", + "block/big_dripleaf/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.big_dripleaf.hit": { + "sounds": [ + "block/big_dripleaf/step1", + "block/big_dripleaf/step2", + "block/big_dripleaf/step3", + "block/big_dripleaf/step4", + "block/big_dripleaf/step5", + "block/big_dripleaf/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.big_dripleaf.place": { + "sounds": [ + "block/big_dripleaf/break1", + "block/big_dripleaf/break2", + "block/big_dripleaf/break3", + "block/big_dripleaf/break4", + "block/big_dripleaf/break5", + "block/big_dripleaf/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.big_dripleaf.step": { + "sounds": [ + "block/big_dripleaf/step1", + "block/big_dripleaf/step2", + "block/big_dripleaf/step3", + "block/big_dripleaf/step4", + "block/big_dripleaf/step5", + "block/big_dripleaf/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.big_dripleaf.tilt_down": { + "sounds": [ + "block/big_dripleaf/tilt_down1", + "block/big_dripleaf/tilt_down2", + "block/big_dripleaf/tilt_down3", + "block/big_dripleaf/tilt_down4", + "block/big_dripleaf/tilt_down5" + ], + "subtitle": "subtitles.block.big_dripleaf.tilt_down" + }, + "block.big_dripleaf.tilt_up": { + "sounds": [ + "block/big_dripleaf/tilt_up1", + "block/big_dripleaf/tilt_up2", + "block/big_dripleaf/tilt_up3", + "block/big_dripleaf/tilt_up4" + ], + "subtitle": "subtitles.block.big_dripleaf.tilt_up" + }, + "block.blastfurnace.fire_crackle": { + "sounds": [ + "block/blastfurnace/blastfurnace1", + "block/blastfurnace/blastfurnace2", + "block/blastfurnace/blastfurnace3", + "block/blastfurnace/blastfurnace4", + "block/blastfurnace/blastfurnace5" + ], + "subtitle": "subtitles.block.blastfurnace.fire_crackle" + }, + "block.bone_block.break": { + "sounds": [ + { + "name": "block/bone_block/break1", + "volume": 0.9 + }, + { + "name": "block/bone_block/break2", + "volume": 0.9 + }, + { + "name": "block/bone_block/break3", + "volume": 0.9 + }, + { + "name": "block/bone_block/break4", + "volume": 0.9 + }, + { + "name": "block/bone_block/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bone_block.fall": { + "sounds": [ + "block/bone_block/step1", + "block/bone_block/step2", + "block/bone_block/step3", + "block/bone_block/step4", + "block/bone_block/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bone_block.hit": { + "sounds": [ + "block/bone_block/step1", + "block/bone_block/step2", + "block/bone_block/step3", + "block/bone_block/step4", + "block/bone_block/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bone_block.place": { + "sounds": [ + { + "name": "block/bone_block/break1", + "volume": 0.9 + }, + { + "name": "block/bone_block/break2", + "volume": 0.9 + }, + { + "name": "block/bone_block/break3", + "volume": 0.9 + }, + { + "name": "block/bone_block/break4", + "volume": 0.9 + }, + { + "name": "block/bone_block/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bone_block.step": { + "sounds": [ + "block/bone_block/step1", + "block/bone_block/step2", + "block/bone_block/step3", + "block/bone_block/step4", + "block/bone_block/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.brewing_stand.brew": { + "sounds": [ + "block/brewing_stand/brew1", + "block/brewing_stand/brew2" + ], + "subtitle": "subtitles.block.brewing_stand.brew" + }, + "block.bubble_column.bubble_pop": { + "sounds": [ + { + "name": "block/bubble_column/bubble1", + "volume": 0.1 + }, + { + "name": "block/bubble_column/bubble2", + "volume": 0.1 + }, + { + "name": "block/bubble_column/bubble3", + "volume": 0.1 + } + ], + "subtitle": "subtitles.block.bubble_column.bubble_pop" + }, + "block.bubble_column.upwards_ambient": { + "sounds": [ + { + "name": "block/bubble_column/upwards_ambient1", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient2", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient3", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient4", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient5", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.bubble_column.upwards_ambient" + }, + "block.bubble_column.upwards_inside": { + "sounds": [ + { + "name": "block/bubble_column/upwards_inside", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.bubble_column.upwards_inside" + }, + "block.bubble_column.whirlpool_ambient": { + "sounds": [ + { + "name": "block/bubble_column/whirlpool_ambient1", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient2", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient3", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient4", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient5", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.bubble_column.whirlpool_ambient" + }, + "block.bubble_column.whirlpool_inside": { + "sounds": [ + { + "name": "block/bubble_column/whirlpool_inside", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.bubble_column.whirlpool_inside" + }, + "block.cake.add_candle": { + "sounds": [ + "block/cake/add_candle1", + "block/cake/add_candle2", + "block/cake/add_candle3" + ], + "subtitle": "subtitles.block.cake.add_candle" + }, + "block.calcite.break": { + "sounds": [ + { + "name": "block/calcite/break1", + "volume": 0.9 + }, + { + "name": "block/calcite/break2", + "volume": 0.9 + }, + { + "name": "block/calcite/break3", + "volume": 0.9 + }, + { + "name": "block/calcite/break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.calcite.fall": { + "sounds": [ + "block/calcite/step1", + "block/calcite/step2", + "block/calcite/step3", + "block/calcite/step4", + "block/calcite/step5", + "block/calcite/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.calcite.hit": { + "sounds": [ + "block/calcite/step1", + "block/calcite/step2", + "block/calcite/step3", + "block/calcite/step4", + "block/calcite/step5", + "block/calcite/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.calcite.place": { + "sounds": [ + { + "name": "block/calcite/place1", + "volume": 0.94 + }, + { + "name": "block/calcite/place2", + "volume": 0.94 + }, + { + "name": "block/calcite/place3", + "volume": 0.94 + }, + { + "name": "block/calcite/place4", + "volume": 0.94 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.calcite.step": { + "sounds": [ + "block/calcite/step1", + "block/calcite/step2", + "block/calcite/step3", + "block/calcite/step4", + "block/calcite/step5", + "block/calcite/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.campfire.crackle": { + "sounds": [ + "block/campfire/crackle1", + "block/campfire/crackle2", + "block/campfire/crackle3", + "block/campfire/crackle4", + "block/campfire/crackle5", + "block/campfire/crackle6" + ], + "subtitle": "subtitles.block.campfire.crackle" + }, + "block.candle.ambient": { + "sounds": [ + { + "attenuation_distance": 3, + "name": "block/candle/ambient1" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient1", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient1", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient2" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient2", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient2", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient3" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient3", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient3", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient4" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient4", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient4", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient5" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient5", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient5", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient6" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient6", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient6", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient7" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient7", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient7", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient8" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient8", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient8", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient9" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient9", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient9", + "pitch": 0.9, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.candle.crackle" + }, + "block.candle.break": { + "sounds": [ + "block/candle/break1", + "block/candle/break2", + "block/candle/break3", + "block/candle/break4", + "block/candle/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.candle.extinguish": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1" + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 1.1 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2" + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 1.1 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3" + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 1.1 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.candle.extinguish" + }, + "block.candle.fall": { + "sounds": [ + "block/candle/step1", + "block/candle/step2", + "block/candle/step3", + "block/candle/step4", + "block/candle/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.candle.hit": { + "sounds": [ + "block/candle/step1", + "block/candle/step2", + "block/candle/step3", + "block/candle/step4", + "block/candle/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.candle.place": { + "sounds": [ + "block/candle/break1", + "block/candle/break2", + "block/candle/break3", + "block/candle/break4", + "block/candle/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.candle.step": { + "sounds": [ + "block/candle/step1", + "block/candle/step2", + "block/candle/step3", + "block/candle/step4", + "block/candle/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cave_vines.break": { + "sounds": [ + "block/cave_vines/break1", + "block/cave_vines/break2", + "block/cave_vines/break3", + "block/cave_vines/break4", + "block/cave_vines/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cave_vines.fall": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cave_vines.hit": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cave_vines.pick_berries": { + "sounds": [ + { + "name": "block.sweet_berry_bush.pick_berries", + "type": "event" + } + ], + "subtitle": "subtitles.block.sweet_berry_bush.pick_berries" + }, + "block.cave_vines.place": { + "sounds": [ + "block/cave_vines/break1", + "block/cave_vines/break2", + "block/cave_vines/break3", + "block/cave_vines/break4", + "block/cave_vines/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cave_vines.step": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.chain.break": { + "sounds": [ + { + "name": "block/chain/break1", + "volume": 0.5 + }, + { + "name": "block/chain/break2", + "volume": 0.5 + }, + { + "name": "block/chain/break3", + "volume": 0.5 + }, + { + "name": "block/chain/break4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.chain.fall": { + "sounds": [ + "block/chain/step1", + "block/chain/step2", + "block/chain/step3", + "block/chain/step4", + "block/chain/step5", + "block/chain/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.chain.hit": { + "sounds": [ + { + "name": "block/chain/step1", + "volume": 0.8 + }, + { + "name": "block/chain/step2", + "volume": 0.8 + }, + { + "name": "block/chain/step3", + "volume": 0.8 + }, + { + "name": "block/chain/step4", + "volume": 0.8 + }, + { + "name": "block/chain/step5", + "volume": 0.8 + }, + { + "name": "block/chain/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.chain.place": { + "sounds": [ + { + "name": "block/chain/break1", + "volume": 0.5 + }, + { + "name": "block/chain/break2", + "volume": 0.5 + }, + { + "name": "block/chain/break3", + "volume": 0.5 + }, + { + "name": "block/chain/break4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.chain.step": { + "sounds": [ + "block/chain/step1", + "block/chain/step2", + "block/chain/step3", + "block/chain/step4", + "block/chain/step5", + "block/chain/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_leaves.break": { + "sounds": [ + "block/cherry_leaves/break1", + "block/cherry_leaves/break2", + "block/cherry_leaves/break3", + "block/cherry_leaves/break4", + "block/cherry_leaves/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_leaves.fall": { + "sounds": [ + "block/cherry_leaves/step1", + "block/cherry_leaves/step2", + "block/cherry_leaves/step3", + "block/cherry_leaves/step4", + "block/cherry_leaves/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_leaves.hit": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_leaves.place": { + "sounds": [ + "block/cherry_leaves/break1", + "block/cherry_leaves/break2", + "block/cherry_leaves/break3", + "block/cherry_leaves/break4", + "block/cherry_leaves/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_leaves.step": { + "sounds": [ + "block/cherry_leaves/step1", + "block/cherry_leaves/step2", + "block/cherry_leaves/step3", + "block/cherry_leaves/step4", + "block/cherry_leaves/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_sapling.break": { + "sounds": [ + "block/bamboo/sapling_place1", + "block/bamboo/sapling_place2", + "block/bamboo/sapling_place3", + "block/bamboo/sapling_place4", + "block/bamboo/sapling_place5", + "block/bamboo/sapling_place6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_sapling.fall": { + "sounds": [ + "block/bamboo/sapling_hit1", + "block/bamboo/sapling_hit2", + "block/bamboo/sapling_hit3", + "block/bamboo/sapling_hit4", + "block/bamboo/sapling_hit5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_sapling.hit": { + "sounds": [ + "block/bamboo/sapling_hit1", + "block/bamboo/sapling_hit2", + "block/bamboo/sapling_hit3", + "block/bamboo/sapling_hit4", + "block/bamboo/sapling_hit5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_sapling.place": { + "sounds": [ + "block/bamboo/sapling_place1", + "block/bamboo/sapling_place2", + "block/bamboo/sapling_place3", + "block/bamboo/sapling_place4", + "block/bamboo/sapling_place5", + "block/bamboo/sapling_place6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_sapling.step": { + "sounds": [ + "block/bamboo/sapling_hit1", + "block/bamboo/sapling_hit2", + "block/bamboo/sapling_hit3", + "block/bamboo/sapling_hit4", + "block/bamboo/sapling_hit5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_wood.break": { + "sounds": [ + "block/cherry_wood/break1", + "block/cherry_wood/break2", + "block/cherry_wood/break3", + "block/cherry_wood/break4", + "block/cherry_wood/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_wood.fall": { + "sounds": [ + "block/cherry_wood/step1", + "block/cherry_wood/step2", + "block/cherry_wood/step3", + "block/cherry_wood/step4", + "block/cherry_wood/step5", + "block/cherry_wood/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_wood.hit": { + "sounds": [ + "block/cherry_wood/step1", + "block/cherry_wood/step2", + "block/cherry_wood/step3", + "block/cherry_wood/step4", + "block/cherry_wood/step5", + "block/cherry_wood/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_wood.place": { + "sounds": [ + "block/cherry_wood/break1", + "block/cherry_wood/break2", + "block/cherry_wood/break3", + "block/cherry_wood/break4", + "block/cherry_wood/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_wood.step": { + "sounds": [ + "block/cherry_wood/step1", + "block/cherry_wood/step2", + "block/cherry_wood/step3", + "block/cherry_wood/step4", + "block/cherry_wood/step5", + "block/cherry_wood/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_wood_button.click_off": { + "sounds": [ + { + "name": "block/cherrywood_button/cherrywood_click", + "pitch": 0.5, + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.cherry_wood_button.click_on": { + "sounds": [ + { + "name": "block/cherrywood_button/cherrywood_click", + "pitch": 0.6, + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.cherry_wood_door.close": { + "sounds": [ + "block/cherrywood_door/toggle1", + "block/cherrywood_door/toggle2", + "block/cherrywood_door/toggle3", + "block/cherrywood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.cherry_wood_door.open": { + "sounds": [ + "block/cherrywood_door/toggle1", + "block/cherrywood_door/toggle2", + "block/cherrywood_door/toggle3", + "block/cherrywood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.cherry_wood_fence_gate.close": { + "sounds": [ + "block/cherrywood_fence_gate/toggle1", + "block/cherrywood_fence_gate/toggle2", + "block/cherrywood_fence_gate/toggle3" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.cherry_wood_fence_gate.open": { + "sounds": [ + "block/cherrywood_fence_gate/toggle1", + "block/cherrywood_fence_gate/toggle2", + "block/cherrywood_fence_gate/toggle3" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.cherry_wood_hanging_sign.break": { + "sounds": [ + "block/cherry_wood_hanging_sign/break1", + "block/cherry_wood_hanging_sign/break2", + "block/cherry_wood_hanging_sign/break3", + "block/cherry_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_wood_hanging_sign.fall": { + "sounds": [ + "block/cherry_wood_hanging_sign/step1", + "block/cherry_wood_hanging_sign/step2", + "block/cherry_wood_hanging_sign/step3", + "block/cherry_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_wood_hanging_sign.hit": { + "sounds": [ + "block/cherry_wood_hanging_sign/step1", + "block/cherry_wood_hanging_sign/step2", + "block/cherry_wood_hanging_sign/step3", + "block/cherry_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_wood_hanging_sign.place": { + "sounds": [ + "block/cherry_wood_hanging_sign/break1", + "block/cherry_wood_hanging_sign/break2", + "block/cherry_wood_hanging_sign/break3", + "block/cherry_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_wood_hanging_sign.step": { + "sounds": [ + "block/cherry_wood_hanging_sign/step1", + "block/cherry_wood_hanging_sign/step2", + "block/cherry_wood_hanging_sign/step3", + "block/cherry_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_wood_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.cherry_wood_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.cherry_wood_trapdoor.close": { + "sounds": [ + "block/cherrywood_trapdoor/toggle1", + "block/cherrywood_trapdoor/toggle2", + "block/cherrywood_trapdoor/toggle3" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.cherry_wood_trapdoor.open": { + "sounds": [ + "block/cherrywood_trapdoor/toggle1", + "block/cherrywood_trapdoor/toggle2", + "block/cherrywood_trapdoor/toggle3" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.chest.close": { + "sounds": [ + "block/chest/close1", + "block/chest/close2", + "block/chest/close3" + ], + "subtitle": "subtitles.block.chest.close" + }, + "block.chest.locked": { + "sounds": [ + "block/chest/close_locked", + "block/chest/open_locked" + ], + "subtitle": "subtitles.block.chest.locked" + }, + "block.chest.open": { + "sounds": [ + "block/chest/open" + ], + "subtitle": "subtitles.block.chest.open" + }, + "block.chiseled_bookshelf.break": { + "sounds": [ + "block/chiseled_bookshelf/break1", + "block/chiseled_bookshelf/break2", + "block/chiseled_bookshelf/break3", + "block/chiseled_bookshelf/break4", + "block/chiseled_bookshelf/break5", + "block/chiseled_bookshelf/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.chiseled_bookshelf.fall": { + "sounds": [ + "block/chiseled_bookshelf/step1", + "block/chiseled_bookshelf/step2", + "block/chiseled_bookshelf/step3", + "block/chiseled_bookshelf/step4", + "block/chiseled_bookshelf/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.chiseled_bookshelf.hit": { + "sounds": [ + "block/chiseled_bookshelf/step1", + "block/chiseled_bookshelf/step2", + "block/chiseled_bookshelf/step3", + "block/chiseled_bookshelf/step4", + "block/chiseled_bookshelf/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.chiseled_bookshelf.insert": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/insert1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert1", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert2", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert3", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert4", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert4", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert4", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.insert" + }, + "block.chiseled_bookshelf.insert.enchanted": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/insert_enchanted1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted1", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted2", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted3", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted4", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted4", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted4", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.insert_enchanted" + }, + "block.chiseled_bookshelf.pickup": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/pickup1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup3", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.take" + }, + "block.chiseled_bookshelf.pickup.enchanted": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/pickup_enchanted1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted3", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.take_enchanted" + }, + "block.chiseled_bookshelf.place": { + "sounds": [ + "block/chiseled_bookshelf/break1", + "block/chiseled_bookshelf/break2", + "block/chiseled_bookshelf/break3", + "block/chiseled_bookshelf/break4", + "block/chiseled_bookshelf/break5", + "block/chiseled_bookshelf/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.chiseled_bookshelf.step": { + "sounds": [ + "block/chiseled_bookshelf/step1", + "block/chiseled_bookshelf/step2", + "block/chiseled_bookshelf/step3", + "block/chiseled_bookshelf/step4", + "block/chiseled_bookshelf/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.chorus_flower.death": { + "sounds": [ + "block/chorus_flower/death1", + "block/chorus_flower/death2", + "block/chorus_flower/death3" + ], + "subtitle": "subtitles.block.chorus_flower.death" + }, + "block.chorus_flower.grow": { + "sounds": [ + "block/chorus_flower/grow1", + "block/chorus_flower/grow2", + "block/chorus_flower/grow3", + "block/chorus_flower/grow4" + ], + "subtitle": "subtitles.block.chorus_flower.grow" + }, + "block.cobweb.break": { + "sounds": [ + "block/cobweb/break1", + "block/cobweb/break2", + "block/cobweb/break3", + "block/cobweb/break4", + "block/cobweb/break5", + "block/cobweb/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cobweb.fall": { + "sounds": [ + "block/cobweb/step1", + "block/cobweb/step2", + "block/cobweb/step3", + "block/cobweb/step4", + "block/cobweb/step5", + "block/cobweb/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cobweb.hit": { + "sounds": [ + "block/cobweb/step1", + "block/cobweb/step2", + "block/cobweb/step3", + "block/cobweb/step4", + "block/cobweb/step5", + "block/cobweb/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cobweb.place": { + "sounds": [ + "block/cobweb/break1", + "block/cobweb/break2", + "block/cobweb/break3", + "block/cobweb/break4", + "block/cobweb/break5", + "block/cobweb/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cobweb.step": { + "sounds": [ + "block/cobweb/step1", + "block/cobweb/step2", + "block/cobweb/step3", + "block/cobweb/step4", + "block/cobweb/step5", + "block/cobweb/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.comparator.click": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.comparator.click" + }, + "block.composter.empty": { + "sounds": [ + "block/composter/empty1", + "block/composter/empty2", + "block/composter/empty3" + ], + "subtitle": "subtitles.block.composter.empty" + }, + "block.composter.fill": { + "sounds": [ + { + "name": "block/composter/fill1", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "block/composter/fill2", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "block/composter/fill3", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "block/composter/fill4", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.composter.fill" + }, + "block.composter.fill_success": { + "sounds": [ + "block/composter/fill_success1", + "block/composter/fill_success2", + "block/composter/fill_success3", + "block/composter/fill_success4" + ], + "subtitle": "subtitles.block.composter.fill" + }, + "block.composter.ready": { + "sounds": [ + "block/composter/ready1", + "block/composter/ready2", + "block/composter/ready3", + "block/composter/ready4" + ], + "subtitle": "subtitles.block.composter.ready" + }, + "block.conduit.activate": { + "sounds": [ + { + "name": "block/conduit/activate", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.conduit.activate" + }, + "block.conduit.ambient": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/conduit/ambient" + } + ], + "subtitle": "subtitles.block.conduit.ambient" + }, + "block.conduit.ambient.short": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/conduit/short1" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short2" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short3" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short4" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short5" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short6" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short7" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short8" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short9" + } + ] + }, + "block.conduit.attack.target": { + "sounds": [ + "block/conduit/attack1", + "block/conduit/attack2", + "block/conduit/attack3" + ], + "subtitle": "subtitles.block.conduit.attack.target" + }, + "block.conduit.deactivate": { + "sounds": [ + { + "name": "block/conduit/deactivate", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.conduit.deactivate" + }, + "block.copper.break": { + "sounds": [ + "block/copper/break1", + "block/copper/break2", + "block/copper/break3", + "block/copper/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.copper.fall": { + "sounds": [ + "block/copper/step1", + "block/copper/step2", + "block/copper/step3", + "block/copper/step4", + "block/copper/step5", + "block/copper/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.copper.hit": { + "sounds": [ + "block/copper/step1", + "block/copper/step2", + "block/copper/step3", + "block/copper/step4", + "block/copper/step5", + "block/copper/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.copper.place": { + "sounds": [ + "block/copper/break1", + "block/copper/break2", + "block/copper/break3", + "block/copper/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.copper.step": { + "sounds": [ + "block/copper/step1", + "block/copper/step2", + "block/copper/step3", + "block/copper/step4", + "block/copper/step5", + "block/copper/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.copper_bulb.break": { + "sounds": [ + "block/copper_bulb/break1", + "block/copper_bulb/break2", + "block/copper_bulb/break3", + "block/copper_bulb/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.copper_bulb.fall": { + "sounds": [ + "block/copper_bulb/step1", + "block/copper_bulb/step2", + "block/copper_bulb/step3", + "block/copper_bulb/step4", + "block/copper_bulb/step5", + "block/copper_bulb/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.copper_bulb.hit": { + "sounds": [ + "block/copper_bulb/step1", + "block/copper_bulb/step2", + "block/copper_bulb/step3", + "block/copper_bulb/step4", + "block/copper_bulb/step5", + "block/copper_bulb/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.copper_bulb.place": { + "sounds": [ + "block/copper_bulb/place1", + "block/copper_bulb/place2", + "block/copper_bulb/place3", + "block/copper_bulb/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.copper_bulb.step": { + "sounds": [ + "block/copper_bulb/step1", + "block/copper_bulb/step2", + "block/copper_bulb/step3", + "block/copper_bulb/step4", + "block/copper_bulb/step5", + "block/copper_bulb/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.copper_bulb.turn_off": { + "sounds": [ + { + "attenuation_distance": 6, + "name": "block/copper_bulb/toggle", + "pitch": 0.75 + } + ], + "subtitle": "subtitles.block.copper_bulb.turn_off" + }, + "block.copper_bulb.turn_on": { + "sounds": [ + { + "attenuation_distance": 6, + "name": "block/copper_bulb/toggle" + } + ], + "subtitle": "subtitles.block.copper_bulb.turn_on" + }, + "block.copper_door.close": { + "sounds": [ + "block/copper_door/toggle1", + "block/copper_door/toggle2", + "block/copper_door/toggle3" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.copper_door.open": { + "sounds": [ + "block/copper_door/toggle1", + "block/copper_door/toggle2", + { + "name": "block/copper_door/toggle2", + "pitch": 1.1 + }, + "block/copper_door/toggle3", + { + "name": "block/copper_door/toggle3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.copper_grate.break": { + "sounds": [ + "block/copper_grate/break1", + "block/copper_grate/break2", + "block/copper_grate/break3", + "block/copper_grate/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.copper_grate.fall": { + "sounds": [ + "block/copper_grate/step1", + "block/copper_grate/step2", + "block/copper_grate/step3", + "block/copper_grate/step4", + "block/copper_grate/step5", + "block/copper_grate/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.copper_grate.hit": { + "sounds": [ + "block/copper_grate/step1", + "block/copper_grate/step2", + "block/copper_grate/step3", + "block/copper_grate/step4", + "block/copper_grate/step5", + "block/copper_grate/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.copper_grate.place": { + "sounds": [ + "block/copper_grate/break1", + { + "name": "block/copper_grate/break1", + "pitch": 0.95 + }, + "block/copper_grate/break2", + "block/copper_grate/break3", + "block/copper_grate/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.copper_grate.step": { + "sounds": [ + "block/copper_grate/step1", + "block/copper_grate/step2", + "block/copper_grate/step3", + "block/copper_grate/step4", + "block/copper_grate/step5", + "block/copper_grate/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.copper_trapdoor.close": { + "sounds": [ + "block/copper_trapdoor/toggle1", + "block/copper_trapdoor/toggle2", + "block/copper_trapdoor/toggle3", + "block/copper_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.copper_trapdoor.close" + }, + "block.copper_trapdoor.open": { + "sounds": [ + "block/copper_trapdoor/toggle1", + "block/copper_trapdoor/toggle2", + "block/copper_trapdoor/toggle3", + "block/copper_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.copper_trapdoor.open" + }, + "block.coral_block.break": { + "sounds": [ + "dig/coral1", + "dig/coral2", + "dig/coral3", + "dig/coral4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.coral_block.fall": { + "sounds": [ + "step/coral1", + "step/coral2", + "step/coral3", + "step/coral4", + "step/coral5", + "step/coral6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.coral_block.hit": { + "sounds": [ + "step/coral1", + "step/coral2", + "step/coral3", + "step/coral4", + "step/coral5", + "step/coral6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.coral_block.place": { + "sounds": [ + "dig/coral1", + "dig/coral2", + "dig/coral3", + "dig/coral4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.coral_block.step": { + "sounds": [ + "step/coral1", + "step/coral2", + "step/coral3", + "step/coral4", + "step/coral5", + "step/coral6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.crafter.craft": { + "sounds": [ + { + "attenuation_distance": 5, + "name": "block/crafter/craft" + }, + { + "attenuation_distance": 5, + "name": "block/crafter/craft", + "pitch": 0.96 + }, + { + "attenuation_distance": 5, + "name": "block/crafter/craft", + "pitch": 1.04 + } + ], + "subtitle": "subtitles.block.crafter.craft" + }, + "block.crafter.fail": { + "sounds": [ + { + "attenuation_distance": 3, + "name": "block/crafter/fail" + }, + { + "attenuation_distance": 3, + "name": "block/crafter/fail", + "pitch": 0.96 + }, + { + "attenuation_distance": 3, + "name": "block/crafter/fail", + "pitch": 1.04 + } + ], + "subtitle": "subtitles.block.crafter.fail" + }, + "block.creaking_heart.break": { + "sounds": [ + { + "name": "block/creaking_heart/break/creaking_heart_break", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.creaking_heart.fall": { + "sounds": [ + "block/creaking_heart/fall/creaking_heart_fall" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.creaking_heart.hit": { + "sounds": [ + "block/creaking_heart/hit/creaking_heart_hit1", + "block/creaking_heart/hit/creaking_heart_hit2", + "block/creaking_heart/hit/creaking_heart_hit3", + "block/creaking_heart/hit/creaking_heart_hit4", + "block/creaking_heart/hit/creaking_heart_hit5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.creaking_heart.hurt": { + "sounds": [ + "block/creaking_heart/hurt/trail1", + "block/creaking_heart/hurt/trail2", + "block/creaking_heart/hurt/trail3", + "block/creaking_heart/hurt/trail4", + "block/creaking_heart/hurt/trail5", + "block/creaking_heart/hurt/trail6", + "block/creaking_heart/hurt/trail7" + ], + "subtitle": "subtitles.block.creaking_heart.hurt" + }, + "block.creaking_heart.idle": { + "sounds": [ + "block/creaking_heart/idle/creaking_heart_idle1", + "block/creaking_heart/idle/creaking_heart_idle2", + "block/creaking_heart/idle/creaking_heart_idle3", + "block/creaking_heart/idle/creaking_heart_idle4" + ], + "subtitle": "subtitles.ambient.sound" + }, + "block.creaking_heart.place": { + "sounds": [ + "block/creaking_heart/place/creaking_heart_place1", + "block/creaking_heart/place/creaking_heart_place2", + "block/creaking_heart/place/creaking_heart_place3", + "block/creaking_heart/place/creaking_heart_place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.creaking_heart.spawn": { + "sounds": [ + "block/creaking_heart/spawnmob/creaking_heart_spawnmob" + ], + "subtitle": "subtitles.block.creaking_heart.spawn" + }, + "block.creaking_heart.step": { + "sounds": [ + "block/creaking_heart/step/creaking_heart_step1", + "block/creaking_heart/step/creaking_heart_step2", + "block/creaking_heart/step/creaking_heart_step3", + "block/creaking_heart/step/creaking_heart_step4", + "block/creaking_heart/step/creaking_heart_step5", + "block/creaking_heart/step/creaking_heart_step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.crop.break": { + "sounds": [ + { + "name": "block/bamboo/sapling_place1", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place2", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place3", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place4", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place5", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.decorated_pot.break": { + "sounds": [ + "block/decorated_pot/break1", + "block/decorated_pot/break2", + "block/decorated_pot/break3", + "block/decorated_pot/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.decorated_pot.fall": { + "sounds": [ + "block/decorated_pot/step1", + "block/decorated_pot/step2", + "block/decorated_pot/step3", + "block/decorated_pot/step4", + "block/decorated_pot/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.decorated_pot.hit": { + "sounds": [ + "block/decorated_pot/step1", + "block/decorated_pot/step2", + "block/decorated_pot/step3", + "block/decorated_pot/step4", + "block/decorated_pot/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.decorated_pot.insert": { + "sounds": [ + { + "name": "block/decorated_pot/insert1", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert2", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert3", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.decorated_pot.insert" + }, + "block.decorated_pot.insert_fail": { + "sounds": [ + { + "name": "block/decorated_pot/insert_fail1", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail2", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail3", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail4", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.decorated_pot.insert_fail" + }, + "block.decorated_pot.place": { + "sounds": [ + "block/decorated_pot/break1", + "block/decorated_pot/break2", + "block/decorated_pot/break3", + "block/decorated_pot/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.decorated_pot.shatter": { + "sounds": [ + "block/decorated_pot/shatter1", + "block/decorated_pot/shatter2", + "block/decorated_pot/shatter3", + "block/decorated_pot/shatter4", + "block/decorated_pot/shatter5" + ], + "subtitle": "subtitles.block.decorated_pot.shatter" + }, + "block.decorated_pot.step": { + "sounds": [ + "block/decorated_pot/step1", + "block/decorated_pot/step2", + "block/decorated_pot/step3", + "block/decorated_pot/step4", + "block/decorated_pot/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.deepslate.break": { + "sounds": [ + "block/deepslate/break1", + "block/deepslate/break2", + "block/deepslate/break3", + "block/deepslate/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.deepslate.fall": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.deepslate.hit": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.deepslate.place": { + "sounds": [ + "block/deepslate/place1", + "block/deepslate/place2", + "block/deepslate/place3", + "block/deepslate/place4", + "block/deepslate/place5", + "block/deepslate/place6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.deepslate.step": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.deepslate_bricks.break": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place2", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place3", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place4", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place5", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.deepslate_bricks.fall": { + "sounds": [ + "block/deepslate_bricks/step1", + "block/deepslate_bricks/step2", + "block/deepslate_bricks/step3", + "block/deepslate_bricks/step4", + "block/deepslate_bricks/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.deepslate_bricks.hit": { + "sounds": [ + "block/deepslate_bricks/step1", + "block/deepslate_bricks/step2", + "block/deepslate_bricks/step3", + "block/deepslate_bricks/step4", + "block/deepslate_bricks/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.deepslate_bricks.place": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place2", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place3", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place4", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place5", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.deepslate_bricks.step": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.deepslate_tiles.break": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place2", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place3", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place4", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place5", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place6", + "pitch": 1.3, + "volume": 0.92 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.deepslate_tiles.fall": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 1.3 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.deepslate_tiles.hit": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 1.3 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.deepslate_tiles.place": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place2", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place3", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place4", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place5", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place6", + "pitch": 1.2, + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.deepslate_tiles.step": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.dispenser.dispense": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.dispenser.dispense" + }, + "block.dispenser.fail": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.dispenser.fail" + }, + "block.dispenser.launch": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.block.dispenser.dispense" + }, + "block.dripstone_block.break": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.dripstone_block.fall": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.dripstone_block.hit": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.dripstone_block.place": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.dripstone_block.step": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.enchantment_table.use": { + "sounds": [ + "block/enchantment_table/enchant1", + "block/enchantment_table/enchant2", + "block/enchantment_table/enchant3" + ], + "subtitle": "subtitles.block.enchantment_table.use" + }, + "block.end_gateway.spawn": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.generic.explode" + }, + "block.end_portal.spawn": { + "sounds": [ + "block/end_portal/endportal" + ], + "subtitle": "subtitles.block.end_portal.spawn" + }, + "block.end_portal_frame.fill": { + "sounds": [ + "block/end_portal/eyeplace1", + "block/end_portal/eyeplace2", + "block/end_portal/eyeplace3" + ], + "subtitle": "subtitles.block.end_portal_frame.fill" + }, + "block.ender_chest.close": { + "sounds": [ + "block/enderchest/close" + ], + "subtitle": "subtitles.block.chest.close" + }, + "block.ender_chest.open": { + "sounds": [ + "block/enderchest/open" + ], + "subtitle": "subtitles.block.chest.open" + }, + "block.eyeblossom.close": { + "sounds": [ + "block/eyeblossom/eyeblossom_close1", + "block/eyeblossom/eyeblossom_close2", + "block/eyeblossom/eyeblossom_close3" + ], + "subtitle": "subtitles.block.eyeblossom.close" + }, + "block.eyeblossom.close_long": { + "sounds": [ + "block/eyeblossom/eyeblossom_close_long" + ], + "subtitle": "subtitles.block.eyeblossom.close" + }, + "block.eyeblossom.idle": { + "sounds": [ + "block/eyeblossom/eyeblossom_idle1", + "block/eyeblossom/eyeblossom_idle2", + "block/eyeblossom/eyeblossom_idle3", + "block/eyeblossom/eyeblossom_idle4", + "block/eyeblossom/eyeblossom_idle5", + "block/eyeblossom/eyeblossom_idle6" + ], + "subtitle": "subtitles.ambient.sound" + }, + "block.eyeblossom.open": { + "sounds": [ + "block/eyeblossom/eyeblossom_open1", + "block/eyeblossom/eyeblossom_open2", + "block/eyeblossom/eyeblossom_open3", + "block/eyeblossom/eyeblossom_open4" + ], + "subtitle": "subtitles.block.eyeblossom.open" + }, + "block.eyeblossom.open_long": { + "sounds": [ + "block/eyeblossom/eyeblossom_open_long" + ], + "subtitle": "subtitles.block.eyeblossom.open" + }, + "block.fence_gate.close": { + "sounds": [ + { + "name": "block/fence_gate/close1", + "volume": 0.9 + }, + { + "name": "block/fence_gate/close2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.fence_gate.open": { + "sounds": [ + { + "name": "block/fence_gate/open1", + "volume": 0.9 + }, + { + "name": "block/fence_gate/open2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.fire.ambient": { + "sounds": [ + "fire/fire" + ], + "subtitle": "subtitles.block.fire.ambient" + }, + "block.fire.extinguish": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.fire.extinguish" + }, + "block.flowering_azalea.break": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.flowering_azalea.fall": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.flowering_azalea.hit": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.flowering_azalea.place": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.flowering_azalea.step": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.froglight.break": { + "sounds": [ + { + "name": "block/froglight/break1", + "volume": 0.8 + }, + { + "name": "block/froglight/break2", + "volume": 0.8 + }, + { + "name": "block/froglight/break3", + "volume": 0.8 + }, + { + "name": "block/froglight/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.froglight.fall": { + "sounds": [ + "block/froglight/step1", + "block/froglight/step2", + "block/froglight/step3", + "block/froglight/step4", + "block/froglight/step5", + "block/froglight/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.froglight.hit": { + "sounds": [ + { + "name": "block/froglight/step1", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step2", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step3", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step4", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step5", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step6", + "pitch": 1.3, + "volume": 0.83 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.froglight.place": { + "sounds": [ + { + "name": "block/froglight/break1", + "volume": 0.8 + }, + { + "name": "block/froglight/break2", + "volume": 0.8 + }, + { + "name": "block/froglight/break3", + "volume": 0.8 + }, + { + "name": "block/froglight/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.froglight.step": { + "sounds": [ + "block/froglight/step1", + "block/froglight/step2", + "block/froglight/step3", + "block/froglight/step4", + "block/froglight/step5", + "block/froglight/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.frogspawn.break": { + "sounds": [ + { + "name": "block/frogspawn/break1", + "pitch": 1.2, + "volume": 0.1 + }, + { + "name": "block/frogspawn/break2", + "pitch": 1.2, + "volume": 0.1 + }, + { + "name": "block/frogspawn/break3", + "pitch": 1.2, + "volume": 0.1 + }, + { + "name": "block/frogspawn/break4", + "pitch": 1.2, + "volume": 0.1 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.frogspawn.fall": { + "sounds": [ + { + "name": "block/frogspawn/step1", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step2", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step3", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step4", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step5", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step6", + "pitch": 1.3, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.frogspawn.hatch": { + "sounds": [ + { + "name": "block/frogspawn/hatch1", + "pitch": 1.2, + "volume": 0.6 + }, + { + "name": "block/frogspawn/hatch2", + "pitch": 1.2, + "volume": 0.6 + }, + { + "name": "block/frogspawn/hatch3", + "pitch": 1.2, + "volume": 0.6 + }, + { + "name": "block/frogspawn/hatch4", + "pitch": 1.2, + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.frogspawn.hatch" + }, + "block.frogspawn.hit": { + "sounds": [ + { + "name": "block/frogspawn/step1", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step2", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step3", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step4", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step5", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step6", + "pitch": 1.3, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.frogspawn.place": { + "sounds": [ + { + "name": "block/frogspawn/break1", + "pitch": 1.5, + "volume": 0.2 + }, + { + "name": "block/frogspawn/break2", + "pitch": 1.5, + "volume": 0.2 + }, + { + "name": "block/frogspawn/break3", + "pitch": 1.5, + "volume": 0.2 + }, + { + "name": "block/frogspawn/break4", + "pitch": 1.5, + "volume": 0.2 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.frogspawn.step": { + "sounds": [ + { + "name": "block/frogspawn/step1", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step2", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step3", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step4", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step5", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.fungus.break": { + "sounds": [ + "block/fungus/break1", + "block/fungus/break2", + "block/fungus/break3", + "block/fungus/break4", + "block/fungus/break5", + "block/fungus/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.fungus.fall": { + "sounds": [] + }, + "block.fungus.hit": { + "sounds": [], + "subtitle": "subtitles.block.generic.hit" + }, + "block.fungus.place": { + "sounds": [ + "block/fungus/break1", + "block/fungus/break2", + "block/fungus/break3", + "block/fungus/break4", + "block/fungus/break5", + "block/fungus/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.fungus.step": { + "sounds": [ + { + "name": "item/plant/netherwart1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart1", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 1.12, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.furnace.fire_crackle": { + "sounds": [ + "block/furnace/fire_crackle1", + "block/furnace/fire_crackle2", + "block/furnace/fire_crackle3", + "block/furnace/fire_crackle4", + "block/furnace/fire_crackle5" + ], + "subtitle": "subtitles.block.furnace.fire_crackle" + }, + "block.gilded_blackstone.break": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.gilded_blackstone.fall": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.gilded_blackstone.hit": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.gilded_blackstone.place": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.gilded_blackstone.step": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.glass.break": { + "sounds": [ + "random/glass1", + "random/glass2", + "random/glass3" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.glass.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.glass.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.glass.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.glass.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.grass.break": { + "sounds": [ + "dig/grass1", + "dig/grass2", + "dig/grass3", + "dig/grass4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.grass.fall": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.grass.hit": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.grass.place": { + "sounds": [ + "dig/grass1", + "dig/grass2", + "dig/grass3", + "dig/grass4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.grass.step": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.gravel.break": { + "sounds": [ + "dig/gravel1", + "dig/gravel2", + "dig/gravel3", + "dig/gravel4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.gravel.fall": { + "sounds": [ + "step/gravel1", + "step/gravel2", + "step/gravel3", + "step/gravel4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.gravel.hit": { + "sounds": [ + "step/gravel1", + "step/gravel2", + "step/gravel3", + "step/gravel4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.gravel.place": { + "sounds": [ + "dig/gravel1", + "dig/gravel2", + "dig/gravel3", + "dig/gravel4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.gravel.step": { + "sounds": [ + "step/gravel1", + "step/gravel2", + "step/gravel3", + "step/gravel4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.grindstone.use": { + "sounds": [ + { + "name": "block/grindstone/grindstone1", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone2", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone3", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.grindstone.use" + }, + "block.growing_plant.crop": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.block.growing_plant.crop" + }, + "block.hanging_roots.break": { + "sounds": [ + "block/hanging_roots/break1", + "block/hanging_roots/break2", + "block/hanging_roots/break3", + "block/hanging_roots/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.hanging_roots.fall": { + "sounds": [ + "block/hanging_roots/step1", + "block/hanging_roots/step2", + "block/hanging_roots/step3", + "block/hanging_roots/step4", + "block/hanging_roots/step5", + "block/hanging_roots/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.hanging_roots.hit": { + "sounds": [ + "block/hanging_roots/step1", + "block/hanging_roots/step2", + "block/hanging_roots/step3", + "block/hanging_roots/step4", + "block/hanging_roots/step5", + "block/hanging_roots/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.hanging_roots.place": { + "sounds": [ + "block/hanging_roots/break1", + "block/hanging_roots/break2", + "block/hanging_roots/break3", + "block/hanging_roots/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.hanging_roots.step": { + "sounds": [ + "block/hanging_roots/step1", + "block/hanging_roots/step2", + "block/hanging_roots/step3", + "block/hanging_roots/step4", + "block/hanging_roots/step5", + "block/hanging_roots/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.hanging_sign.break": { + "sounds": [ + "block/hanging_sign/break1", + "block/hanging_sign/break2", + "block/hanging_sign/break3", + "block/hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.hanging_sign.fall": { + "sounds": [ + "block/hanging_sign/step1", + "block/hanging_sign/step2", + "block/hanging_sign/step3", + "block/hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.hanging_sign.hit": { + "sounds": [ + "block/hanging_sign/step1", + "block/hanging_sign/step2", + "block/hanging_sign/step3", + "block/hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.hanging_sign.place": { + "sounds": [ + "block/hanging_sign/break1", + "block/hanging_sign/break2", + "block/hanging_sign/break3", + "block/hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.hanging_sign.step": { + "sounds": [ + "block/hanging_sign/step1", + "block/hanging_sign/step2", + "block/hanging_sign/step3", + "block/hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.hanging_sign.waxed_interact_fail": { + "sounds": [ + { + "name": "block.sign.waxed_interact_fail", + "type": "event" + } + ], + "subtitle": "subtitles.block.hanging_sign.waxed_interact_fail" + }, + "block.heavy_core.break": { + "sounds": [ + "block/heavy_core/break1", + "block/heavy_core/break2", + "block/heavy_core/break3", + "block/heavy_core/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.heavy_core.fall": { + "sounds": [ + "block/heavy_core/step1", + "block/heavy_core/step2", + "block/heavy_core/step3", + "block/heavy_core/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.heavy_core.hit": { + "sounds": [ + "block/heavy_core/step1", + "block/heavy_core/step2", + "block/heavy_core/step3", + "block/heavy_core/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.heavy_core.place": { + "sounds": [ + "block/heavy_core/break1", + "block/heavy_core/break2", + "block/heavy_core/break3", + "block/heavy_core/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.heavy_core.step": { + "sounds": [ + "block/heavy_core/step1", + "block/heavy_core/step2", + "block/heavy_core/step3", + "block/heavy_core/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.honey_block.break": { + "sounds": [ + "block/honeyblock/break1", + "block/honeyblock/break2", + "block/honeyblock/break3", + "block/honeyblock/break4", + "block/honeyblock/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.honey_block.fall": { + "sounds": [ + "block/honeyblock/step1", + "block/honeyblock/step2", + "block/honeyblock/step3", + "block/honeyblock/step4", + "block/honeyblock/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.honey_block.hit": { + "sounds": [ + "block/honeyblock/step1", + "block/honeyblock/step2", + "block/honeyblock/step3", + "block/honeyblock/step4", + "block/honeyblock/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.honey_block.place": { + "sounds": [ + "block/honeyblock/break1", + "block/honeyblock/break2", + "block/honeyblock/break3", + "block/honeyblock/break4", + "block/honeyblock/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.honey_block.slide": { + "sounds": [ + { + "name": "block/honeyblock/slide1", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide1", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide2", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide3", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide4", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide4", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.honey_block.slide" + }, + "block.honey_block.step": { + "sounds": [ + "block/honeyblock/step1", + "block/honeyblock/step2", + "block/honeyblock/step3", + "block/honeyblock/step4", + "block/honeyblock/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.iron_door.close": { + "sounds": [ + { + "name": "block/iron_door/close1", + "volume": 0.9 + }, + { + "name": "block/iron_door/close2", + "volume": 0.9 + }, + { + "name": "block/iron_door/close3", + "volume": 0.9 + }, + { + "name": "block/iron_door/close4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.iron_door.open": { + "sounds": [ + { + "name": "block/iron_door/open1", + "volume": 0.9 + }, + { + "name": "block/iron_door/open2", + "volume": 0.9 + }, + { + "name": "block/iron_door/open3", + "volume": 0.9 + }, + { + "name": "block/iron_door/open4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.iron_trapdoor.close": { + "sounds": [ + { + "name": "block/iron_trapdoor/close1", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/close2", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/close3", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/close4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.iron_trapdoor.close" + }, + "block.iron_trapdoor.open": { + "sounds": [ + { + "name": "block/iron_trapdoor/open1", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/open2", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/open3", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/open4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.iron_trapdoor.open" + }, + "block.ladder.break": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.ladder.fall": { + "sounds": [ + "step/ladder1", + "step/ladder2", + "step/ladder3", + "step/ladder4", + "step/ladder5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.ladder.hit": { + "sounds": [ + "step/ladder1", + "step/ladder2", + "step/ladder3", + "step/ladder4", + "step/ladder5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.ladder.place": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.ladder.step": { + "sounds": [ + "step/ladder1", + "step/ladder2", + "step/ladder3", + "step/ladder4", + "step/ladder5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.lantern.break": { + "sounds": [ + "block/lantern/break1", + "block/lantern/break2", + "block/lantern/break3", + "block/lantern/break4", + "block/lantern/break5", + "block/lantern/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.lantern.fall": { + "sounds": [ + "block/lantern/break1", + "block/lantern/break2", + "block/lantern/break3", + "block/lantern/break4", + "block/lantern/break5", + "block/lantern/break6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.lantern.hit": { + "sounds": [ + "block/lantern/place1", + "block/lantern/place2", + "block/lantern/place3", + "block/lantern/place4", + "block/lantern/place5", + "block/lantern/place6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.lantern.place": { + "sounds": [ + { + "name": "block/lantern/place1", + "pitch": 1.1 + }, + { + "name": "block/lantern/place2", + "pitch": 1.1 + }, + { + "name": "block/lantern/place3", + "pitch": 1.1 + }, + { + "name": "block/lantern/place4", + "pitch": 1.1 + }, + { + "name": "block/lantern/place5", + "pitch": 1.1 + }, + { + "name": "block/lantern/place6", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lantern.step": { + "sounds": [ + "block/lantern/break1", + "block/lantern/break2", + "block/lantern/break3", + "block/lantern/break4", + "block/lantern/break5", + "block/lantern/break6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.large_amethyst_bud.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "pitch": 0.85, + "volume": 0.7 + }, + { + "name": "block/amethyst_cluster/break2", + "pitch": 0.85, + "volume": 0.7 + }, + { + "name": "block/amethyst_cluster/break3", + "pitch": 0.85, + "volume": 0.7 + }, + { + "name": "block/amethyst_cluster/break4", + "pitch": 0.85, + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.large_amethyst_bud.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "volume": 0.75 + }, + { + "name": "block/amethyst_cluster/place2", + "volume": 0.75 + }, + { + "name": "block/amethyst_cluster/place3", + "volume": 0.75 + }, + { + "name": "block/amethyst_cluster/place4", + "volume": 0.75 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lava.ambient": { + "sounds": [ + "liquid/lava" + ], + "subtitle": "subtitles.block.lava.ambient" + }, + "block.lava.extinguish": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.lava.extinguish" + }, + "block.lava.pop": { + "sounds": [ + "liquid/lavapop" + ], + "subtitle": "subtitles.block.lava.ambient" + }, + "block.lever.click": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.lever.click" + }, + "block.lily_pad.place": { + "sounds": [ + "block/waterlily/place1", + "block/waterlily/place2", + "block/waterlily/place3", + "block/waterlily/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lodestone.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.lodestone.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.lodestone.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.lodestone.place": { + "sounds": [ + "block/lodestone/place1", + "block/lodestone/place2", + "block/lodestone/place3", + "block/lodestone/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lodestone.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ] + }, + "block.mangrove_roots.break": { + "sounds": [ + { + "name": "block/mangrove_roots/break1", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break2", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break3", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break4", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break5", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break6", + "pitch": 1.2, + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.mangrove_roots.fall": { + "sounds": [ + { + "name": "block/mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.mangrove_roots.hit": { + "sounds": [ + { + "name": "block/mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.mangrove_roots.place": { + "sounds": [ + { + "name": "block/mangrove_roots/break1", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break2", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break3", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break4", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break5", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break6", + "pitch": 1.2, + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.mangrove_roots.step": { + "sounds": [ + { + "name": "block/mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.medium_amethyst_bud.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "pitch": 0.95, + "volume": 0.55 + }, + { + "name": "block/amethyst_cluster/break2", + "pitch": 0.95, + "volume": 0.55 + }, + { + "name": "block/amethyst_cluster/break3", + "pitch": 0.95, + "volume": 0.55 + }, + { + "name": "block/amethyst_cluster/break4", + "pitch": 0.95, + "volume": 0.55 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.medium_amethyst_bud.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "pitch": 1.1, + "volume": 0.5 + }, + { + "name": "block/amethyst_cluster/place2", + "pitch": 1.1, + "volume": 0.5 + }, + { + "name": "block/amethyst_cluster/place3", + "pitch": 1.1, + "volume": 0.5 + }, + { + "name": "block/amethyst_cluster/place4", + "pitch": 1.1, + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.metal.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.metal.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.metal.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.metal.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.metal.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.metal_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.65, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.metal_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.75, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.moss.break": { + "sounds": [ + { + "name": "block/moss/break1", + "volume": 0.95 + }, + { + "name": "block/moss/break2", + "volume": 0.93 + }, + { + "name": "block/moss/break3", + "volume": 0.93 + }, + { + "name": "block/moss/break4", + "volume": 0.93 + }, + { + "name": "block/moss/break5", + "volume": 0.93 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.moss.fall": { + "sounds": [ + "block/moss/step1", + "block/moss/step2", + "block/moss/step3", + "block/moss/step4", + "block/moss/step5", + "block/moss/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.moss.hit": { + "sounds": [ + "block/moss/step1", + "block/moss/step2", + "block/moss/step3", + "block/moss/step4", + "block/moss/step5", + "block/moss/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.moss.place": { + "sounds": [ + { + "name": "block/moss/break1", + "volume": 0.93 + }, + { + "name": "block/moss/break2", + "volume": 0.93 + }, + { + "name": "block/moss/break3", + "volume": 0.93 + }, + { + "name": "block/moss/break4", + "volume": 0.93 + }, + { + "name": "block/moss/break5", + "volume": 0.93 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.moss.step": { + "sounds": [ + "block/moss/step1", + "block/moss/step2", + "block/moss/step3", + "block/moss/step4", + "block/moss/step5", + "block/moss/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.moss_carpet.break": { + "sounds": [ + { + "name": "block/moss/break1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break5", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.moss_carpet.fall": { + "sounds": [ + { + "name": "block/moss/step1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step5", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step6", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.moss_carpet.hit": { + "sounds": [ + { + "name": "block/moss/step1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step5", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step6", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.moss_carpet.place": { + "sounds": [ + { + "name": "block/moss/break1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break5", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.moss_carpet.step": { + "sounds": [ + { + "name": "block/moss/step1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step5", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step6", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.mud.break": { + "sounds": [ + { + "name": "block/mud/break1", + "volume": 0.5 + }, + { + "name": "block/mud/break2", + "volume": 0.5 + }, + { + "name": "block/mud/break3", + "volume": 0.5 + }, + { + "name": "block/mud/break4", + "volume": 0.5 + }, + { + "name": "block/mud/break5", + "volume": 0.5 + }, + { + "name": "block/mud/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.mud.fall": { + "sounds": [ + { + "name": "block/mud/step1", + "volume": 0.5 + }, + { + "name": "block/mud/step2", + "volume": 0.5 + }, + { + "name": "block/mud/step3", + "volume": 0.5 + }, + { + "name": "block/mud/step4", + "volume": 0.5 + }, + { + "name": "block/mud/step5", + "volume": 0.5 + }, + { + "name": "block/mud/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.mud.hit": { + "sounds": [ + { + "name": "block/mud/step1", + "volume": 0.5 + }, + { + "name": "block/mud/step2", + "volume": 0.5 + }, + { + "name": "block/mud/step3", + "volume": 0.5 + }, + { + "name": "block/mud/step4", + "volume": 0.5 + }, + { + "name": "block/mud/step5", + "volume": 0.5 + }, + { + "name": "block/mud/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.mud.place": { + "sounds": [ + { + "name": "block/mud/break1", + "volume": 0.5 + }, + { + "name": "block/mud/break2", + "volume": 0.5 + }, + { + "name": "block/mud/break3", + "volume": 0.5 + }, + { + "name": "block/mud/break4", + "volume": 0.5 + }, + { + "name": "block/mud/break5", + "volume": 0.5 + }, + { + "name": "block/mud/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.mud.step": { + "sounds": [ + { + "name": "block/mud/step1", + "volume": 0.5 + }, + { + "name": "block/mud/step2", + "volume": 0.5 + }, + { + "name": "block/mud/step3", + "volume": 0.5 + }, + { + "name": "block/mud/step4", + "volume": 0.5 + }, + { + "name": "block/mud/step5", + "volume": 0.5 + }, + { + "name": "block/mud/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.mud_bricks.break": { + "sounds": [ + { + "name": "block/mud_bricks/break1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.mud_bricks.fall": { + "sounds": [ + { + "name": "block/mud_bricks/step1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.mud_bricks.hit": { + "sounds": [ + { + "name": "block/mud_bricks/step1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.mud_bricks.place": { + "sounds": [ + { + "name": "block/mud_bricks/break1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.mud_bricks.step": { + "sounds": [ + { + "name": "block/mud_bricks/step1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.muddy_mangrove_roots.break": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/break1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.muddy_mangrove_roots.fall": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.muddy_mangrove_roots.hit": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.muddy_mangrove_roots.place": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/break1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.muddy_mangrove_roots.step": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_bricks.break": { + "sounds": [ + { + "name": "block/nether_bricks/break1", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break2", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break3", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break4", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break5", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_bricks.fall": { + "sounds": [ + "block/nether_bricks/step1", + "block/nether_bricks/step2", + "block/nether_bricks/step3", + "block/nether_bricks/step4", + "block/nether_bricks/step5", + "block/nether_bricks/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_bricks.hit": { + "sounds": [ + "block/nether_bricks/step1", + "block/nether_bricks/step2", + "block/nether_bricks/step3", + "block/nether_bricks/step4", + "block/nether_bricks/step5", + "block/nether_bricks/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_bricks.place": { + "sounds": [ + { + "name": "block/nether_bricks/break1", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break2", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break3", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break4", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break5", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_bricks.step": { + "sounds": [ + "block/nether_bricks/step1", + "block/nether_bricks/step2", + "block/nether_bricks/step3", + "block/nether_bricks/step4", + "block/nether_bricks/step5", + "block/nether_bricks/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_gold_ore.break": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_gold_ore.fall": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_gold_ore.hit": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_gold_ore.place": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_gold_ore.step": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_ore.break": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_ore.fall": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_ore.hit": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_ore.place": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_ore.step": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_sprouts.break": { + "sounds": [ + { + "name": "block/nether_sprouts/break1", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break2", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break3", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_sprouts.fall": { + "sounds": [ + "block/nether_sprouts/step1", + "block/nether_sprouts/step2", + "block/nether_sprouts/step3", + "block/nether_sprouts/step4", + "block/nether_sprouts/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_sprouts.hit": { + "sounds": [ + "block/nether_sprouts/step1", + "block/nether_sprouts/step2", + "block/nether_sprouts/step3", + "block/nether_sprouts/step4", + "block/nether_sprouts/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_sprouts.place": { + "sounds": [ + { + "name": "block/nether_sprouts/break1", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break2", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break3", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_sprouts.step": { + "sounds": [ + { + "name": "block/nether_sprouts/step1", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step2", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step3", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step4", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step5", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_wart.break": { + "sounds": [ + { + "name": "item/plant/netherwart1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 0.9, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_wood.break": { + "sounds": [ + "block/nether_wood/break1", + "block/nether_wood/break2", + "block/nether_wood/break3", + "block/nether_wood/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_wood.fall": { + "sounds": [ + "block/nether_wood/step1", + "block/nether_wood/step2", + "block/nether_wood/step3", + "block/nether_wood/step4", + "block/nether_wood/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_wood.hit": { + "sounds": [ + "block/nether_wood/step1", + "block/nether_wood/step2", + "block/nether_wood/step3", + "block/nether_wood/step4", + "block/nether_wood/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_wood.place": { + "sounds": [ + "block/nether_wood/break1", + "block/nether_wood/break2", + "block/nether_wood/break3", + "block/nether_wood/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_wood.step": { + "sounds": [ + "block/nether_wood/step1", + "block/nether_wood/step2", + "block/nether_wood/step3", + "block/nether_wood/step4", + "block/nether_wood/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_wood_button.click_off": { + "sounds": [ + { + "name": "block/nether_wood_button/nether_wood_button", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.nether_wood_button.click_on": { + "sounds": [ + { + "name": "block/nether_wood_button/nether_wood_button", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.nether_wood_door.close": { + "sounds": [ + "block/nether_wood_door/toggle1", + "block/nether_wood_door/toggle2", + "block/nether_wood_door/toggle3", + "block/nether_wood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.nether_wood_door.open": { + "sounds": [ + "block/nether_wood_door/toggle1", + "block/nether_wood_door/toggle2", + "block/nether_wood_door/toggle3", + "block/nether_wood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.nether_wood_fence_gate.close": { + "sounds": [ + "block/nether_wood_fence/toggle1", + "block/nether_wood_fence/toggle2", + "block/nether_wood_fence/toggle3", + "block/nether_wood_fence/toggle4" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.nether_wood_fence_gate.open": { + "sounds": [ + "block/nether_wood_fence/toggle1", + "block/nether_wood_fence/toggle2", + "block/nether_wood_fence/toggle3", + "block/nether_wood_fence/toggle4" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.nether_wood_hanging_sign.break": { + "sounds": [ + "block/nether_wood_hanging_sign/break1", + "block/nether_wood_hanging_sign/break2", + "block/nether_wood_hanging_sign/break3", + "block/nether_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_wood_hanging_sign.fall": { + "sounds": [ + "block/nether_wood_hanging_sign/step1", + "block/nether_wood_hanging_sign/step2", + "block/nether_wood_hanging_sign/step3", + "block/nether_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_wood_hanging_sign.hit": { + "sounds": [ + { + "name": "block/nether_wood_hanging_sign/step1", + "volume": 0.8 + }, + { + "name": "block/nether_wood_hanging_sign/step2", + "volume": 0.8 + }, + { + "name": "block/nether_wood_hanging_sign/step3", + "volume": 0.8 + }, + { + "name": "block/nether_wood_hanging_sign/step4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_wood_hanging_sign.place": { + "sounds": [ + "block/nether_wood_hanging_sign/break1", + "block/nether_wood_hanging_sign/break2", + "block/nether_wood_hanging_sign/break3", + "block/nether_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_wood_hanging_sign.step": { + "sounds": [ + "block/nether_wood_hanging_sign/step1", + "block/nether_wood_hanging_sign/step2", + "block/nether_wood_hanging_sign/step3", + "block/nether_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_wood_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.nether_wood_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.nether_wood_trapdoor.close": { + "sounds": [ + "block/nether_wood_trapdoor/toggle1", + "block/nether_wood_trapdoor/toggle2", + "block/nether_wood_trapdoor/toggle3", + "block/nether_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.nether_wood_trapdoor.open": { + "sounds": [ + "block/nether_wood_trapdoor/toggle1", + "block/nether_wood_trapdoor/toggle2", + "block/nether_wood_trapdoor/toggle3", + "block/nether_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.netherite_block.break": { + "sounds": [ + { + "name": "block/netherite/break1", + "volume": 0.95 + }, + { + "name": "block/netherite/break1", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "pitch": 0.9, + "volume": 0.95 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.netherite_block.fall": { + "sounds": [ + "block/netherite/step1", + "block/netherite/step2", + "block/netherite/step3", + "block/netherite/step4", + "block/netherite/step5", + "block/netherite/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.netherite_block.hit": { + "sounds": [ + "block/netherite/step1", + "block/netherite/step2", + "block/netherite/step3", + "block/netherite/step4", + "block/netherite/step5", + "block/netherite/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.netherite_block.place": { + "sounds": [ + { + "name": "block/netherite/break1", + "volume": 0.95 + }, + { + "name": "block/netherite/break1", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "pitch": 0.9, + "volume": 0.95 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.netherite_block.step": { + "sounds": [ + "block/netherite/step1", + "block/netherite/step2", + "block/netherite/step3", + "block/netherite/step4", + "block/netherite/step5", + "block/netherite/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.netherrack.break": { + "sounds": [ + "block/netherrack/break1", + "block/netherrack/break2", + "block/netherrack/break3", + "block/netherrack/break4", + "block/netherrack/break5", + "block/netherrack/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.netherrack.fall": { + "sounds": [ + "block/netherrack/step1", + "block/netherrack/step2", + "block/netherrack/step3", + "block/netherrack/step4", + "block/netherrack/step5", + "block/netherrack/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.netherrack.hit": { + "sounds": [ + { + "name": "block/netherrack/step1", + "volume": 0.55 + }, + { + "name": "block/netherrack/step2", + "volume": 0.55 + }, + { + "name": "block/netherrack/step3", + "volume": 0.55 + }, + { + "name": "block/netherrack/step4", + "volume": 0.55 + }, + { + "name": "block/netherrack/step5", + "volume": 0.55 + }, + { + "name": "block/netherrack/step6", + "volume": 0.55 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.netherrack.place": { + "sounds": [ + "block/netherrack/break1", + "block/netherrack/break2", + "block/netherrack/break3", + "block/netherrack/break4", + "block/netherrack/break5", + "block/netherrack/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.netherrack.step": { + "sounds": [ + "block/netherrack/step1", + "block/netherrack/step2", + "block/netherrack/step3", + "block/netherrack/step4", + "block/netherrack/step5", + "block/netherrack/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.note_block.banjo": { + "sounds": [ + "note/banjo" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.basedrum": { + "sounds": [ + "note/bd" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.bass": { + "sounds": [ + "note/bassattack" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.bell": { + "sounds": [ + "note/bell" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.bit": { + "sounds": [ + "note/bit" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.chime": { + "sounds": [ + "note/icechime" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.cow_bell": { + "sounds": [ + "note/cow_bell" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.didgeridoo": { + "sounds": [ + "note/didgeridoo" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.flute": { + "sounds": [ + "note/flute" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.guitar": { + "sounds": [ + "note/guitar" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.harp": { + "sounds": [ + "note/harp2" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.hat": { + "sounds": [ + "note/hat" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.imitate.creeper": { + "sounds": [ + { + "name": "entity.creeper.primed", + "pitch": 0.5, + "type": "event" + } + ], + "subtitle": "subtitles.entity.creeper.primed" + }, + "block.note_block.imitate.ender_dragon": { + "sounds": [ + { + "name": "entity.ender_dragon.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.ender_dragon.ambient" + }, + "block.note_block.imitate.piglin": { + "sounds": [ + { + "name": "entity.piglin.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.piglin.ambient" + }, + "block.note_block.imitate.skeleton": { + "sounds": [ + { + "name": "entity.skeleton.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.skeleton.ambient" + }, + "block.note_block.imitate.wither_skeleton": { + "sounds": [ + { + "name": "entity.wither_skeleton.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.wither_skeleton.ambient" + }, + "block.note_block.imitate.zombie": { + "sounds": [ + { + "name": "entity.zombie.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.zombie.ambient" + }, + "block.note_block.iron_xylophone": { + "sounds": [ + "note/iron_xylophone" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.pling": { + "sounds": [ + "note/pling" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.snare": { + "sounds": [ + "note/snare" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.xylophone": { + "sounds": [ + "note/xylobone" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.nylium.break": { + "sounds": [ + { + "name": "block/nylium/break1", + "volume": 0.85 + }, + { + "name": "block/nylium/break2", + "volume": 0.85 + }, + { + "name": "block/nylium/break3", + "volume": 0.85 + }, + { + "name": "block/nylium/break4", + "volume": 0.85 + }, + { + "name": "block/nylium/break5", + "volume": 0.85 + }, + { + "name": "block/nylium/break6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nylium.fall": { + "sounds": [ + "block/nylium/step1", + "block/nylium/step2", + "block/nylium/step3", + "block/nylium/step4", + "block/nylium/step5", + "block/nylium/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nylium.hit": { + "sounds": [ + "block/nylium/step1", + "block/nylium/step2", + "block/nylium/step3", + "block/nylium/step4", + "block/nylium/step5", + "block/nylium/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nylium.place": { + "sounds": [ + { + "name": "block/nylium/break1", + "volume": 0.85 + }, + { + "name": "block/nylium/break2", + "volume": 0.85 + }, + { + "name": "block/nylium/break3", + "volume": 0.85 + }, + { + "name": "block/nylium/break4", + "volume": 0.85 + }, + { + "name": "block/nylium/break5", + "volume": 0.85 + }, + { + "name": "block/nylium/break6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nylium.step": { + "sounds": [ + "block/nylium/step1", + "block/nylium/step2", + "block/nylium/step3", + "block/nylium/step4", + "block/nylium/step5", + "block/nylium/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.packed_mud.break": { + "sounds": [ + { + "name": "block/packed_mud/break1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.packed_mud.fall": { + "sounds": [ + { + "name": "block/packed_mud/step1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.packed_mud.hit": { + "sounds": [ + { + "name": "block/packed_mud/step1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.packed_mud.place": { + "sounds": [ + { + "name": "block/packed_mud/break1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.packed_mud.step": { + "sounds": [ + { + "name": "block/packed_mud/step1", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step2", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step3", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step4", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step5", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step6", + "pitch": 0.95, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.pale_hanging_moss.idle": { + "sounds": [ + "block/pale_hanging_moss/pale_hanging_moss1", + "block/pale_hanging_moss/pale_hanging_moss2", + "block/pale_hanging_moss/pale_hanging_moss3", + "block/pale_hanging_moss/pale_hanging_moss4", + "block/pale_hanging_moss/pale_hanging_moss5", + "block/pale_hanging_moss/pale_hanging_moss6", + "block/pale_hanging_moss/pale_hanging_moss7", + "block/pale_hanging_moss/pale_hanging_moss8", + "block/pale_hanging_moss/pale_hanging_moss9", + "block/pale_hanging_moss/pale_hanging_moss10", + "block/pale_hanging_moss/pale_hanging_moss11", + "block/pale_hanging_moss/pale_hanging_moss12", + "block/pale_hanging_moss/pale_hanging_moss13", + "block/pale_hanging_moss/pale_hanging_moss14", + "block/pale_hanging_moss/pale_hanging_moss15" + ], + "subtitle": "subtitles.ambient.sound" + }, + "block.pink_petals.break": { + "sounds": [ + { + "name": "block/cherry_leaves/break1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.pink_petals.fall": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.pink_petals.hit": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.pink_petals.place": { + "sounds": [ + { + "name": "block/cherry_leaves/break1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.pink_petals.step": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.piston.contract": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "tile/piston/in" + } + ], + "subtitle": "subtitles.block.piston.move" + }, + "block.piston.extend": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "tile/piston/out" + } + ], + "subtitle": "subtitles.block.piston.move" + }, + "block.pointed_dripstone.break": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.pointed_dripstone.drip_lava": { + "sounds": [ + "block/pointed_dripstone/drip_lava1", + "block/pointed_dripstone/drip_lava2", + "block/pointed_dripstone/drip_lava3", + "block/pointed_dripstone/drip_lava4", + "block/pointed_dripstone/drip_lava5", + "block/pointed_dripstone/drip_lava6" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_lava" + }, + "block.pointed_dripstone.drip_lava_into_cauldron": { + "sounds": [ + "block/pointed_dripstone/drip_lava_cauldron1", + "block/pointed_dripstone/drip_lava_cauldron2", + "block/pointed_dripstone/drip_lava_cauldron3", + "block/pointed_dripstone/drip_lava_cauldron4" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_lava_into_cauldron" + }, + "block.pointed_dripstone.drip_water": { + "sounds": [ + "block/pointed_dripstone/drip_water1", + "block/pointed_dripstone/drip_water2", + "block/pointed_dripstone/drip_water3", + "block/pointed_dripstone/drip_water4", + "block/pointed_dripstone/drip_water5", + "block/pointed_dripstone/drip_water6", + "block/pointed_dripstone/drip_water7", + "block/pointed_dripstone/drip_water8", + "block/pointed_dripstone/drip_water9", + "block/pointed_dripstone/drip_water10", + "block/pointed_dripstone/drip_water11", + "block/pointed_dripstone/drip_water12", + "block/pointed_dripstone/drip_water13", + "block/pointed_dripstone/drip_water14", + "block/pointed_dripstone/drip_water15" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_water" + }, + "block.pointed_dripstone.drip_water_into_cauldron": { + "sounds": [ + "block/pointed_dripstone/drip_water_cauldron1", + "block/pointed_dripstone/drip_water_cauldron2", + "block/pointed_dripstone/drip_water_cauldron3", + "block/pointed_dripstone/drip_water_cauldron4", + "block/pointed_dripstone/drip_water_cauldron5", + "block/pointed_dripstone/drip_water_cauldron6", + "block/pointed_dripstone/drip_water_cauldron7", + "block/pointed_dripstone/drip_water_cauldron8" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_water_into_cauldron" + }, + "block.pointed_dripstone.fall": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.pointed_dripstone.hit": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.pointed_dripstone.land": { + "sounds": [ + "block/pointed_dripstone/land1", + "block/pointed_dripstone/land2", + "block/pointed_dripstone/land3", + "block/pointed_dripstone/land4", + "block/pointed_dripstone/land5" + ] + }, + "block.pointed_dripstone.place": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.pointed_dripstone.step": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.polished_deepslate.break": { + "sounds": [ + "block/deepslate/break1", + "block/deepslate/break2", + "block/deepslate/break3", + "block/deepslate/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.polished_deepslate.fall": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.polished_deepslate.hit": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.polished_deepslate.place": { + "sounds": [ + "block/deepslate/place1", + "block/deepslate/place2", + "block/deepslate/place3", + "block/deepslate/place4", + "block/deepslate/place5", + "block/deepslate/place6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.polished_deepslate.step": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.polished_tuff.break": { + "sounds": [ + { + "name": "block/tuff/break1", + "pitch": 1.2 + }, + { + "name": "block/tuff/break2", + "pitch": 1.2 + }, + { + "name": "block/tuff/break3", + "pitch": 1.2 + }, + { + "name": "block/tuff/break4", + "pitch": 1.2 + }, + { + "name": "block/tuff/break5", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.polished_tuff.fall": { + "sounds": [ + { + "name": "block/tuff/step1", + "pitch": 1.2 + }, + { + "name": "block/tuff/step2", + "pitch": 1.2 + }, + { + "name": "block/tuff/step3", + "pitch": 1.2 + }, + { + "name": "block/tuff/step4", + "pitch": 1.2 + }, + { + "name": "block/tuff/step5", + "pitch": 1.2 + }, + { + "name": "block/tuff/step6", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.polished_tuff.hit": { + "sounds": [ + { + "name": "block/tuff/step1", + "pitch": 1.2 + }, + { + "name": "block/tuff/step2", + "pitch": 1.2 + }, + { + "name": "block/tuff/step3", + "pitch": 1.2 + }, + { + "name": "block/tuff/step4", + "pitch": 1.2 + }, + { + "name": "block/tuff/step5", + "pitch": 1.2 + }, + { + "name": "block/tuff/step6", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.polished_tuff.place": { + "sounds": [ + { + "name": "block/tuff/break1", + "pitch": 1.2 + }, + { + "name": "block/tuff/break2", + "pitch": 1.2 + }, + { + "name": "block/tuff/break3", + "pitch": 1.2 + }, + { + "name": "block/tuff/break4", + "pitch": 1.2 + }, + { + "name": "block/tuff/break5", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.polished_tuff.step": { + "sounds": [ + { + "name": "block/tuff/step1", + "pitch": 1.2 + }, + { + "name": "block/tuff/step2", + "pitch": 1.2 + }, + { + "name": "block/tuff/step3", + "pitch": 1.2 + }, + { + "name": "block/tuff/step4", + "pitch": 1.2 + }, + { + "name": "block/tuff/step5", + "pitch": 1.2 + }, + { + "name": "block/tuff/step6", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.portal.ambient": { + "sounds": [ + { + "attenuation_distance": 10, + "name": "portal/portal" + } + ], + "subtitle": "subtitles.block.portal.ambient" + }, + "block.portal.travel": { + "sounds": [ + "portal/travel" + ], + "subtitle": "subtitles.block.portal.travel" + }, + "block.portal.trigger": { + "sounds": [ + "portal/trigger" + ], + "subtitle": "subtitles.block.portal.trigger" + }, + "block.powder_snow.break": { + "sounds": [ + "block/powder_snow/break1", + "block/powder_snow/break2", + "block/powder_snow/break3", + "block/powder_snow/break4", + "block/powder_snow/break5", + "block/powder_snow/break6", + "block/powder_snow/break7" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.powder_snow.fall": { + "sounds": [ + "block/powder_snow/step1", + "block/powder_snow/step2", + "block/powder_snow/step3", + "block/powder_snow/step4", + "block/powder_snow/step5", + "block/powder_snow/step6", + "block/powder_snow/step7", + "block/powder_snow/step8", + "block/powder_snow/step9", + "block/powder_snow/step10" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.powder_snow.hit": { + "sounds": [ + { + "name": "block/powder_snow/step1", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step2", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step3", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step4", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step5", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step6", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step7", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step8", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step9", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step10", + "pitch": 1.3, + "volume": 0.83 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.powder_snow.place": { + "sounds": [ + "block/powder_snow/break1", + "block/powder_snow/break2", + "block/powder_snow/break3", + "block/powder_snow/break4", + "block/powder_snow/break5", + "block/powder_snow/break6", + "block/powder_snow/break7" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.powder_snow.step": { + "sounds": [ + "block/powder_snow/step1", + "block/powder_snow/step2", + "block/powder_snow/step3", + "block/powder_snow/step4", + "block/powder_snow/step5", + "block/powder_snow/step6", + "block/powder_snow/step7", + "block/powder_snow/step8", + "block/powder_snow/step9", + "block/powder_snow/step10" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.pumpkin.carve": { + "sounds": [ + "block/pumpkin/carve1", + "block/pumpkin/carve2" + ], + "subtitle": "subtitles.block.pumpkin.carve" + }, + "block.redstone_torch.burnout": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.redstone_torch.burnout" + }, + "block.resin.break": { + "sounds": [ + "block/resin/resin_break1", + "block/resin/resin_break2", + "block/resin/resin_break3", + "block/resin/resin_break4", + "block/resin/resin_break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.resin.fall": { + "sounds": [ + "block/resin/resin_fall" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.resin.place": { + "sounds": [ + "block/resin/resin_place1", + "block/resin/resin_place2", + "block/resin/resin_place3", + "block/resin/resin_place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.resin.step": { + "sounds": [ + "block/resin/resin_step1", + "block/resin/resin_step2", + "block/resin/resin_step3", + "block/resin/resin_step4", + "block/resin/resin_step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.resin_bricks.break": { + "sounds": [ + "block/resin_bricks/resin_brick_break" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.resin_bricks.fall": { + "sounds": [ + "block/resin_bricks/resin_brick_fall" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.resin_bricks.hit": { + "sounds": [ + "block/resin_bricks/resin_brick_hit1", + "block/resin_bricks/resin_brick_hit2", + "block/resin_bricks/resin_brick_hit3", + "block/resin_bricks/resin_brick_hit4", + "block/resin_bricks/resin_brick_hit5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.resin_bricks.place": { + "sounds": [ + "block/resin_bricks/resin_brick_place1", + "block/resin_bricks/resin_brick_place2", + "block/resin_bricks/resin_brick_place3", + "block/resin_bricks/resin_brick_place4", + "block/resin_bricks/resin_brick_place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.resin_bricks.step": { + "sounds": [ + "block/resin_bricks/resin_brick_step1", + "block/resin_bricks/resin_brick_step2", + "block/resin_bricks/resin_brick_step3", + "block/resin_bricks/resin_brick_step4", + "block/resin_bricks/resin_brick_step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.respawn_anchor.ambient": { + "sounds": [ + { + "attenuation_distance": 7, + "name": "block/respawn_anchor/ambient1" + }, + { + "attenuation_distance": 7, + "name": "block/respawn_anchor/ambient2" + }, + { + "attenuation_distance": 7, + "name": "block/respawn_anchor/ambient3" + } + ], + "subtitle": "subtitles.block.respawn_anchor.ambient" + }, + "block.respawn_anchor.charge": { + "sounds": [ + "block/respawn_anchor/charge1", + "block/respawn_anchor/charge2", + "block/respawn_anchor/charge3" + ], + "subtitle": "subtitles.block.respawn_anchor.charge" + }, + "block.respawn_anchor.deplete": { + "sounds": [ + "block/respawn_anchor/deplete1", + "block/respawn_anchor/deplete2" + ], + "subtitle": "subtitles.block.respawn_anchor.deplete" + }, + "block.respawn_anchor.set_spawn": { + "sounds": [ + "block/respawn_anchor/set_spawn1", + "block/respawn_anchor/set_spawn2", + "block/respawn_anchor/set_spawn3" + ], + "subtitle": "subtitles.block.respawn_anchor.set_spawn" + }, + "block.rooted_dirt.break": { + "sounds": [ + "block/rooted_dirt/break1", + "block/rooted_dirt/break2", + "block/rooted_dirt/break3", + "block/rooted_dirt/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.rooted_dirt.fall": { + "sounds": [ + "block/rooted_dirt/step1", + "block/rooted_dirt/step2", + "block/rooted_dirt/step3", + "block/rooted_dirt/step4", + "block/rooted_dirt/step5", + "block/rooted_dirt/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.rooted_dirt.hit": { + "sounds": [ + { + "name": "block/rooted_dirt/step1", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step2", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step3", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step4", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step5", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.rooted_dirt.place": { + "sounds": [ + "block/rooted_dirt/break1", + "block/rooted_dirt/break2", + "block/rooted_dirt/break3", + "block/rooted_dirt/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.rooted_dirt.step": { + "sounds": [ + "block/rooted_dirt/step1", + "block/rooted_dirt/step2", + "block/rooted_dirt/step3", + "block/rooted_dirt/step4", + "block/rooted_dirt/step5", + "block/rooted_dirt/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.roots.break": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.roots.fall": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.roots.hit": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.roots.place": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.roots.step": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sand.break": { + "sounds": [ + "dig/sand1", + "dig/sand2", + "dig/sand3", + "dig/sand4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sand.fall": { + "sounds": [ + "step/sand1", + "step/sand2", + "step/sand3", + "step/sand4", + "step/sand5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sand.hit": { + "sounds": [ + "step/sand1", + "step/sand2", + "step/sand3", + "step/sand4", + "step/sand5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sand.place": { + "sounds": [ + "dig/sand1", + "dig/sand2", + "dig/sand3", + "dig/sand4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sand.step": { + "sounds": [ + "step/sand1", + "step/sand2", + "step/sand3", + "step/sand4", + "step/sand5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.scaffolding.break": { + "sounds": [ + { + "name": "block/scaffold/place1", + "pitch": 1.4, + "volume": 0.8 + }, + { + "name": "block/scaffold/place2", + "pitch": 1.4, + "volume": 0.8 + }, + { + "name": "block/scaffold/place3", + "pitch": 1.4, + "volume": 0.8 + }, + { + "name": "block/scaffold/place4", + "pitch": 1.4, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.scaffolding.fall": { + "sounds": [ + "step/scaffold1", + "step/scaffold2", + "step/scaffold3", + "step/scaffold4", + "step/scaffold5", + "step/scaffold6", + "step/scaffold7" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.scaffolding.hit": { + "sounds": [ + "step/scaffold1", + "step/scaffold2", + "step/scaffold3", + "step/scaffold4", + "step/scaffold5", + "step/scaffold6", + "step/scaffold7" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.scaffolding.place": { + "sounds": [ + { + "name": "block/scaffold/place1", + "volume": 0.9 + }, + { + "name": "block/scaffold/place2", + "volume": 0.9 + }, + { + "name": "block/scaffold/place3", + "volume": 0.9 + }, + { + "name": "block/scaffold/place4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.scaffolding.step": { + "sounds": [ + "step/scaffold1", + "step/scaffold2", + "step/scaffold3", + "step/scaffold4", + "step/scaffold5", + "step/scaffold6", + "step/scaffold7" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk.break": { + "sounds": [ + "block/sculk/break1", + "block/sculk/break2", + "block/sculk/break3", + "block/sculk/break4", + "block/sculk/break5", + "block/sculk/break6", + "block/sculk/break7", + "block/sculk/break8", + "block/sculk/break9", + "block/sculk/break10", + "block/sculk/break11", + "block/sculk/break12", + "block/sculk/break13", + "block/sculk/break14" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk.charge": { + "sounds": [ + "block/sculk/charge1", + "block/sculk/charge2", + "block/sculk/charge3", + "block/sculk/charge4", + "block/sculk/charge5" + ], + "subtitle": "subtitles.block.sculk.charge" + }, + "block.sculk.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk.place": { + "sounds": [ + "block/sculk/place1", + "block/sculk/place2", + "block/sculk/place3", + "block/sculk/place4", + "block/sculk/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk.spread": { + "sounds": [ + { + "name": "block/sculk/spread1", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread2", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread3", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread4", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread5", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.sculk.spread" + }, + "block.sculk.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_catalyst.bloom": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed1", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed2", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed3", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed4", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed5", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed6", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed7", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed8", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed9", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed10", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed11", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed12", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed13", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.sculk_catalyst.bloom" + }, + "block.sculk_catalyst.break": { + "sounds": [ + "block/sculk_catalyst/break1", + "block/sculk_catalyst/break2", + "block/sculk_catalyst/break3", + "block/sculk_catalyst/break4", + "block/sculk_catalyst/break5", + "block/sculk_catalyst/break6", + "block/sculk_catalyst/break7", + "block/sculk_catalyst/break8", + "block/sculk_catalyst/break9", + "block/sculk_catalyst/break10" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_catalyst.fall": { + "sounds": [ + "block/sculk_catalyst/step1", + "block/sculk_catalyst/step2", + "block/sculk_catalyst/step3", + "block/sculk_catalyst/step4", + "block/sculk_catalyst/step5", + "block/sculk_catalyst/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_catalyst.hit": { + "sounds": [ + "block/sculk_catalyst/step1", + "block/sculk_catalyst/step2", + "block/sculk_catalyst/step3", + "block/sculk_catalyst/step4", + "block/sculk_catalyst/step5", + "block/sculk_catalyst/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_catalyst.place": { + "sounds": [ + "block/sculk_catalyst/place1", + "block/sculk_catalyst/place2", + "block/sculk_catalyst/place3", + "block/sculk_catalyst/place4", + "block/sculk_catalyst/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_catalyst.step": { + "sounds": [ + "block/sculk_catalyst/step1", + "block/sculk_catalyst/step2", + "block/sculk_catalyst/step3", + "block/sculk_catalyst/step4", + "block/sculk_catalyst/step5", + "block/sculk_catalyst/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_sensor.break": { + "sounds": [ + { + "name": "block/sculk_sensor/break1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break5", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_sensor.clicking": { + "sounds": [ + { + "name": "block/sculk_sensor/sculk_clicking1", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking2", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking3", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking4", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking5", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking6", + "volume": 0.73 + } + ], + "subtitle": "subtitles.block.sculk_sensor.clicking" + }, + "block.sculk_sensor.clicking_stop": { + "sounds": [ + { + "name": "block/sculk_sensor/sculk_clicking_stop1", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop2", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop3", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop4", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop5", + "volume": 0.62 + } + ], + "subtitle": "subtitles.block.sculk_sensor.clicking_stop" + }, + "block.sculk_sensor.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_sensor.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_sensor.place": { + "sounds": [ + { + "name": "block/sculk_sensor/place1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_sensor.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_shrieker.break": { + "sounds": [ + { + "name": "block/sculk_shrieker/break1", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break2", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break3", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break4", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break5", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_shrieker.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_shrieker.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_shrieker.place": { + "sounds": [ + { + "name": "block/sculk_shrieker/place1", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place2", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place3", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place4", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_shrieker.shriek": { + "sounds": [ + { + "name": "block/sculk_shrieker/shriek1", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek2", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek3", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek4", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek5", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.sculk_shrieker.shriek" + }, + "block.sculk_shrieker.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_vein.break": { + "sounds": [ + { + "name": "block/sculk_vein/break1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break4", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break5", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_vein.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_vein.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_vein.place": { + "sounds": [ + { + "name": "block/sculk_vein/break1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break4", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break5", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_vein.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.shroomlight.break": { + "sounds": [ + "block/shroomlight/break1", + "block/shroomlight/break2", + "block/shroomlight/break3", + "block/shroomlight/break4", + "block/shroomlight/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.shroomlight.fall": { + "sounds": [ + "block/shroomlight/step1", + "block/shroomlight/step2", + "block/shroomlight/step3", + "block/shroomlight/step4", + "block/shroomlight/step5", + "block/shroomlight/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.shroomlight.hit": { + "sounds": [ + "block/shroomlight/step1", + "block/shroomlight/step2", + "block/shroomlight/step3", + "block/shroomlight/step4", + "block/shroomlight/step5", + "block/shroomlight/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.shroomlight.place": { + "sounds": [ + "block/shroomlight/break1", + "block/shroomlight/break2", + "block/shroomlight/break3", + "block/shroomlight/break4", + "block/shroomlight/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.shroomlight.step": { + "sounds": [ + "block/shroomlight/step1", + "block/shroomlight/step2", + "block/shroomlight/step3", + "block/shroomlight/step4", + "block/shroomlight/step5", + "block/shroomlight/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.shulker_box.close": { + "sounds": [ + "block/shulker_box/close" + ], + "subtitle": "subtitles.block.shulker_box.close" + }, + "block.shulker_box.open": { + "sounds": [ + "block/shulker_box/open" + ], + "subtitle": "subtitles.block.shulker_box.open" + }, + "block.sign.waxed_interact_fail": { + "sounds": [ + "block/sign/waxed_interact_fail1", + { + "name": "block/sign/waxed_interact_fail1", + "pitch": 0.9 + }, + { + "name": "block/sign/waxed_interact_fail2", + "pitch": 0.8 + }, + { + "name": "block/sign/waxed_interact_fail2", + "pitch": 0.9 + }, + { + "name": "block/sign/waxed_interact_fail3", + "pitch": 0.8 + }, + { + "name": "block/sign/waxed_interact_fail3", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.sign.waxed_interact_fail" + }, + "block.slime_block.break": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.slime_block.fall": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.slime_block.hit": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.slime_block.place": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.slime_block.step": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.small_amethyst_bud.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/break2", + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/break3", + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/break4", + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.small_amethyst_bud.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "pitch": 1.2, + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/place2", + "pitch": 1.2, + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/place3", + "pitch": 1.2, + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/place4", + "pitch": 1.2, + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.small_dripleaf.break": { + "sounds": [ + { + "name": "block/big_dripleaf/break1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.small_dripleaf.fall": { + "sounds": [ + { + "name": "block/big_dripleaf/step1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.small_dripleaf.hit": { + "sounds": [ + { + "name": "block/big_dripleaf/step1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.small_dripleaf.place": { + "sounds": [ + { + "name": "block/big_dripleaf/break1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.small_dripleaf.step": { + "sounds": [ + { + "name": "block/big_dripleaf/step1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.smithing_table.use": { + "sounds": [ + "block/smithing_table/smithing_table1", + "block/smithing_table/smithing_table2", + "block/smithing_table/smithing_table3" + ], + "subtitle": "subtitles.block.smithing_table.use" + }, + "block.smoker.smoke": { + "sounds": [ + "block/smoker/smoker1", + "block/smoker/smoker2", + "block/smoker/smoker3", + "block/smoker/smoker4", + "block/smoker/smoker5" + ], + "subtitle": "subtitles.block.smoker.smoke" + }, + "block.sniffer_egg.crack": { + "sounds": [ + { + "name": "mob/turtle/egg/egg_crack1", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack2", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack3", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack4", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack5", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.sniffer_egg.crack" + }, + "block.sniffer_egg.hatch": { + "sounds": [ + { + "name": "mob/turtle/egg/egg_break1", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_break2", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.sniffer_egg.hatch" + }, + "block.sniffer_egg.plop": { + "sounds": [ + { + "name": "mob/chicken/plop", + "pitch": 0.6 + }, + { + "name": "mob/chicken/plop", + "pitch": 0.7 + }, + { + "name": "mob/chicken/plop", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.sniffer_egg.plop" + }, + "block.snow.break": { + "sounds": [ + "dig/snow1", + "dig/snow2", + "dig/snow3", + "dig/snow4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.snow.fall": { + "sounds": [ + "step/snow1", + "step/snow2", + "step/snow3", + "step/snow4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.snow.hit": { + "sounds": [ + "step/snow1", + "step/snow2", + "step/snow3", + "step/snow4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.snow.place": { + "sounds": [ + "dig/snow1", + "dig/snow2", + "dig/snow3", + "dig/snow4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.snow.step": { + "sounds": [ + "step/snow1", + "step/snow2", + "step/snow3", + "step/snow4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.soul_sand.break": { + "sounds": [ + "block/soul_sand/break1", + "block/soul_sand/break2", + "block/soul_sand/break3", + "block/soul_sand/break4", + "block/soul_sand/break5", + "block/soul_sand/break6", + "block/soul_sand/break7", + "block/soul_sand/break8", + "block/soul_sand/break9" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.soul_sand.fall": { + "sounds": [ + "block/soul_sand/step1", + "block/soul_sand/step2", + "block/soul_sand/step3", + "block/soul_sand/step4", + "block/soul_sand/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.soul_sand.hit": { + "sounds": [ + { + "name": "block/soul_sand/step1", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step2", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step3", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step4", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step5", + "volume": 0.55 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.soul_sand.place": { + "sounds": [ + "block/soul_sand/break1", + "block/soul_sand/break2", + "block/soul_sand/break3", + "block/soul_sand/break4", + "block/soul_sand/break5", + "block/soul_sand/break6", + "block/soul_sand/break7", + "block/soul_sand/break8", + "block/soul_sand/break9" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.soul_sand.step": { + "sounds": [ + "block/soul_sand/step1", + "block/soul_sand/step2", + "block/soul_sand/step3", + "block/soul_sand/step4", + "block/soul_sand/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.soul_soil.break": { + "sounds": [ + { + "name": "block/soul_soil/break1", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break2", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break3", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break4", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break5", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.soul_soil.fall": { + "sounds": [ + "block/soul_soil/step1", + "block/soul_soil/step2", + "block/soul_soil/step3", + "block/soul_soil/step4", + "block/soul_soil/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.soul_soil.hit": { + "sounds": [ + { + "name": "block/soul_soil/step1", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step2", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step3", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step4", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step5", + "volume": 0.66 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.soul_soil.place": { + "sounds": [ + { + "name": "block/soul_soil/break1", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break2", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break3", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break4", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break5", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.soul_soil.step": { + "sounds": [ + "block/soul_soil/step1", + "block/soul_soil/step2", + "block/soul_soil/step3", + "block/soul_soil/step4", + "block/soul_soil/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.spawner.break": { + "sounds": [ + "block/spawner/break1", + "block/spawner/break2", + "block/spawner/break3", + "block/spawner/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.spawner.fall": { + "sounds": [ + "block/spawner/step1", + "block/spawner/step2", + "block/spawner/step3", + "block/spawner/step4", + "block/spawner/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.spawner.hit": { + "sounds": [ + "block/spawner/step1", + "block/spawner/step2", + "block/spawner/step3", + "block/spawner/step4", + "block/spawner/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.spawner.place": { + "sounds": [ + "block/spawner/break1", + "block/spawner/break2", + "block/spawner/break3", + "block/spawner/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.spawner.step": { + "sounds": [ + "block/spawner/step1", + "block/spawner/step2", + "block/spawner/step3", + "block/spawner/step4", + "block/spawner/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sponge.absorb": { + "sounds": [ + "block/sponge/absorb1", + "block/sponge/absorb2", + "block/sponge/absorb3" + ], + "subtitle": "subtitles.block.sponge.absorb" + }, + "block.sponge.break": { + "sounds": [ + "block/sponge/break1", + "block/sponge/break2", + "block/sponge/break3", + "block/sponge/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sponge.fall": { + "sounds": [ + "block/sponge/step1", + "block/sponge/step2", + "block/sponge/step3", + "block/sponge/step4", + "block/sponge/step5", + "block/sponge/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sponge.hit": { + "sounds": [ + { + "name": "block/sponge/step1", + "volume": 0.8 + }, + { + "name": "block/sponge/step2", + "volume": 0.8 + }, + { + "name": "block/sponge/step3", + "volume": 0.8 + }, + { + "name": "block/sponge/step4", + "volume": 0.8 + }, + { + "name": "block/sponge/step5", + "volume": 0.8 + }, + { + "name": "block/sponge/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sponge.place": { + "sounds": [ + "block/sponge/break1", + "block/sponge/break2", + "block/sponge/break3", + "block/sponge/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sponge.step": { + "sounds": [ + "block/sponge/step1", + "block/sponge/step2", + "block/sponge/step3", + "block/sponge/step4", + "block/sponge/step5", + "block/sponge/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.spore_blossom.break": { + "sounds": [ + "block/spore_blossom/break1", + "block/spore_blossom/break2", + "block/spore_blossom/break3", + "block/spore_blossom/break4", + "block/spore_blossom/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.spore_blossom.fall": { + "sounds": [ + "block/spore_blossom/step1", + "block/spore_blossom/step2", + "block/spore_blossom/step3", + "block/spore_blossom/step4", + "block/spore_blossom/step5", + "block/spore_blossom/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.spore_blossom.hit": { + "sounds": [ + "block/spore_blossom/step1", + "block/spore_blossom/step2", + "block/spore_blossom/step3", + "block/spore_blossom/step4", + "block/spore_blossom/step5", + "block/spore_blossom/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.spore_blossom.place": { + "sounds": [ + "block/spore_blossom/break1", + "block/spore_blossom/break2", + "block/spore_blossom/break3", + "block/spore_blossom/break4", + "block/spore_blossom/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.spore_blossom.step": { + "sounds": [ + "block/spore_blossom/step1", + "block/spore_blossom/step2", + "block/spore_blossom/step3", + "block/spore_blossom/step4", + "block/spore_blossom/step5", + "block/spore_blossom/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.stem.break": { + "sounds": [ + "block/stem/break1", + "block/stem/break2", + "block/stem/break3", + "block/stem/break4", + "block/stem/break5", + "block/stem/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.stem.fall": { + "sounds": [ + "block/stem/step1", + "block/stem/step2", + "block/stem/step3", + "block/stem/step4", + "block/stem/step5", + "block/stem/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.stem.hit": { + "sounds": [ + { + "name": "block/stem/step1", + "volume": 0.8 + }, + { + "name": "block/stem/step2", + "volume": 0.8 + }, + { + "name": "block/stem/step3", + "volume": 0.8 + }, + { + "name": "block/stem/step4", + "volume": 0.8 + }, + { + "name": "block/stem/step5", + "volume": 0.8 + }, + { + "name": "block/stem/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.stem.place": { + "sounds": [ + { + "name": "block/stem/break1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break4", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break5", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break6", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.stem.step": { + "sounds": [ + "block/stem/step1", + "block/stem/step2", + "block/stem/step3", + "block/stem/step4", + "block/stem/step5", + "block/stem/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.stone.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.stone.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.stone.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.stone.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.stone.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.stone_button.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.stone_button.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.stone_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.stone_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.suspicious_gravel.break": { + "sounds": [ + "block/suspicious_gravel/break1", + "block/suspicious_gravel/break2", + "block/suspicious_gravel/break3", + "block/suspicious_gravel/break4", + "block/suspicious_gravel/break5", + "block/suspicious_gravel/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.suspicious_gravel.fall": { + "sounds": [ + "block/suspicious_gravel/step1", + "block/suspicious_gravel/step2", + "block/suspicious_gravel/step3", + "block/suspicious_gravel/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.suspicious_gravel.hit": { + "sounds": [ + { + "name": "block/suspicious_gravel/step1", + "volume": 0.8 + }, + { + "name": "block/suspicious_gravel/step2", + "volume": 0.8 + }, + { + "name": "block/suspicious_gravel/step3", + "volume": 0.8 + }, + { + "name": "block/suspicious_gravel/step4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.suspicious_gravel.place": { + "sounds": [ + "block/suspicious_gravel/place1", + "block/suspicious_gravel/place2", + "block/suspicious_gravel/place3", + "block/suspicious_gravel/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.suspicious_gravel.step": { + "sounds": [ + "block/suspicious_gravel/step1", + "block/suspicious_gravel/step2", + "block/suspicious_gravel/step3", + "block/suspicious_gravel/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.suspicious_sand.break": { + "sounds": [ + "block/suspicious_sand/break1", + "block/suspicious_sand/break2", + "block/suspicious_sand/break3", + "block/suspicious_sand/break4", + "block/suspicious_sand/break5", + "block/suspicious_sand/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.suspicious_sand.fall": { + "sounds": [ + "block/suspicious_sand/step1", + "block/suspicious_sand/step2", + "block/suspicious_sand/step3", + "block/suspicious_sand/step4", + "block/suspicious_sand/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.suspicious_sand.hit": { + "sounds": [ + "block/suspicious_sand/step1", + "block/suspicious_sand/step2", + "block/suspicious_sand/step3", + "block/suspicious_sand/step4", + "block/suspicious_sand/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.suspicious_sand.place": { + "sounds": [ + "block/suspicious_sand/place1", + "block/suspicious_sand/place2", + "block/suspicious_sand/place3", + "block/suspicious_sand/place4", + "block/suspicious_sand/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.suspicious_sand.step": { + "sounds": [ + "block/suspicious_sand/step1", + "block/suspicious_sand/step2", + "block/suspicious_sand/step3", + "block/suspicious_sand/step4", + "block/suspicious_sand/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sweet_berry_bush.break": { + "sounds": [ + { + "name": "block/sweet_berry_bush/break1", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/break2", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/break3", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sweet_berry_bush.pick_berries": { + "sounds": [ + "item/sweet_berries/pick_from_bush1", + "item/sweet_berries/pick_from_bush2" + ], + "subtitle": "subtitles.block.sweet_berry_bush.pick_berries" + }, + "block.sweet_berry_bush.place": { + "sounds": [ + { + "name": "block/sweet_berry_bush/place1", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place2", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place3", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place4", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place5", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.trial_spawner.about_to_spawn_item": { + "sounds": [ + "block/trial_spawner/about_to_spawn_item" + ], + "subtitle": "subtitles.block.trial_spawner.about_to_spawn_item" + }, + "block.trial_spawner.ambient": { + "sounds": [ + "block/trial_spawner/ambient1", + "block/trial_spawner/ambient2", + "block/trial_spawner/ambient3", + "block/trial_spawner/ambient4", + "block/trial_spawner/ambient5" + ], + "subtitle": "subtitles.block.trial_spawner.ambient" + }, + "block.trial_spawner.ambient_ominous": { + "sounds": [ + "block/trial_spawner/ambient_ominous1", + "block/trial_spawner/ambient_ominous2", + "block/trial_spawner/ambient_ominous3", + "block/trial_spawner/ambient_ominous4", + "block/trial_spawner/ambient_ominous5" + ], + "subtitle": "subtitles.block.trial_spawner.ambient_ominous" + }, + "block.trial_spawner.break": { + "sounds": [ + { + "name": "block/trial_spawner/break1", + "volume": 0.9 + }, + { + "name": "block/trial_spawner/break2", + "volume": 0.9 + }, + { + "name": "block/trial_spawner/break3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.trial_spawner.close_shutter": { + "sounds": [ + "block/trial_spawner/close_shutter" + ], + "subtitle": "subtitles.block.trial_spawner.close_shutter" + }, + "block.trial_spawner.detect_player": { + "sounds": [ + "block/trial_spawner/detect_player1", + { + "name": "block/trial_spawner/detect_player1", + "pitch": 0.95 + }, + "block/trial_spawner/detect_player2", + { + "name": "block/trial_spawner/detect_player2", + "pitch": 0.95 + }, + "block/trial_spawner/detect_player3", + { + "name": "block/trial_spawner/detect_player3", + "pitch": 0.95 + } + ], + "subtitle": "subtitles.block.trial_spawner.detect_player" + }, + "block.trial_spawner.eject_item": { + "sounds": [ + "block/trial_spawner/eject_item1" + ], + "subtitle": "subtitles.block.trial_spawner.eject_item" + }, + "block.trial_spawner.fall": { + "sounds": [ + "block/trial_spawner/step1", + "block/trial_spawner/step2", + "block/trial_spawner/step3", + "block/trial_spawner/step4", + "block/trial_spawner/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.trial_spawner.hit": { + "sounds": [ + "block/trial_spawner/step1", + "block/trial_spawner/step2", + "block/trial_spawner/step3", + "block/trial_spawner/step4", + "block/trial_spawner/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.trial_spawner.ominous_activate": { + "sounds": [ + "block/trial_spawner/ominous_activate" + ], + "subtitle": "subtitles.block.trial_spawner.ominous_activate" + }, + "block.trial_spawner.open_shutter": { + "sounds": [ + "block/trial_spawner/open_shutter" + ], + "subtitle": "subtitles.block.trial_spawner.open_shutter" + }, + "block.trial_spawner.place": { + "sounds": [ + "block/trial_spawner/place1", + "block/trial_spawner/place2", + "block/trial_spawner/place3" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.trial_spawner.spawn_item": { + "sounds": [ + "block/trial_spawner/spawn_item1", + "block/trial_spawner/spawn_item2", + "block/trial_spawner/spawn_item3" + ], + "subtitle": "subtitles.block.trial_spawner.spawn_item" + }, + "block.trial_spawner.spawn_item_begin": { + "sounds": [ + "block/trial_spawner/spawn_item_begin1", + "block/trial_spawner/spawn_item_begin2", + "block/trial_spawner/spawn_item_begin3" + ], + "subtitle": "subtitles.block.trial_spawner.spawn_item_begin" + }, + "block.trial_spawner.spawn_mob": { + "sounds": [ + "block/trial_spawner/spawn1", + "block/trial_spawner/spawn2", + "block/trial_spawner/spawn3", + "block/trial_spawner/spawn4" + ], + "subtitle": "subtitles.block.trial_spawner.spawn_mob" + }, + "block.trial_spawner.step": { + "sounds": [ + "block/trial_spawner/step1", + "block/trial_spawner/step2", + "block/trial_spawner/step3", + "block/trial_spawner/step4", + "block/trial_spawner/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.tripwire.attach": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.tripwire.attach" + }, + "block.tripwire.click_off": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.tripwire.click" + }, + "block.tripwire.click_on": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.tripwire.click" + }, + "block.tripwire.detach": { + "sounds": [ + "random/bowhit1", + "random/bowhit2", + "random/bowhit3", + "random/bowhit4" + ], + "subtitle": "subtitles.block.tripwire.detach" + }, + "block.tuff.break": { + "sounds": [ + "block/tuff/break1", + "block/tuff/break2", + "block/tuff/break3", + "block/tuff/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.tuff.fall": { + "sounds": [ + "block/tuff/step1", + "block/tuff/step2", + "block/tuff/step3", + "block/tuff/step4", + "block/tuff/step5", + "block/tuff/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.tuff.hit": { + "sounds": [ + "block/tuff/step1", + "block/tuff/step2", + "block/tuff/step3", + "block/tuff/step4", + "block/tuff/step5", + "block/tuff/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.tuff.place": { + "sounds": [ + "block/tuff/break1", + "block/tuff/break2", + "block/tuff/break3", + "block/tuff/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.tuff.step": { + "sounds": [ + "block/tuff/step1", + "block/tuff/step2", + "block/tuff/step3", + "block/tuff/step4", + "block/tuff/step5", + "block/tuff/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.tuff_bricks.break": { + "sounds": [ + "block/tuff_bricks/place1", + "block/tuff_bricks/place2", + "block/tuff_bricks/place3", + "block/tuff_bricks/place4", + "block/tuff_bricks/place5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.tuff_bricks.fall": { + "sounds": [ + "block/tuff_bricks/step1", + "block/tuff_bricks/step2", + "block/tuff_bricks/step3", + "block/tuff_bricks/step4", + "block/tuff_bricks/step5", + "block/tuff_bricks/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.tuff_bricks.hit": { + "sounds": [ + "block/tuff_bricks/step1", + "block/tuff_bricks/step2", + "block/tuff_bricks/step3", + "block/tuff_bricks/step4", + "block/tuff_bricks/step5", + "block/tuff_bricks/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.tuff_bricks.place": { + "sounds": [ + "block/tuff_bricks/place1", + "block/tuff_bricks/place2", + "block/tuff_bricks/place3", + "block/tuff_bricks/place4", + "block/tuff_bricks/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.tuff_bricks.step": { + "sounds": [ + "block/tuff_bricks/step1", + "block/tuff_bricks/step2", + "block/tuff_bricks/step3", + "block/tuff_bricks/step4", + "block/tuff_bricks/step5", + "block/tuff_bricks/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.vault.activate": { + "sounds": [ + "block/vault/activate" + ], + "subtitle": "subtitles.block.vault.activate" + }, + "block.vault.ambient": { + "sounds": [ + "block/vault/ambient1", + "block/vault/ambient2", + "block/vault/ambient3" + ], + "subtitle": "subtitles.block.vault.ambient" + }, + "block.vault.break": { + "sounds": [ + "block/vault/break1", + "block/vault/break2", + "block/vault/break3", + "block/vault/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.vault.close_shutter": { + "sounds": [ + "block/trial_spawner/close_shutter" + ], + "subtitle": "subtitles.block.vault.close_shutter" + }, + "block.vault.deactivate": { + "sounds": [ + "block/vault/deactivate" + ], + "subtitle": "subtitles.block.vault.deactivate" + }, + "block.vault.eject_item": { + "sounds": [ + "block/vault/eject1", + "block/vault/eject2", + "block/vault/eject3" + ], + "subtitle": "subtitles.block.vault.eject_item" + }, + "block.vault.fall": { + "sounds": [ + "block/vault/step1", + "block/vault/step2", + "block/vault/step3", + "block/vault/step4", + "block/vault/step5", + "block/vault/step6", + "block/vault/step7", + "block/vault/step8" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.vault.hit": { + "sounds": [ + "block/vault/step1", + "block/vault/step2", + "block/vault/step3", + "block/vault/step4", + "block/vault/step5", + "block/vault/step6", + "block/vault/step7", + "block/vault/step8" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.vault.insert_item": { + "sounds": [ + "block/vault/insert" + ], + "subtitle": "subtitles.block.vault.insert_item" + }, + "block.vault.insert_item_fail": { + "sounds": [ + "block/vault/insert_fail" + ], + "subtitle": "subtitles.block.vault.insert_item_fail" + }, + "block.vault.open_shutter": { + "sounds": [ + "block/vault/open_shutter" + ], + "subtitle": "subtitles.block.vault.open_shutter" + }, + "block.vault.place": { + "sounds": [ + "block/vault/place1", + "block/vault/place2", + "block/vault/place3", + "block/vault/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.vault.reject_rewarded_player": { + "sounds": [ + "block/vault/reject_rewarded_player" + ], + "subtitle": "subtitles.block.vault.reject_rewarded_player" + }, + "block.vault.step": { + "sounds": [ + "block/vault/step1", + "block/vault/step2", + "block/vault/step3", + "block/vault/step4", + "block/vault/step5", + "block/vault/step6", + "block/vault/step7", + "block/vault/step8" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.vine.break": { + "sounds": [ + { + "name": "block/vine/break1", + "volume": 0.9 + }, + { + "name": "block/vine/break2", + "volume": 0.9 + }, + { + "name": "block/vine/break3", + "volume": 0.9 + }, + { + "name": "block/vine/break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.vine.fall": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.vine.hit": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.vine.place": { + "sounds": [ + { + "name": "block/vine/break1", + "volume": 0.9 + }, + { + "name": "block/vine/break2", + "volume": 0.9 + }, + { + "name": "block/vine/break3", + "volume": 0.9 + }, + { + "name": "block/vine/break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.vine.step": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wart_block.break": { + "sounds": [ + { + "name": "block/netherwart/break1", + "volume": 0.8 + }, + { + "name": "block/netherwart/break2", + "volume": 0.8 + }, + { + "name": "block/netherwart/break3", + "volume": 0.8 + }, + { + "name": "block/netherwart/break4", + "volume": 0.8 + }, + { + "name": "block/netherwart/break5", + "volume": 0.8 + }, + { + "name": "block/netherwart/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wart_block.fall": { + "sounds": [ + "block/netherwart/step1", + "block/netherwart/step2", + "block/netherwart/step3", + "block/netherwart/step4", + "block/netherwart/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wart_block.hit": { + "sounds": [ + { + "name": "block/netherwart/step1", + "volume": 0.7 + }, + { + "name": "block/netherwart/step2", + "volume": 0.7 + }, + { + "name": "block/netherwart/step3", + "volume": 0.7 + }, + { + "name": "block/netherwart/step4", + "volume": 0.7 + }, + { + "name": "block/netherwart/step5", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wart_block.place": { + "sounds": [ + { + "name": "block/netherwart/break1", + "volume": 0.8 + }, + { + "name": "block/netherwart/break2", + "volume": 0.8 + }, + { + "name": "block/netherwart/break3", + "volume": 0.8 + }, + { + "name": "block/netherwart/break4", + "volume": 0.8 + }, + { + "name": "block/netherwart/break5", + "volume": 0.8 + }, + { + "name": "block/netherwart/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wart_block.step": { + "sounds": [ + "block/netherwart/step1", + "block/netherwart/step2", + "block/netherwart/step3", + "block/netherwart/step4", + "block/netherwart/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.water.ambient": { + "sounds": [ + "liquid/water" + ], + "subtitle": "subtitles.block.water.ambient" + }, + "block.weeping_vines.break": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.weeping_vines.fall": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.weeping_vines.hit": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.weeping_vines.place": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.weeping_vines.step": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wet_grass.break": { + "sounds": [ + { + "name": "dig/wet_grass1", + "volume": 0.8 + }, + { + "name": "dig/wet_grass2", + "volume": 0.8 + }, + { + "name": "dig/wet_grass3", + "volume": 0.8 + }, + { + "name": "dig/wet_grass4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wet_grass.fall": { + "sounds": [ + "step/wet_grass1", + "step/wet_grass2", + "step/wet_grass3", + "step/wet_grass4", + "step/wet_grass5", + "step/wet_grass6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wet_grass.hit": { + "sounds": [ + "step/wet_grass1", + "step/wet_grass2", + "step/wet_grass3", + "step/wet_grass4", + "step/wet_grass5", + "step/wet_grass6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wet_grass.place": { + "sounds": [ + { + "name": "dig/wet_grass1", + "volume": 0.8 + }, + { + "name": "dig/wet_grass2", + "volume": 0.8 + }, + { + "name": "dig/wet_grass3", + "volume": 0.8 + }, + { + "name": "dig/wet_grass4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wet_grass.step": { + "sounds": [ + "step/wet_grass1", + "step/wet_grass2", + "step/wet_grass3", + "step/wet_grass4", + "step/wet_grass5", + "step/wet_grass6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wet_sponge.break": { + "sounds": [ + "block/sponge/wet_sponge/break1", + "block/sponge/wet_sponge/break2", + "block/sponge/wet_sponge/break3", + "block/sponge/wet_sponge/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wet_sponge.dries": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.wet_sponge.dries" + }, + "block.wet_sponge.fall": { + "sounds": [ + "block/sponge/wet_sponge/step1", + "block/sponge/wet_sponge/step2", + "block/sponge/wet_sponge/step3", + "block/sponge/wet_sponge/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wet_sponge.hit": { + "sounds": [ + "block/sponge/wet_sponge/step1", + "block/sponge/wet_sponge/step2", + "block/sponge/wet_sponge/step3", + "block/sponge/wet_sponge/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wet_sponge.place": { + "sounds": [ + "block/sponge/wet_sponge/break1", + "block/sponge/wet_sponge/break2", + "block/sponge/wet_sponge/break3", + "block/sponge/wet_sponge/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wet_sponge.step": { + "sounds": [ + "block/sponge/wet_sponge/step1", + "block/sponge/wet_sponge/step2", + "block/sponge/wet_sponge/step3", + "block/sponge/wet_sponge/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wood.break": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wood.fall": { + "sounds": [ + "step/wood1", + "step/wood2", + "step/wood3", + "step/wood4", + "step/wood5", + "step/wood6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wood.hit": { + "sounds": [ + "step/wood1", + "step/wood2", + "step/wood3", + "step/wood4", + "step/wood5", + "step/wood6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wood.place": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wood.step": { + "sounds": [ + "step/wood1", + "step/wood2", + "step/wood3", + "step/wood4", + "step/wood5", + "step/wood6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wooden_button.click_off": { + "sounds": [ + { + "name": "random/wood_click", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.wooden_button.click_on": { + "sounds": [ + { + "name": "random/wood_click", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.wooden_door.close": { + "sounds": [ + { + "name": "block/wooden_door/close1", + "volume": 0.9 + }, + { + "name": "block/wooden_door/close2", + "volume": 0.9 + }, + { + "name": "block/wooden_door/close3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.wooden_door.open": { + "sounds": [ + { + "name": "block/wooden_door/open1", + "volume": 0.9 + }, + { + "name": "block/wooden_door/open2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.wooden_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.wooden_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.wooden_trapdoor.close": { + "sounds": [ + { + "name": "block/wooden_trapdoor/close1", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/close2", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/close3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.wooden_trapdoor.open": { + "sounds": [ + { + "name": "block/wooden_trapdoor/open1", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open2", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open3", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open4", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.wool.break": { + "sounds": [ + "dig/cloth1", + "dig/cloth2", + "dig/cloth3", + "dig/cloth4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wool.fall": { + "sounds": [ + "step/cloth1", + "step/cloth2", + "step/cloth3", + "step/cloth4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wool.hit": { + "sounds": [ + "step/cloth1", + "step/cloth2", + "step/cloth3", + "step/cloth4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wool.place": { + "sounds": [ + "dig/cloth1", + "dig/cloth2", + "dig/cloth3", + "dig/cloth4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wool.step": { + "sounds": [ + "step/cloth1", + "step/cloth2", + "step/cloth3", + "step/cloth4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "enchant.thorns.hit": { + "sounds": [ + "enchant/thorns/hit1", + "enchant/thorns/hit2", + "enchant/thorns/hit3", + "enchant/thorns/hit4" + ], + "subtitle": "subtitles.enchant.thorns.hit" + }, + "entity.allay.ambient_with_item": { + "sounds": [ + { + "name": "mob/allay/idle_with_item1", + "pitch": 1.25, + "volume": 0.3 + }, + { + "name": "mob/allay/idle_with_item2", + "pitch": 1.25, + "volume": 0.3 + }, + { + "name": "mob/allay/idle_with_item3", + "pitch": 1.25, + "volume": 0.3 + }, + { + "name": "mob/allay/idle_with_item4", + "pitch": 1.25, + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.allay.ambient_with_item" + }, + "entity.allay.ambient_without_item": { + "sounds": [ + { + "name": "mob/allay/idle_without_item1", + "volume": 0.25 + }, + { + "name": "mob/allay/idle_without_item2", + "volume": 0.25 + }, + { + "name": "mob/allay/idle_without_item3", + "volume": 0.25 + }, + { + "name": "mob/allay/idle_without_item4", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.allay.ambient_without_item" + }, + "entity.allay.death": { + "sounds": [ + { + "name": "mob/allay/death1", + "volume": 0.6 + }, + { + "name": "mob/allay/death2", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.allay.death" + }, + "entity.allay.hurt": { + "sounds": [ + { + "name": "mob/allay/hurt1", + "pitch": 1.5, + "volume": 0.8 + }, + { + "name": "mob/allay/hurt2", + "pitch": 1.5, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.allay.hurt" + }, + "entity.allay.item_given": { + "sounds": [ + { + "name": "mob/allay/item_given1", + "volume": 0.1 + }, + { + "name": "mob/allay/item_given2", + "volume": 0.1 + }, + { + "name": "mob/allay/item_given3", + "volume": 0.1 + }, + { + "name": "mob/allay/item_given4", + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.allay.item_given" + }, + "entity.allay.item_taken": { + "sounds": [ + { + "name": "mob/allay/item_taken1", + "pitch": 1.25, + "volume": 0.1 + }, + { + "name": "mob/allay/item_taken2", + "pitch": 1.25, + "volume": 0.1 + }, + { + "name": "mob/allay/item_taken3", + "pitch": 1.25, + "volume": 0.1 + }, + { + "name": "mob/allay/item_taken4", + "pitch": 1.25, + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.allay.item_taken" + }, + "entity.allay.item_thrown": { + "sounds": [ + { + "name": "mob/allay/item_thrown1", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.allay.item_thrown" + }, + "entity.armadillo.ambient": { + "sounds": [ + "mob/armadillo/ambient1", + "mob/armadillo/ambient2", + "mob/armadillo/ambient3", + "mob/armadillo/ambient4", + "mob/armadillo/ambient5", + "mob/armadillo/ambient6", + "mob/armadillo/ambient7", + "mob/armadillo/ambient8" + ], + "subtitle": "subtitles.entity.armadillo.ambient" + }, + "entity.armadillo.brush": { + "sounds": [ + { + "name": "mob/armadillo/brush_armadillo1", + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo1", + "pitch": 0.8, + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo2", + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo2", + "pitch": 0.8, + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo2", + "pitch": 0.9, + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.armadillo.brush" + }, + "entity.armadillo.death": { + "sounds": [ + "mob/armadillo/death1", + "mob/armadillo/death2", + "mob/armadillo/death3", + "mob/armadillo/death4" + ], + "subtitle": "subtitles.entity.armadillo.death" + }, + "entity.armadillo.eat": { + "sounds": [ + "mob/armadillo/eat1", + "mob/armadillo/eat2", + "mob/armadillo/eat3" + ], + "subtitle": "subtitles.entity.armadillo.eat" + }, + "entity.armadillo.hurt": { + "sounds": [ + "mob/armadillo/hurt1", + "mob/armadillo/hurt2", + "mob/armadillo/hurt3", + "mob/armadillo/hurt4", + "mob/armadillo/hurt5" + ], + "subtitle": "subtitles.entity.armadillo.hurt" + }, + "entity.armadillo.hurt_reduced": { + "sounds": [ + "mob/armadillo/hurt_reduced1", + "mob/armadillo/hurt_reduced2", + "mob/armadillo/hurt_reduced3", + "mob/armadillo/hurt_reduced4" + ], + "subtitle": "subtitles.entity.armadillo.hurt_reduced" + }, + "entity.armadillo.land": { + "sounds": [ + "mob/armadillo/land1", + "mob/armadillo/land2", + "mob/armadillo/land3", + "mob/armadillo/land4" + ], + "subtitle": "subtitles.entity.armadillo.land" + }, + "entity.armadillo.peek": { + "sounds": [ + "mob/armadillo/peek" + ], + "subtitle": "subtitles.entity.armadillo.peek" + }, + "entity.armadillo.roll": { + "sounds": [ + "mob/armadillo/roll1", + "mob/armadillo/roll2", + "mob/armadillo/roll3", + "mob/armadillo/roll4" + ], + "subtitle": "subtitles.entity.armadillo.roll" + }, + "entity.armadillo.scute_drop": { + "sounds": [ + "mob/armadillo/scute_drop1", + { + "name": "mob/armadillo/scute_drop1", + "pitch": 0.9 + }, + "mob/armadillo/scute_drop2", + { + "name": "mob/armadillo/scute_drop2", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.armadillo.scute_drop" + }, + "entity.armadillo.step": { + "sounds": [ + "mob/armadillo/step1", + "mob/armadillo/step2", + "mob/armadillo/step3", + "mob/armadillo/step4", + "mob/armadillo/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.armadillo.unroll_finish": { + "sounds": [ + "mob/armadillo/unroll_finish1", + "mob/armadillo/unroll_finish2" + ], + "subtitle": "subtitles.entity.armadillo.unroll_finish" + }, + "entity.armadillo.unroll_start": { + "sounds": [ + "mob/armadillo/unroll_start" + ], + "subtitle": "subtitles.entity.armadillo.unroll_start" + }, + "entity.armor_stand.break": { + "sounds": [ + "entity/armorstand/break1", + "entity/armorstand/break2", + "entity/armorstand/break3", + "entity/armorstand/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "entity.armor_stand.fall": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.entity.armor_stand.fall" + }, + "entity.armor_stand.hit": { + "sounds": [ + "entity/armorstand/hit1", + "entity/armorstand/hit2", + "entity/armorstand/hit3", + "entity/armorstand/hit4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "entity.armor_stand.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "entity.arrow.hit": { + "sounds": [ + "random/bowhit1", + "random/bowhit2", + "random/bowhit3", + "random/bowhit4" + ], + "subtitle": "subtitles.entity.arrow.hit" + }, + "entity.arrow.hit_player": { + "sounds": [ + "random/successful_hit" + ], + "subtitle": "subtitles.entity.arrow.hit_player" + }, + "entity.arrow.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.arrow.shoot" + }, + "entity.axolotl.attack": { + "sounds": [ + { + "name": "mob/axolotl/attack1", + "volume": 0.5 + }, + { + "name": "mob/axolotl/attack2", + "volume": 0.5 + }, + { + "name": "mob/axolotl/attack3", + "volume": 0.5 + }, + { + "name": "mob/axolotl/attack4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.axolotl.attack" + }, + "entity.axolotl.death": { + "sounds": [ + "mob/axolotl/death1", + "mob/axolotl/death2" + ], + "subtitle": "subtitles.entity.axolotl.death" + }, + "entity.axolotl.hurt": { + "sounds": [ + "mob/axolotl/hurt1", + "mob/axolotl/hurt2", + "mob/axolotl/hurt3", + "mob/axolotl/hurt4" + ], + "subtitle": "subtitles.entity.axolotl.hurt" + }, + "entity.axolotl.idle_air": { + "sounds": [ + "mob/axolotl/idle_air1", + "mob/axolotl/idle_air2", + { + "name": "mob/axolotl/idle_air3", + "pitch": 1.2, + "volume": 0.8 + }, + "mob/axolotl/idle_air4", + "mob/axolotl/idle_air5" + ], + "subtitle": "subtitles.entity.axolotl.idle_air" + }, + "entity.axolotl.idle_water": { + "sounds": [ + "mob/axolotl/idle1", + "mob/axolotl/idle2", + "mob/axolotl/idle3", + "mob/axolotl/idle4", + "mob/axolotl/idle5" + ], + "subtitle": "subtitles.entity.axolotl.idle_water" + }, + "entity.axolotl.splash": { + "sounds": [ + { + "name": "mob/dolphin/splash1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "mob/dolphin/splash2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "mob/dolphin/splash3", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.axolotl.splash" + }, + "entity.axolotl.swim": { + "sounds": [ + "entity/fish/swim5", + "entity/fish/swim6", + "entity/fish/swim7", + "mob/dolphin/swim1", + "mob/dolphin/swim2", + "mob/dolphin/swim3", + "mob/dolphin/swim4" + ], + "subtitle": "subtitles.entity.axolotl.swim" + }, + "entity.bat.ambient": { + "sounds": [ + "mob/bat/idle1", + "mob/bat/idle2", + "mob/bat/idle3", + "mob/bat/idle4" + ], + "subtitle": "subtitles.entity.bat.ambient" + }, + "entity.bat.death": { + "sounds": [ + "mob/bat/death" + ], + "subtitle": "subtitles.entity.bat.death" + }, + "entity.bat.hurt": { + "sounds": [ + "mob/bat/hurt1", + "mob/bat/hurt2", + "mob/bat/hurt3", + "mob/bat/hurt4" + ], + "subtitle": "subtitles.entity.bat.hurt" + }, + "entity.bat.loop": { + "sounds": [ + "mob/bat/loop" + ] + }, + "entity.bat.takeoff": { + "sounds": [ + "mob/bat/takeoff" + ], + "subtitle": "subtitles.entity.bat.takeoff" + }, + "entity.bee.death": { + "sounds": [ + "mob/bee/death1", + "mob/bee/death2" + ], + "subtitle": "subtitles.entity.bee.death" + }, + "entity.bee.hurt": { + "sounds": [ + "mob/bee/hurt1", + { + "name": "mob/bee/hurt1", + "pitch": 1.2 + }, + "mob/bee/hurt2", + { + "name": "mob/bee/hurt2", + "pitch": 1.2 + }, + "mob/bee/hurt3", + { + "name": "mob/bee/hurt3", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.entity.bee.hurt" + }, + "entity.bee.loop": { + "sounds": [ + { + "attenuation_distance": 6, + "name": "mob/bee/loop1", + "volume": 0.6 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop2", + "volume": 0.6 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop3", + "volume": 0.65 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop4", + "volume": 0.65 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop5", + "volume": 0.7 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop5", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.bee.loop" + }, + "entity.bee.loop_aggressive": { + "sounds": [ + { + "attenuation_distance": 10, + "name": "mob/bee/aggressive1", + "volume": 0.8 + }, + { + "attenuation_distance": 10, + "name": "mob/bee/aggressive2", + "volume": 0.8 + }, + { + "attenuation_distance": 10, + "name": "mob/bee/aggressive3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.bee.loop_aggressive" + }, + "entity.bee.pollinate": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate1", + "volume": 0.8 + }, + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate2", + "volume": 0.8 + }, + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate3", + "volume": 0.8 + }, + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.bee.pollinate" + }, + "entity.bee.sting": { + "sounds": [ + "mob/bee/sting", + { + "name": "mob/bee/sting", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.bee.sting" + }, + "entity.blaze.ambient": { + "sounds": [ + "mob/blaze/breathe1", + "mob/blaze/breathe2", + "mob/blaze/breathe3", + "mob/blaze/breathe4" + ], + "subtitle": "subtitles.entity.blaze.ambient" + }, + "entity.blaze.burn": { + "sounds": [ + "fire/fire" + ], + "subtitle": "subtitles.entity.blaze.burn" + }, + "entity.blaze.death": { + "sounds": [ + "mob/blaze/death" + ], + "subtitle": "subtitles.entity.blaze.death" + }, + "entity.blaze.hurt": { + "sounds": [ + "mob/blaze/hit1", + "mob/blaze/hit2", + "mob/blaze/hit3", + "mob/blaze/hit4" + ], + "subtitle": "subtitles.entity.blaze.hurt" + }, + "entity.blaze.shoot": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.entity.blaze.shoot" + }, + "entity.boat.paddle_land": { + "sounds": [ + "entity/boat/paddle_land1", + "entity/boat/paddle_land2", + "entity/boat/paddle_land3", + "entity/boat/paddle_land4", + "entity/boat/paddle_land5", + "entity/boat/paddle_land6" + ], + "subtitle": "subtitles.entity.boat.paddle_land" + }, + "entity.boat.paddle_water": { + "sounds": [ + { + "name": "entity/boat/paddle_water1", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water2", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water3", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water4", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water5", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water6", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water7", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water8", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.boat.paddle_water" + }, + "entity.bogged.ambient": { + "sounds": [ + "mob/bogged/ambient1", + "mob/bogged/ambient2", + "mob/bogged/ambient3", + "mob/bogged/ambient4" + ], + "subtitle": "subtitles.entity.bogged.ambient" + }, + "entity.bogged.death": { + "sounds": [ + "mob/bogged/death" + ], + "subtitle": "subtitles.entity.bogged.death" + }, + "entity.bogged.hurt": { + "sounds": [ + "mob/bogged/hurt1", + "mob/bogged/hurt2", + "mob/bogged/hurt3", + "mob/bogged/hurt4" + ], + "subtitle": "subtitles.entity.bogged.hurt" + }, + "entity.bogged.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.bogged.step": { + "sounds": [ + "mob/bogged/step1", + "mob/bogged/step2", + "mob/bogged/step3", + "mob/bogged/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.breeze.charge": { + "sounds": [ + "mob/breeze/charge1", + "mob/breeze/charge2", + "mob/breeze/charge3" + ], + "subtitle": "subtitles.entity.breeze.charge" + }, + "entity.breeze.death": { + "sounds": [ + "mob/breeze/death1", + "mob/breeze/death2" + ], + "subtitle": "subtitles.entity.breeze.death" + }, + "entity.breeze.deflect": { + "sounds": [ + "mob/breeze/deflect1", + "mob/breeze/deflect2", + "mob/breeze/deflect3" + ], + "subtitle": "subtitles.entity.breeze.deflect" + }, + "entity.breeze.hurt": { + "sounds": [ + "mob/breeze/hurt1", + "mob/breeze/hurt2", + "mob/breeze/hurt3" + ], + "subtitle": "subtitles.entity.breeze.hurt" + }, + "entity.breeze.idle_air": { + "sounds": [ + "mob/breeze/idle_air1", + "mob/breeze/idle_air2", + "mob/breeze/idle_air3", + "mob/breeze/idle_air4" + ], + "subtitle": "subtitles.entity.breeze.idle_air" + }, + "entity.breeze.idle_ground": { + "sounds": [ + "mob/breeze/idle1", + "mob/breeze/idle2", + "mob/breeze/idle3", + "mob/breeze/idle4" + ], + "subtitle": "subtitles.entity.breeze.idle_ground" + }, + "entity.breeze.inhale": { + "sounds": [ + "mob/breeze/inhale1", + { + "name": "mob/breeze/inhale1", + "pitch": 1.1 + }, + "mob/breeze/inhale2", + { + "name": "mob/breeze/inhale2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.entity.breeze.inhale" + }, + "entity.breeze.jump": { + "sounds": [ + "mob/breeze/jump1", + "mob/breeze/jump2" + ], + "subtitle": "subtitles.entity.breeze.jump" + }, + "entity.breeze.land": { + "sounds": [ + "mob/breeze/land1", + "mob/breeze/land2" + ], + "subtitle": "subtitles.entity.breeze.land" + }, + "entity.breeze.shoot": { + "sounds": [ + "mob/breeze/shoot", + { + "name": "mob/breeze/shoot", + "pitch": 1.1 + }, + { + "name": "mob/breeze/shoot", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.entity.breeze.shoot" + }, + "entity.breeze.slide": { + "sounds": [ + "mob/breeze/slide1", + "mob/breeze/slide2", + "mob/breeze/slide3", + "mob/breeze/slide4" + ], + "subtitle": "subtitles.entity.breeze.slide" + }, + "entity.breeze.whirl": { + "sounds": [ + "mob/breeze/whirl" + ], + "subtitle": "subtitles.entity.breeze.whirl" + }, + "entity.breeze.wind_burst": { + "sounds": [ + { + "name": "mob/breeze/wind_burst1", + "pitch": 1.2 + }, + { + "name": "mob/breeze/wind_burst2", + "pitch": 1.2 + }, + { + "name": "mob/breeze/wind_burst3", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.entity.breeze.wind_burst" + }, + "entity.camel.ambient": { + "sounds": [ + { + "name": "mob/camel/ambient1", + "volume": 0.45 + }, + { + "name": "mob/camel/ambient2", + "volume": 0.45 + }, + { + "name": "mob/camel/ambient3", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient4", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient5", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient6", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient7", + "volume": 0.3 + }, + { + "name": "mob/camel/ambient8", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.camel.ambient" + }, + "entity.camel.dash": { + "sounds": [ + "mob/camel/dash1", + "mob/camel/dash2", + "mob/camel/dash3", + "mob/camel/dash4", + "mob/camel/dash5", + "mob/camel/dash6" + ], + "subtitle": "subtitles.entity.camel.dash" + }, + "entity.camel.dash_ready": { + "sounds": [ + { + "name": "mob/camel/dash_ready1", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.camel.dash_ready" + }, + "entity.camel.death": { + "sounds": [ + "mob/camel/death1", + "mob/camel/death2" + ], + "subtitle": "subtitles.entity.camel.death" + }, + "entity.camel.eat": { + "sounds": [ + { + "name": "mob/camel/eat1", + "volume": 0.2 + }, + { + "name": "mob/camel/eat2", + "volume": 0.2 + }, + { + "name": "mob/camel/eat3", + "volume": 0.2 + }, + { + "name": "mob/camel/eat4", + "volume": 0.2 + }, + { + "name": "mob/camel/eat5", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.camel.eat" + }, + "entity.camel.hurt": { + "sounds": [ + "mob/camel/hurt1", + "mob/camel/hurt2", + "mob/camel/hurt3", + "mob/camel/hurt4" + ], + "subtitle": "subtitles.entity.camel.hurt" + }, + "entity.camel.saddle": { + "sounds": [ + { + "name": "entity.horse.saddle", + "pitch": 0.8, + "type": "event" + } + ], + "subtitle": "subtitles.entity.camel.saddle" + }, + "entity.camel.sit": { + "sounds": [ + { + "name": "mob/camel/sit1", + "volume": 0.3 + }, + { + "name": "mob/camel/sit2", + "volume": 0.3 + }, + { + "name": "mob/camel/sit3", + "volume": 0.3 + }, + { + "name": "mob/camel/sit4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.camel.sit" + }, + "entity.camel.stand": { + "sounds": [ + { + "name": "mob/camel/stand1", + "volume": 0.3 + }, + { + "name": "mob/camel/stand2", + "volume": 0.3 + }, + { + "name": "mob/camel/stand3", + "volume": 0.3 + }, + { + "name": "mob/camel/stand4", + "volume": 0.3 + }, + { + "name": "mob/camel/stand5", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.camel.stand" + }, + "entity.camel.step": { + "sounds": [ + { + "name": "mob/camel/step1", + "volume": 0.5 + }, + { + "name": "mob/camel/step2", + "volume": 0.5 + }, + { + "name": "mob/camel/step3", + "volume": 0.5 + }, + { + "name": "mob/camel/step4", + "volume": 0.5 + }, + { + "name": "mob/camel/step5", + "volume": 0.5 + }, + { + "name": "mob/camel/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.camel.step_sand": { + "sounds": [ + { + "name": "mob/camel/step_sand1", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand2", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand3", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand4", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand5", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand6", + "volume": 0.45 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.cat.ambient": { + "sounds": [ + { + "name": "mob/cat/meow1", + "volume": 0.6 + }, + { + "name": "mob/cat/meow2", + "volume": 0.5 + }, + { + "name": "mob/cat/meow3", + "volume": 0.6 + }, + { + "name": "mob/cat/meow4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.cat.beg_for_food": { + "sounds": [ + { + "name": "mob/cat/beg1", + "volume": 0.7 + }, + { + "name": "mob/cat/beg2", + "volume": 0.7 + }, + { + "name": "mob/cat/beg3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.cat.beg_for_food" + }, + "entity.cat.death": { + "sounds": [ + { + "name": "mob/cat/hitt1", + "pitch": 0.9, + "volume": 0.75 + }, + { + "name": "mob/cat/hitt2", + "pitch": 0.9, + "volume": 0.75 + }, + { + "name": "mob/cat/hitt3", + "pitch": 0.9, + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.cat.death" + }, + "entity.cat.eat": { + "sounds": [ + "mob/cat/eat1", + "mob/cat/eat2" + ], + "subtitle": "subtitles.entity.cat.eat" + }, + "entity.cat.hiss": { + "sounds": [ + { + "name": "mob/cat/hiss1", + "volume": 0.4 + }, + { + "name": "mob/cat/hiss2", + "volume": 0.4 + }, + { + "name": "mob/cat/hiss3", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.cat.hiss" + }, + "entity.cat.hurt": { + "sounds": [ + { + "name": "mob/cat/hitt1", + "volume": 0.65 + }, + { + "name": "mob/cat/hitt2", + "volume": 0.65 + }, + { + "name": "mob/cat/hitt3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.cat.hurt" + }, + "entity.cat.purr": { + "sounds": [ + { + "name": "mob/cat/purr1", + "volume": 0.7 + }, + { + "name": "mob/cat/purr2", + "volume": 0.7 + }, + { + "name": "mob/cat/purr3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.cat.purr" + }, + "entity.cat.purreow": { + "sounds": [ + { + "name": "mob/cat/purreow1", + "volume": 0.5 + }, + { + "name": "mob/cat/purreow2", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.cat.stray_ambient": { + "sounds": [ + { + "name": "mob/cat/stray/idle1", + "volume": 0.35 + }, + { + "name": "mob/cat/stray/idle2", + "volume": 0.35 + }, + { + "name": "mob/cat/stray/idle3", + "volume": 0.35 + }, + { + "name": "mob/cat/stray/idle4", + "volume": 0.35 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.chicken.ambient": { + "sounds": [ + "mob/chicken/say1", + "mob/chicken/say2", + "mob/chicken/say3" + ], + "subtitle": "subtitles.entity.chicken.ambient" + }, + "entity.chicken.death": { + "sounds": [ + "mob/chicken/hurt1", + "mob/chicken/hurt2" + ], + "subtitle": "subtitles.entity.chicken.death" + }, + "entity.chicken.egg": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.chicken.egg" + }, + "entity.chicken.hurt": { + "sounds": [ + "mob/chicken/hurt1", + "mob/chicken/hurt2" + ], + "subtitle": "subtitles.entity.chicken.hurt" + }, + "entity.chicken.step": { + "sounds": [ + "mob/chicken/step1", + "mob/chicken/step2" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.cod.ambient": { + "sounds": [] + }, + "entity.cod.death": { + "sounds": [ + "entity/fish/hurt1", + "entity/fish/hurt2", + "entity/fish/hurt3", + "entity/fish/hurt4" + ], + "subtitle": "subtitles.entity.cod.death" + }, + "entity.cod.flop": { + "sounds": [ + { + "name": "entity/fish/flop1", + "volume": 0.3 + }, + { + "name": "entity/fish/flop2", + "volume": 0.3 + }, + { + "name": "entity/fish/flop3", + "volume": 0.3 + }, + { + "name": "entity/fish/flop4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.cod.flop" + }, + "entity.cod.hurt": { + "sounds": [ + "entity/fish/hurt1", + "entity/fish/hurt2", + "entity/fish/hurt3", + "entity/fish/hurt4" + ], + "subtitle": "subtitles.entity.cod.hurt" + }, + "entity.cow.ambient": { + "sounds": [ + "mob/cow/say1", + "mob/cow/say2", + "mob/cow/say3", + "mob/cow/say4" + ], + "subtitle": "subtitles.entity.cow.ambient" + }, + "entity.cow.death": { + "sounds": [ + "mob/cow/hurt1", + "mob/cow/hurt2", + "mob/cow/hurt3" + ], + "subtitle": "subtitles.entity.cow.death" + }, + "entity.cow.hurt": { + "sounds": [ + "mob/cow/hurt1", + "mob/cow/hurt2", + "mob/cow/hurt3" + ], + "subtitle": "subtitles.entity.cow.hurt" + }, + "entity.cow.milk": { + "sounds": [ + "entity/cow/milk1", + "entity/cow/milk2", + "entity/cow/milk3" + ], + "subtitle": "subtitles.entity.cow.milk" + }, + "entity.cow.step": { + "sounds": [ + "mob/cow/step1", + "mob/cow/step2", + "mob/cow/step3", + "mob/cow/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.creaking.activate": { + "sounds": [ + "mob/creaking/creaking_activate" + ], + "subtitle": "subtitles.entity.creaking.activate" + }, + "entity.creaking.ambient": { + "sounds": [ + "mob/creaking/creaking_idle1", + "mob/creaking/creaking_idle2", + "mob/creaking/creaking_idle3", + "mob/creaking/creaking_idle4", + "mob/creaking/creaking_idle5", + "mob/creaking/creaking_idle6" + ], + "subtitle": "subtitles.entity.creaking.ambient" + }, + "entity.creaking.attack": { + "sounds": [ + "mob/creaking/creaking_attack1", + "mob/creaking/creaking_attack2", + "mob/creaking/creaking_attack3", + "mob/creaking/creaking_attack4" + ], + "subtitle": "subtitles.entity.creaking.attack" + }, + "entity.creaking.deactivate": { + "sounds": [ + "mob/creaking/creaking_deactivate" + ], + "subtitle": "subtitles.entity.creaking.deactivate" + }, + "entity.creaking.death": { + "sounds": [ + "mob/creaking/creaking_death" + ], + "subtitle": "subtitles.entity.creaking.death" + }, + "entity.creaking.freeze": { + "sounds": [ + "mob/creaking/creaking_freeze1", + "mob/creaking/creaking_freeze2", + "mob/creaking/creaking_freeze3", + "mob/creaking/creaking_freeze4" + ], + "subtitle": "subtitles.entity.creaking.freeze" + }, + "entity.creaking.spawn": { + "sounds": [ + "mob/creaking/creaking_spawn" + ], + "subtitle": "subtitles.entity.creaking.spawn" + }, + "entity.creaking.step": { + "sounds": [ + "mob/creaking/creaking_step1", + "mob/creaking/creaking_step2", + "mob/creaking/creaking_step3", + "mob/creaking/creaking_step4", + "mob/creaking/creaking_step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.creaking.sway": { + "sounds": [ + "mob/creaking/creaking_sway1", + "mob/creaking/creaking_sway2", + "mob/creaking/creaking_sway3", + "mob/creaking/creaking_sway4" + ], + "subtitle": "subtitles.entity.creaking.sway" + }, + "entity.creaking.twitch": { + "sounds": [ + "mob/creaking/creaking_twitch" + ], + "subtitle": "subtitles.entity.creaking.twitch" + }, + "entity.creaking.unfreeze": { + "sounds": [ + "mob/creaking/creaking_unfreeze1", + "mob/creaking/creaking_unfreeze2", + "mob/creaking/creaking_unfreeze3" + ], + "subtitle": "subtitles.entity.creaking.unfreeze" + }, + "entity.creeper.death": { + "sounds": [ + "mob/creeper/death" + ], + "subtitle": "subtitles.entity.creeper.death" + }, + "entity.creeper.hurt": { + "sounds": [ + "mob/creeper/say1", + "mob/creeper/say2", + "mob/creeper/say3", + "mob/creeper/say4" + ], + "subtitle": "subtitles.entity.creeper.hurt" + }, + "entity.creeper.primed": { + "sounds": [ + "random/fuse" + ], + "subtitle": "subtitles.entity.creeper.primed" + }, + "entity.dolphin.ambient": { + "sounds": [ + "mob/dolphin/blowhole1", + "mob/dolphin/blowhole2", + "mob/dolphin/idle1", + "mob/dolphin/idle2", + "mob/dolphin/idle3", + "mob/dolphin/idle4", + "mob/dolphin/idle5", + "mob/dolphin/idle6" + ], + "subtitle": "subtitles.entity.dolphin.ambient" + }, + "entity.dolphin.ambient_water": { + "sounds": [ + { + "name": "mob/dolphin/idle_water1", + "volume": 0.8 + }, + "mob/dolphin/idle_water2", + "mob/dolphin/idle_water3", + "mob/dolphin/idle_water4", + "mob/dolphin/idle_water5", + "mob/dolphin/idle_water6", + { + "name": "mob/dolphin/idle_water7", + "volume": 0.75 + }, + { + "name": "mob/dolphin/idle_water8", + "volume": 0.75 + }, + "mob/dolphin/idle_water9", + { + "name": "mob/dolphin/idle_water10", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.dolphin.ambient_water" + }, + "entity.dolphin.attack": { + "sounds": [ + "mob/dolphin/attack1", + "mob/dolphin/attack2", + "mob/dolphin/attack3" + ], + "subtitle": "subtitles.entity.dolphin.attack" + }, + "entity.dolphin.death": { + "sounds": [ + "mob/dolphin/death1", + "mob/dolphin/death2" + ], + "subtitle": "subtitles.entity.dolphin.death" + }, + "entity.dolphin.eat": { + "sounds": [ + { + "name": "mob/dolphin/eat1", + "volume": 0.75 + }, + { + "name": "mob/dolphin/eat2", + "volume": 0.75 + }, + { + "name": "mob/dolphin/eat3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.dolphin.eat" + }, + "entity.dolphin.hurt": { + "sounds": [ + "mob/dolphin/hurt1", + "mob/dolphin/hurt2", + "mob/dolphin/hurt3" + ], + "subtitle": "subtitles.entity.dolphin.hurt" + }, + "entity.dolphin.jump": { + "sounds": [ + { + "name": "mob/dolphin/jump1", + "volume": 0.75 + }, + { + "name": "mob/dolphin/jump2", + "volume": 0.75 + }, + { + "name": "mob/dolphin/jump3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.dolphin.jump" + }, + "entity.dolphin.play": { + "sounds": [ + "mob/dolphin/play1", + "mob/dolphin/play2" + ], + "subtitle": "subtitles.entity.dolphin.play" + }, + "entity.dolphin.splash": { + "sounds": [ + "mob/dolphin/splash1", + "mob/dolphin/splash2", + "mob/dolphin/splash3" + ], + "subtitle": "subtitles.entity.dolphin.splash" + }, + "entity.dolphin.swim": { + "sounds": [ + "entity/fish/swim5", + "entity/fish/swim6", + "entity/fish/swim7", + "mob/dolphin/swim1", + "mob/dolphin/swim2", + "mob/dolphin/swim3", + "mob/dolphin/swim4" + ], + "subtitle": "subtitles.entity.dolphin.swim" + }, + "entity.donkey.ambient": { + "sounds": [ + "mob/horse/donkey/idle1", + "mob/horse/donkey/idle2", + "mob/horse/donkey/idle3" + ], + "subtitle": "subtitles.entity.donkey.ambient" + }, + "entity.donkey.angry": { + "sounds": [ + "mob/horse/donkey/angry1", + "mob/horse/donkey/angry2" + ], + "subtitle": "subtitles.entity.donkey.angry" + }, + "entity.donkey.chest": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.donkey.chest" + }, + "entity.donkey.death": { + "sounds": [ + "mob/horse/donkey/death" + ], + "subtitle": "subtitles.entity.donkey.death" + }, + "entity.donkey.eat": { + "sounds": [ + "entity/horse/eat1", + "entity/horse/eat2", + "entity/horse/eat3", + "entity/horse/eat4", + "entity/horse/eat5" + ], + "subtitle": "subtitles.entity.donkey.eat" + }, + "entity.donkey.hurt": { + "sounds": [ + "mob/horse/donkey/hit1", + "mob/horse/donkey/hit2", + "mob/horse/donkey/hit3" + ], + "subtitle": "subtitles.entity.donkey.hurt" + }, + "entity.donkey.jump": { + "sounds": [ + "mob/horse/jump" + ], + "subtitle": "subtitles.entity.donkey.jump" + }, + "entity.dragon_fireball.explode": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.generic.explode" + }, + "entity.drowned.ambient": { + "sounds": [ + { + "name": "mob/drowned/idle1", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle2", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle3", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle4", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.ambient" + }, + "entity.drowned.ambient_water": { + "sounds": [ + { + "name": "mob/drowned/water/idle1", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/idle2", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/idle3", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/idle4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.ambient_water" + }, + "entity.drowned.death": { + "sounds": [ + { + "name": "mob/drowned/death1", + "volume": 0.9 + }, + { + "name": "mob/drowned/death2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.death" + }, + "entity.drowned.death_water": { + "sounds": [ + { + "name": "mob/drowned/water/death1", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/death2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.death" + }, + "entity.drowned.hurt": { + "sounds": [ + { + "name": "mob/drowned/hurt1", + "volume": 0.9 + }, + { + "name": "mob/drowned/hurt2", + "volume": 0.9 + }, + { + "name": "mob/drowned/hurt3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.hurt" + }, + "entity.drowned.hurt_water": { + "sounds": [ + { + "name": "mob/drowned/water/hurt1", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/hurt2", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/hurt3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.hurt" + }, + "entity.drowned.shoot": { + "sounds": [ + "item/trident/throw1", + "item/trident/throw2" + ], + "subtitle": "subtitles.entity.drowned.shoot" + }, + "entity.drowned.step": { + "sounds": [ + "mob/drowned/step1", + "mob/drowned/step2", + "mob/drowned/step3", + "mob/drowned/step4", + "mob/drowned/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.drowned.swim": { + "sounds": [ + "liquid/swim1", + "liquid/swim2", + "liquid/swim3", + "liquid/swim4", + "liquid/swim5" + ], + "subtitle": "subtitles.entity.drowned.swim" + }, + "entity.egg.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.egg.throw" + }, + "entity.elder_guardian.ambient": { + "sounds": [ + "mob/guardian/elder_idle1", + "mob/guardian/elder_idle2", + "mob/guardian/elder_idle3", + "mob/guardian/elder_idle4" + ], + "subtitle": "subtitles.entity.elder_guardian.ambient" + }, + "entity.elder_guardian.ambient_land": { + "sounds": [ + "mob/guardian/land_idle1", + "mob/guardian/land_idle2", + "mob/guardian/land_idle3", + "mob/guardian/land_idle4" + ], + "subtitle": "subtitles.entity.elder_guardian.ambient_land" + }, + "entity.elder_guardian.curse": { + "sounds": [ + "mob/guardian/curse" + ], + "subtitle": "subtitles.entity.elder_guardian.curse" + }, + "entity.elder_guardian.death": { + "sounds": [ + "mob/guardian/elder_death" + ], + "subtitle": "subtitles.entity.elder_guardian.death" + }, + "entity.elder_guardian.death_land": { + "sounds": [ + "mob/guardian/land_death" + ], + "subtitle": "subtitles.entity.elder_guardian.death" + }, + "entity.elder_guardian.flop": { + "sounds": [ + "mob/guardian/flop1", + "mob/guardian/flop2", + "mob/guardian/flop3", + "mob/guardian/flop4" + ], + "subtitle": "subtitles.entity.elder_guardian.flop" + }, + "entity.elder_guardian.hurt": { + "sounds": [ + "mob/guardian/elder_hit1", + "mob/guardian/elder_hit2", + "mob/guardian/elder_hit3", + "mob/guardian/elder_hit4" + ], + "subtitle": "subtitles.entity.elder_guardian.hurt" + }, + "entity.elder_guardian.hurt_land": { + "sounds": [ + "mob/guardian/land_hit1", + "mob/guardian/land_hit2", + "mob/guardian/land_hit3", + "mob/guardian/land_hit4" + ], + "subtitle": "subtitles.entity.elder_guardian.hurt" + }, + "entity.ender_dragon.ambient": { + "sounds": [ + "mob/enderdragon/growl1", + "mob/enderdragon/growl2", + "mob/enderdragon/growl3", + "mob/enderdragon/growl4" + ], + "subtitle": "subtitles.entity.ender_dragon.ambient" + }, + "entity.ender_dragon.death": { + "sounds": [ + "mob/enderdragon/end" + ], + "subtitle": "subtitles.entity.ender_dragon.death" + }, + "entity.ender_dragon.flap": { + "sounds": [ + "mob/enderdragon/wings1", + "mob/enderdragon/wings2", + "mob/enderdragon/wings3", + "mob/enderdragon/wings4", + "mob/enderdragon/wings5", + "mob/enderdragon/wings6" + ], + "subtitle": "subtitles.entity.ender_dragon.flap" + }, + "entity.ender_dragon.growl": { + "sounds": [ + "mob/enderdragon/growl1", + "mob/enderdragon/growl2", + "mob/enderdragon/growl3", + "mob/enderdragon/growl4" + ], + "subtitle": "subtitles.entity.ender_dragon.growl" + }, + "entity.ender_dragon.hurt": { + "sounds": [ + "mob/enderdragon/hit1", + "mob/enderdragon/hit2", + "mob/enderdragon/hit3", + "mob/enderdragon/hit4" + ], + "subtitle": "subtitles.entity.ender_dragon.hurt" + }, + "entity.ender_dragon.shoot": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.entity.ender_dragon.shoot" + }, + "entity.ender_eye.death": { + "sounds": [ + { + "name": "entity/endereye/dead1", + "volume": 1.3 + }, + { + "name": "entity/endereye/dead2", + "volume": 1.3 + } + ], + "subtitle": "subtitles.entity.ender_eye.death" + }, + "entity.ender_eye.launch": { + "sounds": [ + "entity/endereye/endereye_launch1", + "entity/endereye/endereye_launch2" + ], + "subtitle": "subtitles.entity.ender_eye.launch" + }, + "entity.ender_pearl.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.ender_pearl.throw" + }, + "entity.enderman.ambient": { + "sounds": [ + "mob/endermen/idle1", + "mob/endermen/idle2", + "mob/endermen/idle3", + "mob/endermen/idle4", + "mob/endermen/idle5" + ], + "subtitle": "subtitles.entity.enderman.ambient" + }, + "entity.enderman.death": { + "sounds": [ + "mob/endermen/death" + ], + "subtitle": "subtitles.entity.enderman.death" + }, + "entity.enderman.hurt": { + "sounds": [ + "mob/endermen/hit1", + "mob/endermen/hit2", + "mob/endermen/hit3", + "mob/endermen/hit4" + ], + "subtitle": "subtitles.entity.enderman.hurt" + }, + "entity.enderman.scream": { + "sounds": [ + "mob/endermen/scream1", + "mob/endermen/scream2", + "mob/endermen/scream3", + "mob/endermen/scream4" + ], + "subtitle": "subtitles.entity.enderman.scream" + }, + "entity.enderman.stare": { + "sounds": [ + "mob/endermen/stare" + ], + "subtitle": "subtitles.entity.enderman.stare" + }, + "entity.enderman.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.enderman.teleport" + }, + "entity.endermite.ambient": { + "sounds": [ + "mob/silverfish/say1", + "mob/silverfish/say2", + "mob/silverfish/say3", + "mob/silverfish/say4" + ], + "subtitle": "subtitles.entity.endermite.ambient" + }, + "entity.endermite.death": { + "sounds": [ + "mob/silverfish/kill" + ], + "subtitle": "subtitles.entity.endermite.death" + }, + "entity.endermite.hurt": { + "sounds": [ + "mob/silverfish/hit1", + "mob/silverfish/hit2", + "mob/silverfish/hit3" + ], + "subtitle": "subtitles.entity.endermite.hurt" + }, + "entity.endermite.step": { + "sounds": [ + "mob/silverfish/step1", + "mob/silverfish/step2", + "mob/silverfish/step3", + "mob/silverfish/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.evoker.ambient": { + "sounds": [ + "mob/evocation_illager/idle1", + "mob/evocation_illager/idle2", + "mob/evocation_illager/idle3", + "mob/evocation_illager/idle4" + ], + "subtitle": "subtitles.entity.evoker.ambient" + }, + "entity.evoker.cast_spell": { + "sounds": [ + "mob/evocation_illager/cast1", + "mob/evocation_illager/cast2" + ], + "subtitle": "subtitles.entity.evoker.cast_spell" + }, + "entity.evoker.celebrate": { + "sounds": [ + "mob/evocation_illager/celebrate", + "mob/evocation_illager/idle1", + "mob/evocation_illager/idle2" + ], + "subtitle": "subtitles.entity.evoker.celebrate" + }, + "entity.evoker.death": { + "sounds": [ + "mob/evocation_illager/death1", + "mob/evocation_illager/death2" + ], + "subtitle": "subtitles.entity.evoker.death" + }, + "entity.evoker.hurt": { + "sounds": [ + "mob/evocation_illager/hurt1", + "mob/evocation_illager/hurt2" + ], + "subtitle": "subtitles.entity.evoker.hurt" + }, + "entity.evoker.prepare_attack": { + "sounds": [ + "mob/evocation_illager/prepare_attack1", + "mob/evocation_illager/prepare_attack2" + ], + "subtitle": "subtitles.entity.evoker.prepare_attack" + }, + "entity.evoker.prepare_summon": { + "sounds": [ + "mob/evocation_illager/prepare_summon" + ], + "subtitle": "subtitles.entity.evoker.prepare_summon" + }, + "entity.evoker.prepare_wololo": { + "sounds": [ + "mob/evocation_illager/prepare_wololo" + ], + "subtitle": "subtitles.entity.evoker.prepare_wololo" + }, + "entity.evoker_fangs.attack": { + "sounds": [ + "mob/evocation_illager/fangs" + ], + "subtitle": "subtitles.entity.evoker_fangs.attack" + }, + "entity.experience_bottle.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.potion.throw" + }, + "entity.experience_orb.pickup": { + "sounds": [ + "random/orb" + ], + "subtitle": "subtitles.entity.experience_orb.pickup" + }, + "entity.firework_rocket.blast": { + "sounds": [ + "fireworks/blast1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.blast_far": { + "sounds": [ + "fireworks/blast_far1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.large_blast": { + "sounds": [ + "fireworks/largeblast1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.large_blast_far": { + "sounds": [ + "fireworks/largeblast_far1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.launch": { + "sounds": [ + "fireworks/launch1" + ], + "subtitle": "subtitles.entity.firework_rocket.launch" + }, + "entity.firework_rocket.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.firework_rocket.launch" + }, + "entity.firework_rocket.twinkle": { + "sounds": [ + "fireworks/twinkle1" + ], + "subtitle": "subtitles.entity.firework_rocket.twinkle" + }, + "entity.firework_rocket.twinkle_far": { + "sounds": [ + "fireworks/twinkle_far1" + ], + "subtitle": "subtitles.entity.firework_rocket.twinkle" + }, + "entity.fish.swim": { + "sounds": [ + "entity/fish/swim1", + "entity/fish/swim2", + "entity/fish/swim3", + "entity/fish/swim4", + "entity/fish/swim5", + "entity/fish/swim6", + "entity/fish/swim7" + ], + "subtitle": "subtitles.entity.fish.swim" + }, + "entity.fishing_bobber.retrieve": { + "sounds": [ + { + "name": "entity/bobber/retrieve1", + "pitch": 2.4 + }, + { + "name": "entity/bobber/retrieve2", + "pitch": 2.4 + } + ], + "subtitle": "subtitles.entity.fishing_bobber.retrieve" + }, + "entity.fishing_bobber.splash": { + "sounds": [ + "random/splash" + ], + "subtitle": "subtitles.entity.fishing_bobber.splash" + }, + "entity.fishing_bobber.throw": { + "sounds": [ + "entity/bobber/castfast" + ], + "subtitle": "subtitles.entity.fishing_bobber.throw" + }, + "entity.fox.aggro": { + "sounds": [ + { + "name": "mob/fox/aggro1", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro2", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro3", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro4", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro5", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro6", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro7", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.fox.aggro" + }, + "entity.fox.ambient": { + "sounds": [ + { + "name": "mob/fox/idle1", + "volume": 0.8 + }, + "mob/fox/idle2", + "mob/fox/idle3", + "mob/fox/idle4", + "mob/fox/idle5", + "mob/fox/idle6" + ], + "subtitle": "subtitles.entity.fox.ambient" + }, + "entity.fox.bite": { + "sounds": [ + { + "name": "mob/fox/bite1", + "pitch": 1.1, + "volume": 0.6 + }, + { + "name": "mob/fox/bite2", + "pitch": 1.1, + "volume": 0.6 + }, + { + "name": "mob/fox/bite3", + "pitch": 1.1, + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.fox.bite" + }, + "entity.fox.death": { + "sounds": [ + { + "name": "mob/fox/death1", + "volume": 0.9 + }, + { + "name": "mob/fox/death2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.fox.death" + }, + "entity.fox.eat": { + "sounds": [ + { + "name": "mob/fox/eat1", + "volume": 0.65 + }, + { + "name": "mob/fox/eat2", + "volume": 0.65 + }, + { + "name": "mob/fox/eat3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.fox.eat" + }, + "entity.fox.hurt": { + "sounds": [ + { + "name": "mob/fox/hurt1", + "volume": 0.75 + }, + { + "name": "mob/fox/hurt2", + "volume": 0.75 + }, + { + "name": "mob/fox/hurt3", + "volume": 0.75 + }, + { + "name": "mob/fox/hurt4", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.fox.hurt" + }, + "entity.fox.screech": { + "sounds": [ + { + "attenuation_distance": 32, + "name": "mob/fox/screech1", + "volume": 0.45 + }, + { + "attenuation_distance": 32, + "name": "mob/fox/screech2", + "volume": 0.45 + }, + { + "attenuation_distance": 32, + "name": "mob/fox/screech3", + "volume": 0.45 + }, + { + "attenuation_distance": 32, + "name": "mob/fox/screech4", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.fox.screech" + }, + "entity.fox.sleep": { + "sounds": [ + { + "name": "mob/fox/sleep1", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep2", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep3", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep4", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.fox.sleep" + }, + "entity.fox.sniff": { + "sounds": [ + { + "name": "mob/fox/sniff1", + "volume": 0.6 + }, + { + "name": "mob/fox/sniff2", + "volume": 0.6 + }, + { + "name": "mob/fox/sniff3", + "volume": 0.6 + }, + { + "name": "mob/fox/sniff4", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.fox.sniff" + }, + "entity.fox.spit": { + "sounds": [ + { + "name": "mob/fox/spit1", + "volume": 0.7 + }, + { + "name": "mob/fox/spit2", + "volume": 0.7 + }, + { + "name": "mob/fox/spit3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.fox.spit" + }, + "entity.fox.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.fox.teleport" + }, + "entity.frog.ambient": { + "sounds": [ + { + "name": "mob/frog/idle1", + "pitch": 0.95, + "volume": 0.8 + }, + { + "name": "mob/frog/idle2", + "pitch": 0.9 + }, + { + "name": "mob/frog/idle3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "mob/frog/idle4", + "pitch": 0.95, + "volume": 0.8 + }, + { + "name": "mob/frog/idle5", + "pitch": 0.9, + "volume": 0.85 + }, + { + "name": "mob/frog/idle6", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "mob/frog/idle7", + "pitch": 0.9, + "volume": 0.7 + }, + { + "name": "mob/frog/idle8", + "pitch": 0.9, + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.frog.ambient" + }, + "entity.frog.death": { + "sounds": [ + "mob/frog/death1", + "mob/frog/death2", + "mob/frog/death3" + ], + "subtitle": "subtitles.entity.frog.death" + }, + "entity.frog.eat": { + "sounds": [ + { + "name": "mob/frog/eat1", + "volume": 0.6 + }, + { + "name": "mob/frog/eat1", + "pitch": 0.9, + "volume": 0.6 + }, + { + "name": "mob/frog/eat2", + "volume": 0.6 + }, + { + "name": "mob/frog/eat2", + "pitch": 0.9, + "volume": 0.6 + }, + { + "name": "mob/frog/eat3", + "volume": 0.6 + }, + { + "name": "mob/frog/eat3", + "pitch": 0.9, + "volume": 0.6 + }, + { + "name": "mob/frog/eat4", + "volume": 0.6 + }, + { + "name": "mob/frog/eat4", + "pitch": 0.9, + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.frog.eat" + }, + "entity.frog.hurt": { + "sounds": [ + "mob/frog/hurt1", + "mob/frog/hurt2", + "mob/frog/hurt3", + "mob/frog/hurt4", + "mob/frog/hurt5" + ], + "subtitle": "subtitles.entity.frog.hurt" + }, + "entity.frog.lay_spawn": { + "sounds": [ + { + "name": "mob/frog/lay_spawn1", + "volume": 0.25 + }, + { + "name": "mob/frog/lay_spawn2", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.frog.lay_spawn" + }, + "entity.frog.long_jump": { + "sounds": [ + { + "name": "mob/frog/long_jump1", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump1", + "pitch": 0.8, + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump2", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump2", + "pitch": 0.8, + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump3", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump3", + "pitch": 0.8, + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump4", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump4", + "pitch": 0.8, + "volume": 0.12 + } + ], + "subtitle": "subtitles.entity.frog.long_jump" + }, + "entity.frog.step": { + "sounds": [ + "mob/frog/step1", + "mob/frog/step2", + "mob/frog/step3", + "mob/frog/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.frog.tongue": { + "sounds": [ + { + "name": "mob/frog/tongue1", + "volume": 0.5 + }, + { + "name": "mob/frog/tongue2", + "volume": 0.5 + }, + { + "name": "mob/frog/tongue3", + "volume": 0.5 + }, + { + "name": "mob/frog/tongue4", + "volume": 0.5 + } + ] + }, + "entity.generic.big_fall": { + "sounds": [ + "damage/fallbig" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.generic.burn": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.entity.generic.burn" + }, + "entity.generic.death": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.death" + }, + "entity.generic.drink": { + "sounds": [ + "random/drink" + ], + "subtitle": "subtitles.entity.generic.drink" + }, + "entity.generic.eat": { + "sounds": [ + "random/eat1", + "random/eat2", + "random/eat3" + ], + "subtitle": "subtitles.entity.generic.eat" + }, + "entity.generic.explode": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.generic.explode" + }, + "entity.generic.extinguish_fire": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.entity.generic.extinguish_fire" + }, + "entity.generic.hurt": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.hurt" + }, + "entity.generic.small_fall": { + "sounds": [ + "damage/fallsmall" + ], + "subtitle": "subtitles.entity.generic.small_fall" + }, + "entity.generic.splash": { + "sounds": [ + "liquid/splash", + "liquid/splash2" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.generic.swim": { + "sounds": [ + "liquid/swim1", + "liquid/swim2", + "liquid/swim3", + "liquid/swim4" + ], + "subtitle": "subtitles.entity.generic.swim" + }, + "entity.ghast.ambient": { + "sounds": [ + "mob/ghast/moan1", + "mob/ghast/moan2", + "mob/ghast/moan3", + "mob/ghast/moan4", + "mob/ghast/moan5", + "mob/ghast/moan6", + "mob/ghast/moan7" + ], + "subtitle": "subtitles.entity.ghast.ambient" + }, + "entity.ghast.death": { + "sounds": [ + "mob/ghast/death" + ], + "subtitle": "subtitles.entity.ghast.death" + }, + "entity.ghast.hurt": { + "sounds": [ + "mob/ghast/scream1", + "mob/ghast/scream2", + "mob/ghast/scream3", + "mob/ghast/scream4", + "mob/ghast/scream5" + ], + "subtitle": "subtitles.entity.ghast.hurt" + }, + "entity.ghast.scream": { + "sounds": [ + "mob/ghast/affectionate_scream" + ] + }, + "entity.ghast.shoot": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.entity.ghast.shoot" + }, + "entity.ghast.warn": { + "sounds": [ + "mob/ghast/charge" + ], + "subtitle": "subtitles.entity.ghast.shoot" + }, + "entity.glow_item_frame.add_item": { + "sounds": [ + "entity/itemframe/add_item1", + "entity/itemframe/add_item2", + "entity/itemframe/add_item3", + "entity/itemframe/add_item4" + ], + "subtitle": "subtitles.entity.glow_item_frame.add_item" + }, + "entity.glow_item_frame.break": { + "sounds": [ + "entity/itemframe/break1", + "entity/itemframe/break2", + "entity/itemframe/break3" + ], + "subtitle": "subtitles.entity.glow_item_frame.break" + }, + "entity.glow_item_frame.place": { + "sounds": [ + "entity/itemframe/place1", + "entity/itemframe/place2", + "entity/itemframe/place3", + "entity/itemframe/place4" + ], + "subtitle": "subtitles.entity.glow_item_frame.place" + }, + "entity.glow_item_frame.remove_item": { + "sounds": [ + "entity/itemframe/remove_item1", + "entity/itemframe/remove_item2", + "entity/itemframe/remove_item3", + "entity/itemframe/remove_item4" + ], + "subtitle": "subtitles.entity.glow_item_frame.remove_item" + }, + "entity.glow_item_frame.rotate_item": { + "sounds": [ + "entity/itemframe/rotate_item1", + "entity/itemframe/rotate_item2", + "entity/itemframe/rotate_item3", + "entity/itemframe/rotate_item4" + ], + "subtitle": "subtitles.entity.glow_item_frame.rotate_item" + }, + "entity.glow_squid.ambient": { + "sounds": [ + "entity/glow_squid/ambient1", + "entity/glow_squid/ambient2", + "entity/glow_squid/ambient3", + "entity/glow_squid/ambient4", + "entity/glow_squid/ambient5" + ], + "subtitle": "subtitles.entity.glow_squid.ambient" + }, + "entity.glow_squid.death": { + "sounds": [ + "entity/glow_squid/death1", + "entity/glow_squid/death2", + "entity/glow_squid/death3" + ], + "subtitle": "subtitles.entity.glow_squid.death" + }, + "entity.glow_squid.hurt": { + "sounds": [ + "entity/glow_squid/hurt1", + "entity/glow_squid/hurt2", + "entity/glow_squid/hurt3", + "entity/glow_squid/hurt4" + ], + "subtitle": "subtitles.entity.glow_squid.hurt" + }, + "entity.glow_squid.squirt": { + "sounds": [ + "entity/glow_squid/squirt1", + "entity/glow_squid/squirt2", + "entity/glow_squid/squirt3" + ], + "subtitle": "subtitles.entity.glow_squid.squirt" + }, + "entity.goat.ambient": { + "sounds": [ + { + "name": "mob/goat/idle1", + "volume": 0.82 + }, + { + "name": "mob/goat/idle2", + "volume": 0.82 + }, + { + "name": "mob/goat/idle3", + "volume": 0.84 + }, + { + "name": "mob/goat/idle4", + "volume": 0.84 + }, + { + "name": "mob/goat/idle5", + "volume": 0.84 + }, + { + "name": "mob/goat/idle6", + "volume": 0.84 + }, + { + "name": "mob/goat/idle7", + "volume": 0.83 + }, + { + "name": "mob/goat/idle8", + "volume": 0.84 + } + ], + "subtitle": "subtitles.entity.goat.ambient" + }, + "entity.goat.death": { + "sounds": [ + { + "name": "mob/goat/death1", + "volume": 0.65 + }, + { + "name": "mob/goat/death2", + "volume": 0.65 + }, + { + "name": "mob/goat/death3", + "volume": 0.65 + }, + { + "name": "mob/goat/death4", + "volume": 0.65 + }, + { + "name": "mob/goat/death5", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.death" + }, + "entity.goat.eat": { + "sounds": [ + "mob/goat/eat1", + "mob/goat/eat2", + "mob/goat/eat3" + ], + "subtitle": "subtitles.entity.goat.eat" + }, + "entity.goat.horn_break": { + "sounds": [ + { + "name": "mob/goat/horn_break1", + "volume": 0.9 + }, + { + "name": "mob/goat/horn_break2", + "volume": 0.9 + }, + { + "name": "mob/goat/horn_break3", + "volume": 0.9 + }, + { + "name": "mob/goat/horn_break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.goat.horn_break" + }, + "entity.goat.hurt": { + "sounds": [ + { + "name": "mob/goat/hurt1", + "volume": 0.65 + }, + { + "name": "mob/goat/hurt2", + "volume": 0.65 + }, + { + "name": "mob/goat/hurt3", + "volume": 0.65 + }, + { + "name": "mob/goat/hurt4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.hurt" + }, + "entity.goat.long_jump": { + "sounds": [ + { + "name": "mob/goat/jump1", + "volume": 0.8 + }, + { + "name": "mob/goat/jump1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.long_jump" + }, + "entity.goat.milk": { + "sounds": [ + "mob/mooshroom/milk1", + "mob/mooshroom/milk2", + "mob/mooshroom/milk3" + ], + "subtitle": "subtitles.entity.goat.milk" + }, + "entity.goat.prepare_ram": { + "sounds": [ + { + "name": "mob/goat/pre_ram1", + "volume": 0.8 + }, + { + "name": "mob/goat/pre_ram2", + "volume": 0.8 + }, + { + "name": "mob/goat/pre_ram3", + "volume": 0.8 + }, + { + "name": "mob/goat/pre_ram4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.prepare_ram" + }, + "entity.goat.ram_impact": { + "sounds": [ + { + "name": "mob/goat/impact1", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.ram_impact" + }, + "entity.goat.screaming.ambient": { + "sounds": [ + { + "name": "mob/goat/idle1", + "volume": 0.82 + }, + { + "name": "mob/goat/idle2", + "volume": 0.82 + }, + { + "name": "mob/goat/idle3", + "volume": 0.84 + }, + { + "name": "mob/goat/idle4", + "volume": 0.84 + }, + { + "name": "mob/goat/idle5", + "volume": 0.84 + }, + { + "name": "mob/goat/idle6", + "volume": 0.84 + }, + { + "name": "mob/goat/idle7", + "volume": 0.83 + }, + { + "name": "mob/goat/idle8", + "volume": 0.84 + }, + { + "name": "mob/goat/scream1", + "volume": 0.9 + }, + { + "name": "mob/goat/scream2", + "volume": 0.9 + }, + { + "name": "mob/goat/scream3", + "volume": 0.9 + }, + { + "name": "mob/goat/scream4", + "volume": 0.9 + }, + { + "name": "mob/goat/scream5", + "volume": 0.9 + }, + { + "name": "mob/goat/scream6", + "volume": 0.9 + }, + { + "name": "mob/goat/scream7", + "volume": 0.9 + }, + { + "name": "mob/goat/scream8", + "volume": 0.9 + }, + { + "name": "mob/goat/scream9", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.goat.screaming.ambient" + }, + "entity.goat.screaming.death": { + "sounds": [ + { + "name": "mob/goat/screaming_death1", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_death2", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_death3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.death" + }, + "entity.goat.screaming.eat": { + "sounds": [ + "mob/goat/eat1", + "mob/goat/eat2", + "mob/goat/eat3" + ], + "subtitle": "subtitles.entity.goat.eat" + }, + "entity.goat.screaming.hurt": { + "sounds": [ + { + "name": "mob/goat/screaming_hurt1", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_hurt2", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_hurt3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.hurt" + }, + "entity.goat.screaming.long_jump": { + "sounds": [ + { + "name": "mob/goat/jump1", + "volume": 0.8 + }, + { + "name": "mob/goat/jump1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.long_jump" + }, + "entity.goat.screaming.milk": { + "sounds": [ + "mob/goat/screaming_milk1", + "mob/goat/screaming_milk2", + "mob/goat/screaming_milk3", + "mob/goat/screaming_milk4", + "mob/goat/screaming_milk5" + ], + "subtitle": "subtitles.entity.goat.milk" + }, + "entity.goat.screaming.prepare_ram": { + "sounds": [ + { + "name": "mob/goat/screaming_pre_ram1", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram2", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram3", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram4", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.prepare_ram" + }, + "entity.goat.screaming.ram_impact": { + "sounds": [ + { + "name": "mob/goat/impact1", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.ram_impact" + }, + "entity.goat.step": { + "sounds": [ + "mob/goat/step1", + "mob/goat/step2", + "mob/goat/step3", + "mob/goat/step4", + "mob/goat/step5", + "mob/goat/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.guardian.ambient": { + "sounds": [ + { + "name": "entity/guardian/ambient1", + "volume": 0.1 + }, + { + "name": "entity/guardian/ambient2", + "volume": 0.1 + }, + { + "name": "entity/guardian/ambient3", + "volume": 0.1 + }, + { + "name": "entity/guardian/ambient4", + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.guardian.ambient" + }, + "entity.guardian.ambient_land": { + "sounds": [ + "mob/guardian/land_idle1", + "mob/guardian/land_idle2", + "mob/guardian/land_idle3", + "mob/guardian/land_idle4" + ], + "subtitle": "subtitles.entity.guardian.ambient_land" + }, + "entity.guardian.attack": { + "sounds": [ + "mob/guardian/attack_loop" + ], + "subtitle": "subtitles.entity.guardian.attack" + }, + "entity.guardian.death": { + "sounds": [ + "mob/guardian/guardian_death" + ], + "subtitle": "subtitles.entity.guardian.death" + }, + "entity.guardian.death_land": { + "sounds": [ + "mob/guardian/land_death" + ], + "subtitle": "subtitles.entity.guardian.death" + }, + "entity.guardian.flop": { + "sounds": [ + "mob/guardian/flop1", + "mob/guardian/flop2", + "mob/guardian/flop3", + "mob/guardian/flop4" + ], + "subtitle": "subtitles.entity.guardian.flop" + }, + "entity.guardian.hurt": { + "sounds": [ + "mob/guardian/guardian_hit1", + "mob/guardian/guardian_hit2", + "mob/guardian/guardian_hit3", + "mob/guardian/guardian_hit4" + ], + "subtitle": "subtitles.entity.guardian.hurt" + }, + "entity.guardian.hurt_land": { + "sounds": [ + "mob/guardian/land_hit1", + "mob/guardian/land_hit2", + "mob/guardian/land_hit3", + "mob/guardian/land_hit4" + ], + "subtitle": "subtitles.entity.guardian.hurt" + }, + "entity.hoglin.ambient": { + "sounds": [ + { + "name": "mob/hoglin/idle1", + "volume": 0.65 + }, + { + "name": "mob/hoglin/idle2", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle3", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle4", + "volume": 0.7 + }, + { + "name": "mob/hoglin/idle5", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle6", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle7", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle8", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle9", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle10", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle11", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.hoglin.ambient" + }, + "entity.hoglin.angry": { + "sounds": [ + "mob/hoglin/angry1", + "mob/hoglin/angry2", + "mob/hoglin/angry3", + "mob/hoglin/angry4", + "mob/hoglin/angry5", + "mob/hoglin/angry6" + ], + "subtitle": "subtitles.entity.hoglin.angry" + }, + "entity.hoglin.attack": { + "sounds": [ + { + "name": "mob/hoglin/attack1", + "volume": 0.8 + }, + { + "name": "mob/hoglin/attack1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/hoglin/attack2", + "volume": 0.8 + }, + { + "name": "mob/hoglin/attack2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.attack" + }, + "entity.hoglin.converted_to_zombified": { + "sounds": [ + { + "name": "mob/hoglin/converted1", + "volume": 0.8 + }, + { + "name": "mob/hoglin/converted2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.converted_to_zombified" + }, + "entity.hoglin.death": { + "sounds": [ + { + "name": "mob/hoglin/death1", + "volume": 0.9 + }, + { + "name": "mob/hoglin/death2", + "volume": 0.9 + }, + { + "name": "mob/hoglin/death3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.hoglin.death" + }, + "entity.hoglin.hurt": { + "sounds": [ + { + "name": "mob/hoglin/hurt1", + "volume": 0.8 + }, + { + "name": "mob/hoglin/hurt2", + "volume": 0.8 + }, + { + "name": "mob/hoglin/hurt3", + "volume": 0.8 + }, + { + "name": "mob/hoglin/hurt4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.hurt" + }, + "entity.hoglin.retreat": { + "sounds": [ + { + "name": "mob/hoglin/idle11", + "volume": 0.8 + }, + { + "name": "mob/hoglin/retreat1", + "volume": 0.7 + }, + { + "name": "mob/hoglin/retreat2", + "volume": 0.8 + }, + { + "name": "mob/hoglin/retreat3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.retreat" + }, + "entity.hoglin.step": { + "sounds": [ + "mob/hoglin/step1", + "mob/hoglin/step2", + "mob/hoglin/step3", + "mob/hoglin/step4", + "mob/hoglin/step5", + "mob/hoglin/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.horse.ambient": { + "sounds": [ + "mob/horse/idle1", + "mob/horse/idle2", + "mob/horse/idle3" + ], + "subtitle": "subtitles.entity.horse.ambient" + }, + "entity.horse.angry": { + "sounds": [ + "mob/horse/angry1" + ], + "subtitle": "subtitles.entity.horse.angry" + }, + "entity.horse.armor": { + "sounds": [ + { + "name": "mob/horse/armor", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.horse.armor" + }, + "entity.horse.breathe": { + "sounds": [ + "mob/horse/breathe1", + "mob/horse/breathe2", + "mob/horse/breathe3" + ], + "subtitle": "subtitles.entity.horse.breathe" + }, + "entity.horse.death": { + "sounds": [ + "mob/horse/death" + ], + "subtitle": "subtitles.entity.horse.death" + }, + "entity.horse.eat": { + "sounds": [ + "entity/horse/eat1", + "entity/horse/eat2", + "entity/horse/eat3", + "entity/horse/eat4", + "entity/horse/eat5" + ], + "subtitle": "subtitles.entity.horse.eat" + }, + "entity.horse.gallop": { + "sounds": [ + "mob/horse/gallop1", + "mob/horse/gallop2", + "mob/horse/gallop3", + "mob/horse/gallop4" + ], + "subtitle": "subtitles.entity.horse.gallop" + }, + "entity.horse.hurt": { + "sounds": [ + "mob/horse/hit1", + "mob/horse/hit2", + "mob/horse/hit3", + "mob/horse/hit4" + ], + "subtitle": "subtitles.entity.horse.hurt" + }, + "entity.horse.jump": { + "sounds": [ + "mob/horse/jump" + ], + "subtitle": "subtitles.entity.horse.jump" + }, + "entity.horse.land": { + "sounds": [ + "mob/horse/land" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.horse.saddle": { + "sounds": [ + "mob/horse/leather" + ], + "subtitle": "subtitles.entity.horse.saddle" + }, + "entity.horse.step": { + "sounds": [ + "mob/horse/soft1", + "mob/horse/soft2", + "mob/horse/soft3", + "mob/horse/soft4", + "mob/horse/soft5", + "mob/horse/soft6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.horse.step_wood": { + "sounds": [ + "mob/horse/wood1", + "mob/horse/wood2", + "mob/horse/wood3", + "mob/horse/wood4", + "mob/horse/wood5", + "mob/horse/wood6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.hostile.big_fall": { + "sounds": [ + "damage/fallbig" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.hostile.death": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.death" + }, + "entity.hostile.hurt": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.hurt" + }, + "entity.hostile.small_fall": { + "sounds": [ + "damage/fallsmall" + ], + "subtitle": "subtitles.entity.generic.small_fall" + }, + "entity.hostile.splash": { + "sounds": [ + "liquid/splash", + "liquid/splash2" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.hostile.swim": { + "sounds": [ + "liquid/swim1", + "liquid/swim2", + "liquid/swim3", + "liquid/swim4" + ], + "subtitle": "subtitles.entity.generic.swim" + }, + "entity.husk.ambient": { + "sounds": [ + "mob/husk/idle1", + "mob/husk/idle2", + "mob/husk/idle3" + ], + "subtitle": "subtitles.entity.husk.ambient" + }, + "entity.husk.converted_to_zombie": { + "sounds": [ + { + "name": "mob/husk/convert1", + "volume": 0.8 + }, + { + "name": "mob/husk/convert2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.husk.converted_to_zombie" + }, + "entity.husk.death": { + "sounds": [ + "mob/husk/death1", + "mob/husk/death2" + ], + "subtitle": "subtitles.entity.husk.death" + }, + "entity.husk.hurt": { + "sounds": [ + "mob/husk/hurt1", + "mob/husk/hurt2" + ], + "subtitle": "subtitles.entity.husk.hurt" + }, + "entity.husk.step": { + "sounds": [ + "mob/husk/step1", + "mob/husk/step2", + "mob/husk/step3", + "mob/husk/step4", + "mob/husk/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.illusioner.ambient": { + "sounds": [ + "mob/illusion_illager/idle1", + "mob/illusion_illager/idle2", + "mob/illusion_illager/idle3", + "mob/illusion_illager/idle4" + ], + "subtitle": "subtitles.entity.illusioner.ambient" + }, + "entity.illusioner.cast_spell": { + "sounds": [ + "mob/evocation_illager/cast1", + "mob/evocation_illager/cast2" + ], + "subtitle": "subtitles.entity.illusioner.cast_spell" + }, + "entity.illusioner.death": { + "sounds": [ + "mob/illusion_illager/death1", + "mob/illusion_illager/death2" + ], + "subtitle": "subtitles.entity.illusioner.death" + }, + "entity.illusioner.hurt": { + "sounds": [ + "mob/illusion_illager/hurt1", + "mob/illusion_illager/hurt2", + "mob/illusion_illager/hurt3" + ], + "subtitle": "subtitles.entity.illusioner.hurt" + }, + "entity.illusioner.mirror_move": { + "sounds": [ + "mob/illusion_illager/mirror_move1", + "mob/illusion_illager/mirror_move2" + ], + "subtitle": "subtitles.entity.illusioner.mirror_move" + }, + "entity.illusioner.prepare_blindness": { + "sounds": [ + "mob/illusion_illager/prepare_blind" + ], + "subtitle": "subtitles.entity.illusioner.prepare_blindness" + }, + "entity.illusioner.prepare_mirror": { + "sounds": [ + "mob/illusion_illager/prepare_mirror" + ], + "subtitle": "subtitles.entity.illusioner.prepare_mirror" + }, + "entity.iron_golem.attack": { + "sounds": [ + "mob/irongolem/throw" + ], + "subtitle": "subtitles.entity.iron_golem.attack" + }, + "entity.iron_golem.damage": { + "sounds": [ + { + "name": "mob/irongolem/damage1", + "volume": 0.8 + }, + { + "name": "mob/irongolem/damage1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/irongolem/damage2", + "volume": 0.8 + }, + { + "name": "mob/irongolem/damage2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.iron_golem.damage" + }, + "entity.iron_golem.death": { + "sounds": [ + "mob/irongolem/death" + ], + "subtitle": "subtitles.entity.iron_golem.death" + }, + "entity.iron_golem.hurt": { + "sounds": [ + "mob/irongolem/hit1", + "mob/irongolem/hit2", + "mob/irongolem/hit3", + "mob/irongolem/hit4" + ], + "subtitle": "subtitles.entity.iron_golem.hurt" + }, + "entity.iron_golem.repair": { + "sounds": [ + "mob/irongolem/repair" + ], + "subtitle": "subtitles.entity.iron_golem.repair" + }, + "entity.iron_golem.step": { + "sounds": [ + "mob/irongolem/walk1", + "mob/irongolem/walk2", + "mob/irongolem/walk3", + "mob/irongolem/walk4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.item.break": { + "sounds": [ + "random/break" + ], + "subtitle": "subtitles.entity.item.break" + }, + "entity.item.pickup": { + "sounds": [ + "random/pop" + ], + "subtitle": "subtitles.entity.item.pickup" + }, + "entity.item_frame.add_item": { + "sounds": [ + "entity/itemframe/add_item1", + "entity/itemframe/add_item2", + "entity/itemframe/add_item3", + "entity/itemframe/add_item4" + ], + "subtitle": "subtitles.entity.item_frame.add_item" + }, + "entity.item_frame.break": { + "sounds": [ + "entity/itemframe/break1", + "entity/itemframe/break2", + "entity/itemframe/break3" + ], + "subtitle": "subtitles.entity.item_frame.break" + }, + "entity.item_frame.place": { + "sounds": [ + "entity/itemframe/place1", + "entity/itemframe/place2", + "entity/itemframe/place3", + "entity/itemframe/place4" + ], + "subtitle": "subtitles.entity.item_frame.place" + }, + "entity.item_frame.remove_item": { + "sounds": [ + "entity/itemframe/remove_item1", + "entity/itemframe/remove_item2", + "entity/itemframe/remove_item3", + "entity/itemframe/remove_item4" + ], + "subtitle": "subtitles.entity.item_frame.remove_item" + }, + "entity.item_frame.rotate_item": { + "sounds": [ + "entity/itemframe/rotate_item1", + "entity/itemframe/rotate_item2", + "entity/itemframe/rotate_item3", + "entity/itemframe/rotate_item4" + ], + "subtitle": "subtitles.entity.item_frame.rotate_item" + }, + "entity.leash_knot.break": { + "sounds": [ + "entity/leashknot/break1", + "entity/leashknot/break2", + "entity/leashknot/break3" + ], + "subtitle": "subtitles.entity.leash_knot.break" + }, + "entity.leash_knot.place": { + "sounds": [ + "entity/leashknot/place1", + "entity/leashknot/place2", + "entity/leashknot/place3" + ], + "subtitle": "subtitles.entity.leash_knot.place" + }, + "entity.lightning_bolt.impact": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.lightning_bolt.impact" + }, + "entity.lightning_bolt.thunder": { + "sounds": [ + "ambient/weather/thunder1", + "ambient/weather/thunder2", + "ambient/weather/thunder3" + ], + "subtitle": "subtitles.entity.lightning_bolt.thunder" + }, + "entity.lingering_potion.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.potion.throw" + }, + "entity.llama.ambient": { + "sounds": [ + "mob/llama/idle1", + "mob/llama/idle2", + "mob/llama/idle3", + "mob/llama/idle4", + "mob/llama/idle5" + ], + "subtitle": "subtitles.entity.llama.ambient" + }, + "entity.llama.angry": { + "sounds": [ + "mob/llama/angry1" + ], + "subtitle": "subtitles.entity.llama.angry" + }, + "entity.llama.chest": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.llama.chest" + }, + "entity.llama.death": { + "sounds": [ + "mob/llama/death1", + "mob/llama/death2" + ], + "subtitle": "subtitles.entity.llama.death" + }, + "entity.llama.eat": { + "sounds": [ + "mob/llama/eat1", + "mob/llama/eat2", + "mob/llama/eat3" + ], + "subtitle": "subtitles.entity.llama.eat" + }, + "entity.llama.hurt": { + "sounds": [ + "mob/llama/hurt1", + "mob/llama/hurt2", + "mob/llama/hurt3" + ], + "subtitle": "subtitles.entity.llama.hurt" + }, + "entity.llama.spit": { + "sounds": [ + "mob/llama/spit1", + "mob/llama/spit2" + ], + "subtitle": "subtitles.entity.llama.spit" + }, + "entity.llama.step": { + "sounds": [ + "mob/llama/step1", + "mob/llama/step2", + "mob/llama/step3", + "mob/llama/step4", + "mob/llama/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.llama.swag": { + "sounds": [ + "mob/llama/swag" + ], + "subtitle": "subtitles.entity.llama.swag" + }, + "entity.magma_cube.death": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.magma_cube.death" + }, + "entity.magma_cube.death_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.magma_cube.death" + }, + "entity.magma_cube.hurt": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.magma_cube.hurt" + }, + "entity.magma_cube.hurt_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.magma_cube.hurt" + }, + "entity.magma_cube.jump": { + "sounds": [ + "mob/magmacube/jump1", + "mob/magmacube/jump2", + "mob/magmacube/jump3", + "mob/magmacube/jump4" + ], + "subtitle": "subtitles.entity.magma_cube.squish" + }, + "entity.magma_cube.squish": { + "sounds": [ + "mob/magmacube/big1", + "mob/magmacube/big2", + "mob/magmacube/big3", + "mob/magmacube/big4" + ], + "subtitle": "subtitles.entity.magma_cube.squish" + }, + "entity.magma_cube.squish_small": { + "sounds": [ + "mob/magmacube/small1", + "mob/magmacube/small2", + "mob/magmacube/small3", + "mob/magmacube/small4", + "mob/magmacube/small5" + ], + "subtitle": "subtitles.entity.magma_cube.squish" + }, + "entity.minecart.inside": { + "sounds": [ + "minecart/inside" + ] + }, + "entity.minecart.inside.underwater": { + "sounds": [ + "minecart/inside_underwater1", + "minecart/inside_underwater2", + "minecart/inside_underwater3" + ] + }, + "entity.minecart.riding": { + "sounds": [ + "minecart/base" + ], + "subtitle": "subtitles.entity.minecart.riding" + }, + "entity.mooshroom.convert": { + "sounds": [ + { + "name": "mob/mooshroom/convert1", + "volume": 0.75 + }, + { + "name": "mob/mooshroom/convert2", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.mooshroom.convert" + }, + "entity.mooshroom.eat": { + "sounds": [ + "mob/mooshroom/eat1", + { + "name": "mob/mooshroom/eat1", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat1", + "pitch": 1.05 + }, + "mob/mooshroom/eat2", + { + "name": "mob/mooshroom/eat2", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat2", + "pitch": 1.05 + }, + "mob/mooshroom/eat3", + { + "name": "mob/mooshroom/eat3", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat3", + "pitch": 1.05 + }, + "mob/mooshroom/eat4", + { + "name": "mob/mooshroom/eat4", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat4", + "pitch": 1.05 + } + ], + "subtitle": "subtitles.entity.mooshroom.eat" + }, + "entity.mooshroom.milk": { + "sounds": [ + "mob/mooshroom/milk1", + { + "name": "mob/mooshroom/milk1", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk1", + "pitch": 1.1 + }, + "mob/mooshroom/milk2", + { + "name": "mob/mooshroom/milk2", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk2", + "pitch": 1.1 + }, + "mob/mooshroom/milk3", + { + "name": "mob/mooshroom/milk3", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.entity.mooshroom.milk" + }, + "entity.mooshroom.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.mooshroom.suspicious_milk": { + "sounds": [ + "mob/mooshroom/milk1", + { + "name": "mob/mooshroom/milk1", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk1", + "pitch": 1.1 + }, + "mob/mooshroom/milk2", + { + "name": "mob/mooshroom/milk2", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk2", + "pitch": 1.1 + }, + "mob/mooshroom/milk3", + { + "name": "mob/mooshroom/milk3", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.entity.mooshroom.suspicious_milk" + }, + "entity.mule.ambient": { + "sounds": [ + "mob/horse/donkey/idle1", + "mob/horse/donkey/idle2", + "mob/horse/donkey/idle3" + ], + "subtitle": "subtitles.entity.mule.ambient" + }, + "entity.mule.angry": { + "sounds": [ + "mob/horse/donkey/angry1", + "mob/horse/donkey/angry2" + ], + "subtitle": "subtitles.entity.mule.angry" + }, + "entity.mule.chest": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.mule.chest" + }, + "entity.mule.death": { + "sounds": [ + "mob/horse/donkey/death" + ], + "subtitle": "subtitles.entity.mule.death" + }, + "entity.mule.eat": { + "sounds": [ + "entity/horse/eat1", + "entity/horse/eat2", + "entity/horse/eat3", + "entity/horse/eat4", + "entity/horse/eat5" + ], + "subtitle": "subtitles.entity.mule.eat" + }, + "entity.mule.hurt": { + "sounds": [ + "mob/horse/donkey/hit1", + "mob/horse/donkey/hit2", + "mob/horse/donkey/hit3" + ], + "subtitle": "subtitles.entity.mule.hurt" + }, + "entity.mule.jump": { + "sounds": [ + "mob/horse/jump" + ], + "subtitle": "subtitles.entity.mule.jump" + }, + "entity.ocelot.ambient": { + "sounds": [ + { + "name": "mob/cat/ocelot/idle1", + "volume": 0.3 + }, + { + "name": "mob/cat/ocelot/idle2", + "volume": 0.3 + }, + { + "name": "mob/cat/ocelot/idle3", + "volume": 0.35 + }, + { + "name": "mob/cat/ocelot/idle4", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.ocelot.death": { + "sounds": [ + { + "name": "mob/cat/ocelot/death1", + "volume": 0.45 + }, + { + "name": "mob/cat/ocelot/death2", + "volume": 0.45 + }, + { + "name": "mob/cat/ocelot/death3", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.cat.death" + }, + "entity.ocelot.hurt": { + "sounds": [ + { + "name": "mob/cat/hitt1", + "volume": 0.45 + }, + { + "name": "mob/cat/hitt2", + "volume": 0.45 + }, + { + "name": "mob/cat/hitt3", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.cat.hurt" + }, + "entity.painting.break": { + "sounds": [ + "entity/painting/break1", + "entity/painting/break2", + "entity/painting/break3" + ], + "subtitle": "subtitles.entity.painting.break" + }, + "entity.painting.place": { + "sounds": [ + "entity/painting/place1", + "entity/painting/place2", + "entity/painting/place3", + "entity/painting/place4" + ], + "subtitle": "subtitles.entity.painting.place" + }, + "entity.panda.aggressive_ambient": { + "sounds": [ + "mob/panda/aggressive/aggressive1", + "mob/panda/aggressive/aggressive2", + "mob/panda/aggressive/aggressive3", + { + "name": "mob/panda/aggressive/aggressive4", + "volume": 0.8 + }, + "mob/panda/nosebreath2", + "mob/panda/nosebreath3", + "mob/panda/pant1", + "mob/panda/pant2" + ], + "subtitle": "subtitles.entity.panda.aggressive_ambient" + }, + "entity.panda.ambient": { + "sounds": [ + "mob/panda/idle1", + "mob/panda/idle2", + "mob/panda/idle3", + "mob/panda/idle4", + "mob/panda/nosebreath1", + "mob/panda/nosebreath2", + "mob/panda/nosebreath3", + "mob/panda/pant1", + "mob/panda/pant2" + ], + "subtitle": "subtitles.entity.panda.ambient" + }, + "entity.panda.bite": { + "sounds": [ + "mob/panda/bite1", + "mob/panda/bite2", + "mob/panda/bite3" + ], + "subtitle": "subtitles.entity.panda.bite" + }, + "entity.panda.cant_breed": { + "sounds": [ + "mob/panda/cant_breed1", + "mob/panda/cant_breed2", + "mob/panda/cant_breed3", + "mob/panda/cant_breed4", + "mob/panda/cant_breed5" + ], + "subtitle": "subtitles.entity.panda.cant_breed" + }, + "entity.panda.death": { + "sounds": [ + { + "name": "mob/panda/death1", + "volume": 0.82 + }, + { + "name": "mob/panda/death2", + "volume": 0.82 + }, + { + "name": "mob/panda/death3", + "volume": 0.82 + }, + { + "name": "mob/panda/death4", + "volume": 0.82 + } + ], + "subtitle": "subtitles.entity.panda.death" + }, + "entity.panda.eat": { + "sounds": [ + "mob/panda/eat1", + "mob/panda/eat2", + "mob/panda/eat3", + "mob/panda/eat4", + { + "name": "mob/panda/eat5", + "volume": 0.85 + }, + "mob/panda/eat6", + "mob/panda/eat7", + "mob/panda/eat8", + "mob/panda/eat9", + "mob/panda/eat10", + "mob/panda/eat11", + "mob/panda/eat12" + ], + "subtitle": "subtitles.entity.panda.eat" + }, + "entity.panda.hurt": { + "sounds": [ + { + "name": "mob/panda/hurt1", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt2", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt3", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt4", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt5", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt6", + "volume": 0.82 + } + ], + "subtitle": "subtitles.entity.panda.hurt" + }, + "entity.panda.pre_sneeze": { + "sounds": [ + "mob/panda/pre_sneeze" + ], + "subtitle": "subtitles.entity.panda.pre_sneeze" + }, + "entity.panda.sneeze": { + "sounds": [ + "mob/panda/sneeze1", + "mob/panda/sneeze2", + "mob/panda/sneeze3" + ], + "subtitle": "subtitles.entity.panda.sneeze" + }, + "entity.panda.step": { + "sounds": [ + "mob/panda/step1", + "mob/panda/step2", + "mob/panda/step3", + "mob/panda/step4", + "mob/panda/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.panda.worried_ambient": { + "sounds": [ + "mob/panda/pant2", + "mob/panda/worried/worried2", + "mob/panda/worried/worried3", + "mob/panda/worried/worried4", + "mob/panda/worried/worried5", + "mob/panda/worried/worried6" + ], + "subtitle": "subtitles.entity.panda.worried_ambient" + }, + "entity.parrot.ambient": { + "sounds": [ + { + "name": "mob/parrot/idle1", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle2", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle3", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle4", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle5", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle6", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.ambient" + }, + "entity.parrot.death": { + "sounds": [ + { + "name": "mob/parrot/death1", + "pitch": 0.9 + }, + { + "name": "mob/parrot/death2", + "pitch": 0.9 + }, + { + "name": "mob/parrot/death3", + "pitch": 0.9 + }, + { + "name": "mob/parrot/death4", + "pitch": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.death" + }, + "entity.parrot.eat": { + "sounds": [ + "mob/parrot/eat1", + "mob/parrot/eat2", + "mob/parrot/eat3" + ], + "subtitle": "subtitles.entity.parrot.eats" + }, + "entity.parrot.fly": { + "sounds": [ + "mob/parrot/fly1", + "mob/parrot/fly2", + "mob/parrot/fly3", + "mob/parrot/fly4", + "mob/parrot/fly5", + "mob/parrot/fly6", + "mob/parrot/fly7", + "mob/parrot/fly8" + ], + "subtitle": "subtitles.entity.parrot.fly" + }, + "entity.parrot.hurt": { + "sounds": [ + { + "name": "mob/parrot/hurt1", + "pitch": 0.8 + }, + { + "name": "mob/parrot/hurt1", + "pitch": 0.9 + }, + { + "name": "mob/parrot/hurt2", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.parrot.hurts" + }, + "entity.parrot.imitate.blaze": { + "sounds": [ + { + "name": "entity.blaze.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.blaze" + }, + "entity.parrot.imitate.bogged": { + "sounds": [ + { + "name": "entity.bogged.ambient", + "pitch": 1.7, + "type": "event" + } + ], + "subtitle": "subtitles.entity.parrot.imitate.bogged" + }, + "entity.parrot.imitate.breeze": { + "sounds": [ + { + "name": "entity.breeze.idle_ground", + "pitch": 1.7, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.breeze" + }, + "entity.parrot.imitate.creaking": { + "sounds": [ + "mob/creaking/parrot_imitate_creaking" + ], + "subtitle": "subtitles.entity.parrot.imitate.creaking" + }, + "entity.parrot.imitate.creeper": { + "sounds": [ + { + "name": "entity.creeper.primed", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.creeper" + }, + "entity.parrot.imitate.drowned": { + "sounds": [ + { + "name": "entity.drowned.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.drowned" + }, + "entity.parrot.imitate.elder_guardian": { + "sounds": [ + { + "name": "entity.elder_guardian.ambient_land", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.elder_guardian" + }, + "entity.parrot.imitate.ender_dragon": { + "sounds": [ + { + "name": "entity.ender_dragon.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.ender_dragon" + }, + "entity.parrot.imitate.endermite": { + "sounds": [ + { + "name": "entity.endermite.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.endermite" + }, + "entity.parrot.imitate.evoker": { + "sounds": [ + { + "name": "entity.evoker.cast_spell", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.evoker" + }, + "entity.parrot.imitate.ghast": { + "sounds": [ + { + "name": "entity.ghast.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.ghast" + }, + "entity.parrot.imitate.guardian": { + "sounds": [ + { + "name": "entity.guardian.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.guardian" + }, + "entity.parrot.imitate.hoglin": { + "sounds": [ + { + "name": "entity.hoglin.ambient", + "pitch": 1.9, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.hoglin" + }, + "entity.parrot.imitate.husk": { + "sounds": [ + { + "name": "entity.husk.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.husk" + }, + "entity.parrot.imitate.illusioner": { + "sounds": [ + { + "name": "entity.illusioner.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.illusioner" + }, + "entity.parrot.imitate.magma_cube": { + "sounds": [ + { + "name": "entity.magma_cube.squish", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.magma_cube" + }, + "entity.parrot.imitate.phantom": { + "sounds": [ + { + "name": "entity.phantom.ambient", + "pitch": 1.7, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.phantom" + }, + "entity.parrot.imitate.piglin": { + "sounds": [ + { + "name": "entity.piglin.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.piglin" + }, + "entity.parrot.imitate.piglin_brute": { + "sounds": [ + { + "name": "entity.piglin_brute.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.piglin_brute" + }, + "entity.parrot.imitate.pillager": { + "sounds": [ + { + "name": "entity.pillager.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.pillager" + }, + "entity.parrot.imitate.ravager": { + "sounds": [ + { + "name": "entity.ravager.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.ravager" + }, + "entity.parrot.imitate.shulker": { + "sounds": [ + { + "name": "entity.shulker.ambient", + "pitch": 1.7, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.shulker" + }, + "entity.parrot.imitate.silverfish": { + "sounds": [ + { + "name": "entity.silverfish.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.silverfish" + }, + "entity.parrot.imitate.skeleton": { + "sounds": [ + { + "name": "entity.skeleton.ambient", + "pitch": 1.7, + "type": "event" + } + ], + "subtitle": "subtitles.entity.parrot.imitate.skeleton" + }, + "entity.parrot.imitate.slime": { + "sounds": [ + { + "name": "entity.slime.squish", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.slime" + }, + "entity.parrot.imitate.spider": { + "sounds": [ + { + "name": "entity.spider.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.spider" + }, + "entity.parrot.imitate.stray": { + "sounds": [ + { + "name": "entity.stray.ambient", + "pitch": 1.6, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.stray" + }, + "entity.parrot.imitate.vex": { + "sounds": [ + { + "name": "entity.vex.ambient", + "pitch": 1.6, + "type": "event", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.vex" + }, + "entity.parrot.imitate.vindicator": { + "sounds": [ + { + "name": "entity.vindicator.ambient", + "pitch": 1.7, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.vindicator" + }, + "entity.parrot.imitate.warden": { + "sounds": [ + { + "name": "entity.warden.tendril_clicks", + "pitch": 2.0, + "type": "event", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.warden" + }, + "entity.parrot.imitate.witch": { + "sounds": [ + { + "name": "entity.witch.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.witch" + }, + "entity.parrot.imitate.wither": { + "sounds": [ + { + "name": "entity.wither.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.wither" + }, + "entity.parrot.imitate.wither_skeleton": { + "sounds": [ + { + "name": "entity.wither_skeleton.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.wither_skeleton" + }, + "entity.parrot.imitate.zoglin": { + "sounds": [ + { + "name": "entity.zoglin.ambient", + "pitch": 1.9, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.zoglin" + }, + "entity.parrot.imitate.zombie": { + "sounds": [ + { + "name": "entity.zombie.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.zombie" + }, + "entity.parrot.imitate.zombie_villager": { + "sounds": [ + { + "name": "entity.zombie_villager.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.zombie_villager" + }, + "entity.parrot.step": { + "sounds": [ + "mob/parrot/step1", + "mob/parrot/step2", + "mob/parrot/step3", + "mob/parrot/step4", + "mob/parrot/step5" + ] + }, + "entity.phantom.ambient": { + "sounds": [ + { + "name": "mob/phantom/idle1", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle2", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle3", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle4", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.phantom.ambient" + }, + "entity.phantom.bite": { + "sounds": [ + "mob/phantom/bite1", + "mob/phantom/bite2" + ], + "subtitle": "subtitles.entity.phantom.bite" + }, + "entity.phantom.death": { + "sounds": [ + "mob/phantom/death1", + "mob/phantom/death2", + "mob/phantom/death3" + ], + "subtitle": "subtitles.entity.phantom.death" + }, + "entity.phantom.flap": { + "sounds": [ + { + "name": "mob/phantom/flap1", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap2", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap3", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap4", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap5", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.phantom.flap" + }, + "entity.phantom.hurt": { + "sounds": [ + { + "name": "mob/phantom/hurt1", + "volume": 0.75 + }, + { + "name": "mob/phantom/hurt2", + "volume": 0.75 + }, + { + "name": "mob/phantom/hurt3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.phantom.hurt" + }, + "entity.phantom.swoop": { + "sounds": [ + { + "name": "mob/phantom/swoop1", + "volume": 0.7 + }, + { + "name": "mob/phantom/swoop2", + "volume": 0.7 + }, + { + "name": "mob/phantom/swoop3", + "volume": 0.7 + }, + { + "name": "mob/phantom/swoop4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.phantom.swoop" + }, + "entity.pig.ambient": { + "sounds": [ + "mob/pig/say1", + "mob/pig/say2", + "mob/pig/say3" + ], + "subtitle": "subtitles.entity.pig.ambient" + }, + "entity.pig.death": { + "sounds": [ + "mob/pig/death" + ], + "subtitle": "subtitles.entity.pig.death" + }, + "entity.pig.hurt": { + "sounds": [ + "mob/pig/say1", + "mob/pig/say2", + "mob/pig/say3" + ], + "subtitle": "subtitles.entity.pig.hurt" + }, + "entity.pig.saddle": { + "sounds": [ + "mob/horse/leather" + ], + "subtitle": "subtitles.entity.pig.saddle" + }, + "entity.pig.step": { + "sounds": [ + "mob/pig/step1", + "mob/pig/step2", + "mob/pig/step3", + "mob/pig/step4", + "mob/pig/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.piglin.admiring_item": { + "sounds": [ + { + "name": "mob/piglin/admire1", + "volume": 0.8 + }, + { + "name": "mob/piglin/admire2", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate2", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate4", + "volume": 0.85 + } + ], + "subtitle": "subtitles.entity.piglin.admiring_item" + }, + "entity.piglin.ambient": { + "sounds": [ + { + "name": "mob/piglin/idle1", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle2", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle3", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle4", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle5", + "volume": 0.66 + } + ], + "subtitle": "subtitles.entity.piglin.ambient" + }, + "entity.piglin.angry": { + "sounds": [ + { + "name": "mob/piglin/angry1", + "volume": 0.7 + }, + { + "name": "mob/piglin/angry2", + "volume": 0.7 + }, + { + "name": "mob/piglin/angry3", + "volume": 0.7 + }, + { + "name": "mob/piglin/angry4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.piglin.angry" + }, + "entity.piglin.celebrate": { + "sounds": [ + { + "name": "mob/piglin/celebrate1", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate2", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate3", + "volume": 0.75 + }, + { + "name": "mob/piglin/celebrate4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin.celebrate" + }, + "entity.piglin.converted_to_zombified": { + "sounds": [ + "mob/piglin/converted1", + "mob/piglin/converted2" + ], + "subtitle": "subtitles.entity.piglin.converted_to_zombified" + }, + "entity.piglin.death": { + "sounds": [ + { + "name": "mob/piglin/death1", + "volume": 0.7 + }, + { + "name": "mob/piglin/death2", + "volume": 0.7 + }, + { + "name": "mob/piglin/death3", + "volume": 0.8 + }, + { + "name": "mob/piglin/death4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin.death" + }, + "entity.piglin.hurt": { + "sounds": [ + { + "name": "mob/piglin/hurt1", + "volume": 0.7 + }, + { + "name": "mob/piglin/hurt2", + "volume": 0.7 + }, + { + "name": "mob/piglin/hurt3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.piglin.hurt" + }, + "entity.piglin.jealous": { + "sounds": [ + { + "name": "mob/piglin/jealous1", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous2", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous3", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous4", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin.jealous" + }, + "entity.piglin.retreat": { + "sounds": [ + { + "name": "mob/piglin/retreat1", + "volume": 0.65 + }, + { + "name": "mob/piglin/retreat2", + "volume": 0.65 + }, + { + "name": "mob/piglin/retreat3", + "volume": 0.65 + }, + { + "name": "mob/piglin/retreat4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.piglin.retreat" + }, + "entity.piglin.step": { + "sounds": [ + { + "name": "mob/piglin/step1", + "volume": 0.75 + }, + { + "name": "mob/piglin/step2", + "volume": 0.75 + }, + { + "name": "mob/piglin/step3", + "volume": 0.75 + }, + { + "name": "mob/piglin/step4", + "volume": 0.75 + }, + { + "name": "mob/piglin/step5", + "volume": 0.75 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.piglin_brute.ambient": { + "sounds": [ + { + "name": "mob/piglin_brute/idle1", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle2", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle3", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle4", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle5", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle6", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle7", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle8", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle9", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.piglin_brute.ambient" + }, + "entity.piglin_brute.angry": { + "sounds": [ + { + "name": "mob/piglin_brute/angry1", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry2", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry3", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry4", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.piglin_brute.angry" + }, + "entity.piglin_brute.converted_to_zombified": { + "sounds": [ + { + "name": "mob/piglin/converted1", + "pitch": 0.9 + }, + { + "name": "mob/piglin/converted2", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.piglin_brute.converted_to_zombified" + }, + "entity.piglin_brute.death": { + "sounds": [ + { + "name": "mob/piglin_brute/death1", + "volume": 0.8 + }, + { + "name": "mob/piglin_brute/death2", + "volume": 0.8 + }, + { + "name": "mob/piglin_brute/death3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin_brute.death" + }, + "entity.piglin_brute.hurt": { + "sounds": [ + { + "name": "mob/piglin_brute/hurt1", + "volume": 0.64 + }, + { + "name": "mob/piglin_brute/hurt2", + "volume": 0.64 + }, + { + "name": "mob/piglin_brute/hurt3", + "volume": 0.64 + }, + { + "name": "mob/piglin_brute/hurt4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.piglin_brute.hurt" + }, + "entity.piglin_brute.step": { + "sounds": [ + { + "name": "mob/piglin_brute/step1", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step2", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step3", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step4", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step5", + "volume": 0.75 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.pillager.ambient": { + "sounds": [ + "mob/pillager/idle1", + "mob/pillager/idle2", + "mob/pillager/idle3", + "mob/pillager/idle4" + ], + "subtitle": "subtitles.entity.pillager.ambient" + }, + "entity.pillager.celebrate": { + "sounds": [ + "mob/pillager/celebrate1", + "mob/pillager/celebrate2", + "mob/pillager/celebrate3", + "mob/pillager/celebrate4", + "mob/pillager/horn_celebrate" + ], + "subtitle": "subtitles.entity.pillager.celebrate" + }, + "entity.pillager.death": { + "sounds": [ + "mob/pillager/death1", + "mob/pillager/death2" + ], + "subtitle": "subtitles.entity.pillager.death" + }, + "entity.pillager.hurt": { + "sounds": [ + "mob/pillager/hurt1", + "mob/pillager/hurt2", + "mob/pillager/hurt3" + ], + "subtitle": "subtitles.entity.pillager.hurt" + }, + "entity.player.attack.crit": { + "sounds": [ + { + "name": "entity/player/attack/crit1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/crit2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/crit3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.crit" + }, + "entity.player.attack.knockback": { + "sounds": [ + { + "name": "entity/player/attack/knockback1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/knockback2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/knockback3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/knockback4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.knockback" + }, + "entity.player.attack.nodamage": { + "sounds": [ + { + "name": "entity/player/attack/weak1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.weak" + }, + "entity.player.attack.strong": { + "sounds": [ + { + "name": "entity/player/attack/strong1", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong2", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong3", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong4", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong5", + "volume": 0.7 + }, + { + "name": "entity/player/attack/strong6", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.strong" + }, + "entity.player.attack.sweep": { + "sounds": [ + { + "name": "entity/player/attack/sweep1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep4", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep5", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep6", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep7", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.sweep" + }, + "entity.player.attack.weak": { + "sounds": [ + { + "name": "entity/player/attack/weak1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.weak" + }, + "entity.player.big_fall": { + "sounds": [ + "damage/fallbig" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.player.breath": { + "sounds": [ + "random/breath" + ] + }, + "entity.player.burp": { + "sounds": [ + "random/burp" + ], + "subtitle": "subtitles.entity.player.burp" + }, + "entity.player.death": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.player.death" + }, + "entity.player.hurt": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.player.hurt" + }, + "entity.player.hurt_drown": { + "sounds": [ + "entity/player/hurt/drown1", + "entity/player/hurt/drown2", + "entity/player/hurt/drown3", + "entity/player/hurt/drown4" + ], + "subtitle": "subtitles.entity.player.hurt_drown" + }, + "entity.player.hurt_freeze": { + "sounds": [ + "entity/player/hurt/freeze_hurt1", + "entity/player/hurt/freeze_hurt2", + "entity/player/hurt/freeze_hurt3", + "entity/player/hurt/freeze_hurt4", + "entity/player/hurt/freeze_hurt5" + ], + "subtitle": "subtitles.entity.player.freeze_hurt" + }, + "entity.player.hurt_on_fire": { + "sounds": [ + "entity/player/hurt/fire_hurt1", + "entity/player/hurt/fire_hurt2", + "entity/player/hurt/fire_hurt3" + ], + "subtitle": "subtitles.entity.player.hurt_on_fire" + }, + "entity.player.hurt_sweet_berry_bush": { + "sounds": [ + "entity/player/hurt/berrybush_hurt1", + "entity/player/hurt/berrybush_hurt2" + ], + "subtitle": "subtitles.entity.player.hurt" + }, + "entity.player.levelup": { + "sounds": [ + "random/levelup" + ], + "subtitle": "subtitles.entity.player.levelup" + }, + "entity.player.small_fall": { + "sounds": [ + "damage/fallsmall" + ], + "subtitle": "subtitles.entity.generic.small_fall" + }, + "entity.player.splash": { + "sounds": [ + "liquid/splash", + "liquid/splash2" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.player.splash.high_speed": { + "sounds": [ + "liquid/heavy_splash" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.player.swim": { + "sounds": [ + "liquid/swim5", + "liquid/swim6", + "liquid/swim7", + "liquid/swim8", + "liquid/swim9", + "liquid/swim10", + "liquid/swim11", + "liquid/swim12", + "liquid/swim13", + "liquid/swim14", + "liquid/swim15", + "liquid/swim16", + "liquid/swim17", + "liquid/swim18" + ], + "subtitle": "subtitles.entity.generic.swim" + }, + "entity.player.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.player.teleport" + }, + "entity.polar_bear.ambient": { + "sounds": [ + "mob/polarbear/idle1", + "mob/polarbear/idle2", + "mob/polarbear/idle3", + "mob/polarbear/idle4" + ], + "subtitle": "subtitles.entity.polar_bear.ambient" + }, + "entity.polar_bear.ambient_baby": { + "sounds": [ + "mob/polarbear_baby/idle1", + "mob/polarbear_baby/idle2", + "mob/polarbear_baby/idle3", + "mob/polarbear_baby/idle4" + ], + "subtitle": "subtitles.entity.polar_bear.ambient_baby" + }, + "entity.polar_bear.death": { + "sounds": [ + "mob/polarbear/death1", + "mob/polarbear/death2", + "mob/polarbear/death3" + ], + "subtitle": "subtitles.entity.polar_bear.death" + }, + "entity.polar_bear.hurt": { + "sounds": [ + "mob/polarbear/hurt1", + "mob/polarbear/hurt2", + "mob/polarbear/hurt3", + "mob/polarbear/hurt4" + ], + "subtitle": "subtitles.entity.polar_bear.hurt" + }, + "entity.polar_bear.step": { + "sounds": [ + "mob/polarbear/step1", + "mob/polarbear/step2", + "mob/polarbear/step3", + "mob/polarbear/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.polar_bear.warning": { + "sounds": [ + "mob/polarbear/warning1", + "mob/polarbear/warning2", + "mob/polarbear/warning3", + { + "name": "mob/polarbear/warning3", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.polar_bear.warning" + }, + "entity.puffer_fish.ambient": { + "sounds": [] + }, + "entity.puffer_fish.blow_out": { + "sounds": [ + { + "name": "entity/pufferfish/blow_out1", + "volume": 0.7 + }, + { + "name": "entity/pufferfish/blow_out2", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.puffer_fish.blow_out" + }, + "entity.puffer_fish.blow_up": { + "sounds": [ + { + "name": "entity/pufferfish/blow_up1", + "volume": 0.45 + }, + { + "name": "entity/pufferfish/blow_up2", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.puffer_fish.blow_up" + }, + "entity.puffer_fish.death": { + "sounds": [ + "entity/pufferfish/death1", + "entity/pufferfish/death2" + ], + "subtitle": "subtitles.entity.puffer_fish.death" + }, + "entity.puffer_fish.flop": { + "sounds": [ + { + "name": "entity/pufferfish/flop1", + "volume": 0.3 + }, + { + "name": "entity/pufferfish/flop2", + "volume": 0.3 + }, + { + "name": "entity/pufferfish/flop3", + "volume": 0.3 + }, + { + "name": "entity/pufferfish/flop4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.puffer_fish.flop" + }, + "entity.puffer_fish.hurt": { + "sounds": [ + "entity/pufferfish/hurt1", + "entity/pufferfish/hurt2" + ], + "subtitle": "subtitles.entity.puffer_fish.hurt" + }, + "entity.puffer_fish.sting": { + "sounds": [ + "entity/pufferfish/sting1", + "entity/pufferfish/sting2" + ], + "subtitle": "subtitles.entity.puffer_fish.sting" + }, + "entity.rabbit.ambient": { + "sounds": [ + { + "name": "mob/rabbit/idle1", + "volume": 0.25 + }, + { + "name": "mob/rabbit/idle2", + "volume": 0.25 + }, + { + "name": "mob/rabbit/idle3", + "volume": 0.25 + }, + { + "name": "mob/rabbit/idle4", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.rabbit.ambient" + }, + "entity.rabbit.attack": { + "sounds": [ + "entity/rabbit/attack1", + "entity/rabbit/attack2", + "entity/rabbit/attack3", + "entity/rabbit/attack4" + ], + "subtitle": "subtitles.entity.rabbit.attack" + }, + "entity.rabbit.death": { + "sounds": [ + { + "name": "mob/rabbit/bunnymurder", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.rabbit.death" + }, + "entity.rabbit.hurt": { + "sounds": [ + { + "name": "mob/rabbit/hurt1", + "volume": 0.5 + }, + { + "name": "mob/rabbit/hurt2", + "volume": 0.5 + }, + { + "name": "mob/rabbit/hurt3", + "volume": 0.5 + }, + { + "name": "mob/rabbit/hurt4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.rabbit.hurt" + }, + "entity.rabbit.jump": { + "sounds": [ + { + "name": "mob/rabbit/hop1", + "volume": 0.1 + }, + { + "name": "mob/rabbit/hop2", + "volume": 0.1 + }, + { + "name": "mob/rabbit/hop3", + "volume": 0.1 + }, + { + "name": "mob/rabbit/hop4", + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.rabbit.jump" + }, + "entity.ravager.ambient": { + "sounds": [ + "mob/ravager/idle1", + "mob/ravager/idle2", + "mob/ravager/idle3", + "mob/ravager/idle4", + "mob/ravager/idle5", + "mob/ravager/idle6", + "mob/ravager/idle7", + "mob/ravager/idle8" + ], + "subtitle": "subtitles.entity.ravager.ambient" + }, + "entity.ravager.attack": { + "sounds": [ + "mob/ravager/bite1", + "mob/ravager/bite2", + "mob/ravager/bite3" + ], + "subtitle": "subtitles.entity.ravager.attack" + }, + "entity.ravager.celebrate": { + "sounds": [ + "mob/ravager/celebrate1", + "mob/ravager/celebrate2" + ], + "subtitle": "subtitles.entity.ravager.celebrate" + }, + "entity.ravager.death": { + "sounds": [ + "mob/ravager/death1", + "mob/ravager/death2", + "mob/ravager/death3" + ], + "subtitle": "subtitles.entity.ravager.death" + }, + "entity.ravager.hurt": { + "sounds": [ + "mob/ravager/hurt1", + "mob/ravager/hurt2", + "mob/ravager/hurt3", + "mob/ravager/hurt4" + ], + "subtitle": "subtitles.entity.ravager.hurt" + }, + "entity.ravager.roar": { + "sounds": [ + { + "attenuation_distance": 35, + "name": "mob/ravager/roar1" + }, + { + "attenuation_distance": 35, + "name": "mob/ravager/roar2" + }, + { + "attenuation_distance": 35, + "name": "mob/ravager/roar3" + }, + { + "attenuation_distance": 35, + "name": "mob/ravager/roar4" + } + ], + "subtitle": "subtitles.entity.ravager.roar" + }, + "entity.ravager.step": { + "sounds": [ + "mob/ravager/step1", + "mob/ravager/step2", + "mob/ravager/step3", + "mob/ravager/step4", + "mob/ravager/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.ravager.stunned": { + "sounds": [ + "mob/ravager/stun1", + "mob/ravager/stun2", + "mob/ravager/stun3" + ], + "subtitle": "subtitles.entity.ravager.stunned" + }, + "entity.salmon.ambient": { + "sounds": [] + }, + "entity.salmon.death": { + "sounds": [ + { + "name": "entity/fish/hurt1", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt2", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt3", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt4", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.salmon.death" + }, + "entity.salmon.flop": { + "sounds": [ + { + "name": "entity/fish/flop1", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "entity/fish/flop2", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "entity/fish/flop3", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "entity/fish/flop4", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.salmon.flop" + }, + "entity.salmon.hurt": { + "sounds": [ + { + "name": "entity/fish/hurt1", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt2", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt3", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt4", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.salmon.hurt" + }, + "entity.sheep.ambient": { + "sounds": [ + "mob/sheep/say1", + "mob/sheep/say2", + "mob/sheep/say3" + ], + "subtitle": "subtitles.entity.sheep.ambient" + }, + "entity.sheep.death": { + "sounds": [ + "mob/sheep/say1", + "mob/sheep/say2", + "mob/sheep/say3" + ], + "subtitle": "subtitles.entity.sheep.death" + }, + "entity.sheep.hurt": { + "sounds": [ + "mob/sheep/say1", + "mob/sheep/say2", + "mob/sheep/say3" + ], + "subtitle": "subtitles.entity.sheep.hurt" + }, + "entity.sheep.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.sheep.step": { + "sounds": [ + "mob/sheep/step1", + "mob/sheep/step2", + "mob/sheep/step3", + "mob/sheep/step4", + "mob/sheep/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.shulker.ambient": { + "sounds": [ + "entity/shulker/ambient1", + "entity/shulker/ambient2", + "entity/shulker/ambient3", + "entity/shulker/ambient4", + "entity/shulker/ambient5", + "entity/shulker/ambient6", + "entity/shulker/ambient7" + ], + "subtitle": "subtitles.entity.shulker.ambient" + }, + "entity.shulker.close": { + "sounds": [ + "entity/shulker/close1", + "entity/shulker/close2", + "entity/shulker/close3", + "entity/shulker/close4", + "entity/shulker/close5" + ], + "subtitle": "subtitles.entity.shulker.close" + }, + "entity.shulker.death": { + "sounds": [ + "entity/shulker/death1", + "entity/shulker/death2", + "entity/shulker/death3", + "entity/shulker/death4" + ], + "subtitle": "subtitles.entity.shulker.death" + }, + "entity.shulker.hurt": { + "sounds": [ + "entity/shulker/hurt1", + "entity/shulker/hurt2", + "entity/shulker/hurt3", + "entity/shulker/hurt4" + ], + "subtitle": "subtitles.entity.shulker.hurt" + }, + "entity.shulker.hurt_closed": { + "sounds": [ + "entity/shulker/hurt_closed1", + "entity/shulker/hurt_closed2", + "entity/shulker/hurt_closed3", + "entity/shulker/hurt_closed4", + "entity/shulker/hurt_closed5" + ], + "subtitle": "subtitles.entity.shulker.hurt" + }, + "entity.shulker.open": { + "sounds": [ + "entity/shulker/open1", + "entity/shulker/open2", + "entity/shulker/open3", + "entity/shulker/open4", + "entity/shulker/open5" + ], + "subtitle": "subtitles.entity.shulker.open" + }, + "entity.shulker.shoot": { + "sounds": [ + "entity/shulker/shoot1", + "entity/shulker/shoot2", + "entity/shulker/shoot3", + "entity/shulker/shoot4" + ], + "subtitle": "subtitles.entity.shulker.shoot" + }, + "entity.shulker.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.shulker.teleport" + }, + "entity.shulker_bullet.hit": { + "sounds": [ + "entity/shulker_bullet/hit1", + "entity/shulker_bullet/hit2", + "entity/shulker_bullet/hit3", + "entity/shulker_bullet/hit4" + ], + "subtitle": "subtitles.entity.shulker_bullet.hit" + }, + "entity.shulker_bullet.hurt": { + "sounds": [ + "entity/shulker_bullet/hit1", + "entity/shulker_bullet/hit2", + "entity/shulker_bullet/hit3", + "entity/shulker_bullet/hit4" + ], + "subtitle": "subtitles.entity.shulker_bullet.hurt" + }, + "entity.silverfish.ambient": { + "sounds": [ + "mob/silverfish/say1", + "mob/silverfish/say2", + "mob/silverfish/say3", + "mob/silverfish/say4" + ], + "subtitle": "subtitles.entity.silverfish.ambient" + }, + "entity.silverfish.death": { + "sounds": [ + "mob/silverfish/kill" + ], + "subtitle": "subtitles.entity.silverfish.death" + }, + "entity.silverfish.hurt": { + "sounds": [ + "mob/silverfish/hit1", + "mob/silverfish/hit2", + "mob/silverfish/hit3" + ], + "subtitle": "subtitles.entity.silverfish.hurt" + }, + "entity.silverfish.step": { + "sounds": [ + "mob/silverfish/step1", + "mob/silverfish/step2", + "mob/silverfish/step3", + "mob/silverfish/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.skeleton.ambient": { + "sounds": [ + "mob/skeleton/say1", + "mob/skeleton/say2", + "mob/skeleton/say3" + ], + "subtitle": "subtitles.entity.skeleton.ambient" + }, + "entity.skeleton.converted_to_stray": { + "sounds": [ + "mob/stray/convert1", + "mob/stray/convert2", + "mob/stray/convert3" + ], + "subtitle": "subtitles.entity.skeleton.converted_to_stray" + }, + "entity.skeleton.death": { + "sounds": [ + "mob/skeleton/death" + ], + "subtitle": "subtitles.entity.skeleton.death" + }, + "entity.skeleton.hurt": { + "sounds": [ + "mob/skeleton/hurt1", + "mob/skeleton/hurt2", + "mob/skeleton/hurt3", + "mob/skeleton/hurt4" + ], + "subtitle": "subtitles.entity.skeleton.hurt" + }, + "entity.skeleton.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.skeleton.shoot" + }, + "entity.skeleton.step": { + "sounds": [ + "mob/skeleton/step1", + "mob/skeleton/step2", + "mob/skeleton/step3", + "mob/skeleton/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.skeleton_horse.ambient": { + "sounds": [ + "mob/horse/skeleton/idle1", + "mob/horse/skeleton/idle2", + "mob/horse/skeleton/idle3" + ], + "subtitle": "subtitles.entity.skeleton_horse.ambient" + }, + "entity.skeleton_horse.ambient_water": { + "sounds": [ + "mob/horse/skeleton/water/idle1", + "mob/horse/skeleton/water/idle2", + "mob/horse/skeleton/water/idle3", + "mob/horse/skeleton/water/idle4", + "mob/horse/skeleton/water/idle5" + ], + "subtitle": "subtitles.entity.skeleton_horse.ambient" + }, + "entity.skeleton_horse.death": { + "sounds": [ + "mob/horse/skeleton/death" + ], + "subtitle": "subtitles.entity.skeleton_horse.death" + }, + "entity.skeleton_horse.gallop_water": { + "sounds": [ + { + "name": "mob/horse/skeleton/water/gallop1", + "volume": 0.45 + }, + { + "name": "mob/horse/skeleton/water/gallop2", + "volume": 0.45 + }, + { + "name": "mob/horse/skeleton/water/gallop3", + "volume": 0.45 + }, + { + "name": "mob/horse/skeleton/water/gallop4", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.horse.gallop" + }, + "entity.skeleton_horse.hurt": { + "sounds": [ + "mob/horse/skeleton/hit1", + "mob/horse/skeleton/hit2", + "mob/horse/skeleton/hit3", + "mob/horse/skeleton/hit4" + ], + "subtitle": "subtitles.entity.skeleton_horse.hurt" + }, + "entity.skeleton_horse.jump_water": { + "sounds": [ + { + "name": "mob/horse/skeleton/water/jump", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.skeleton_horse.jump_water" + }, + "entity.skeleton_horse.step_water": { + "sounds": [ + { + "name": "mob/horse/skeleton/water/soft1", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft2", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft3", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft4", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft5", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft6", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.skeleton_horse.swim": { + "sounds": [ + { + "name": "liquid/swim9", + "volume": 0.4 + }, + { + "name": "liquid/swim10", + "volume": 0.4 + }, + { + "name": "liquid/swim11", + "volume": 0.4 + }, + { + "name": "liquid/swim12", + "volume": 0.4 + }, + { + "name": "liquid/swim14", + "volume": 0.6 + }, + { + "name": "liquid/swim15", + "volume": 0.6 + }, + { + "name": "liquid/swim16", + "volume": 0.6 + }, + { + "name": "liquid/swim17", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.skeleton_horse.swim" + }, + "entity.slime.attack": { + "sounds": [ + "mob/slime/attack1", + "mob/slime/attack2" + ], + "subtitle": "subtitles.entity.slime.attack" + }, + "entity.slime.death": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.death" + }, + "entity.slime.death_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.death" + }, + "entity.slime.hurt": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.hurt" + }, + "entity.slime.hurt_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.hurt" + }, + "entity.slime.jump": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.slime.jump_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.slime.squish": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.slime.squish_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.sniffer.death": { + "sounds": [ + "mob/sniffer/death1", + "mob/sniffer/death2" + ], + "subtitle": "subtitles.entity.sniffer.death" + }, + "entity.sniffer.digging": { + "sounds": [ + "mob/sniffer/longdig1", + "mob/sniffer/longdig2" + ], + "subtitle": "subtitles.entity.sniffer.digging" + }, + "entity.sniffer.digging_stop": { + "sounds": [ + "mob/sniffer/digging_stop1", + "mob/sniffer/digging_stop2" + ], + "subtitle": "subtitles.entity.sniffer.digging_stop" + }, + "entity.sniffer.drop_seed": { + "sounds": [ + { + "name": "random/pop", + "pitch": 0.6, + "volume": 0.8 + }, + { + "name": "random/pop", + "pitch": 0.7, + "volume": 0.8 + }, + { + "name": "random/pop", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.sniffer.drop_seed" + }, + "entity.sniffer.eat": { + "sounds": [ + { + "name": "mob/sniffer/eat1", + "volume": 0.7 + }, + { + "name": "mob/sniffer/eat2", + "volume": 0.7 + }, + { + "name": "mob/sniffer/eat3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.sniffer.eat" + }, + "entity.sniffer.happy": { + "sounds": [ + "mob/sniffer/happy1", + "mob/sniffer/happy2", + "mob/sniffer/happy3", + "mob/sniffer/happy4", + "mob/sniffer/happy5" + ], + "subtitle": "subtitles.entity.sniffer.happy" + }, + "entity.sniffer.hurt": { + "sounds": [ + "mob/sniffer/hurt1", + "mob/sniffer/hurt2", + "mob/sniffer/hurt3" + ], + "subtitle": "subtitles.entity.sniffer.hurt" + }, + "entity.sniffer.idle": { + "sounds": [ + "mob/sniffer/idle1", + "mob/sniffer/idle2", + "mob/sniffer/idle3", + "mob/sniffer/idle4", + "mob/sniffer/idle5", + "mob/sniffer/idle6", + "mob/sniffer/idle7", + "mob/sniffer/idle8", + "mob/sniffer/idle9", + "mob/sniffer/idle10", + "mob/sniffer/idle11" + ], + "subtitle": "subtitles.entity.sniffer.idle" + }, + "entity.sniffer.scenting": { + "sounds": [ + "mob/sniffer/scenting1", + "mob/sniffer/scenting2", + "mob/sniffer/scenting3" + ], + "subtitle": "subtitles.entity.sniffer.scenting" + }, + "entity.sniffer.searching": { + "sounds": [ + "mob/sniffer/searching1", + { + "name": "mob/sniffer/searching1", + "volume": 0.8 + }, + "mob/sniffer/searching2", + { + "name": "mob/sniffer/searching2", + "volume": 0.8 + }, + "mob/sniffer/searching3", + { + "name": "mob/sniffer/searching3", + "volume": 0.8 + }, + "mob/sniffer/searching4", + { + "name": "mob/sniffer/searching4", + "volume": 0.8 + }, + "mob/sniffer/searching5", + { + "name": "mob/sniffer/searching5", + "volume": 0.8 + }, + "mob/sniffer/searching6", + { + "name": "mob/sniffer/searching6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.sniffer.searching" + }, + "entity.sniffer.sniffing": { + "sounds": [ + "mob/sniffer/sniffing1", + "mob/sniffer/sniffing2", + "mob/sniffer/sniffing3" + ], + "subtitle": "subtitles.entity.sniffer.sniffing" + }, + "entity.sniffer.step": { + "sounds": [ + "mob/sniffer/step1", + "mob/sniffer/step2", + "mob/sniffer/step3", + "mob/sniffer/step4", + "mob/sniffer/step5", + "mob/sniffer/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.snow_golem.ambient": { + "sounds": [] + }, + "entity.snow_golem.death": { + "sounds": [ + "entity/snowman/death1", + "entity/snowman/death2", + "entity/snowman/death3" + ], + "subtitle": "subtitles.entity.snow_golem.death" + }, + "entity.snow_golem.hurt": { + "sounds": [ + "entity/snowman/hurt1", + "entity/snowman/hurt2", + "entity/snowman/hurt3" + ], + "subtitle": "subtitles.entity.snow_golem.hurt" + }, + "entity.snow_golem.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.snow_golem.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.snowball.throw" + }, + "entity.snowball.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.snowball.throw" + }, + "entity.spider.ambient": { + "sounds": [ + "mob/spider/say1", + "mob/spider/say2", + "mob/spider/say3", + "mob/spider/say4" + ], + "subtitle": "subtitles.entity.spider.ambient" + }, + "entity.spider.death": { + "sounds": [ + "mob/spider/death" + ], + "subtitle": "subtitles.entity.spider.death" + }, + "entity.spider.hurt": { + "sounds": [ + "mob/spider/say1", + "mob/spider/say2", + "mob/spider/say3", + "mob/spider/say4" + ], + "subtitle": "subtitles.entity.spider.hurt" + }, + "entity.spider.step": { + "sounds": [ + "mob/spider/step1", + "mob/spider/step2", + "mob/spider/step3", + "mob/spider/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.splash_potion.break": { + "sounds": [ + "random/glass1", + "random/glass2", + "random/glass3" + ], + "subtitle": "subtitles.entity.potion.splash" + }, + "entity.splash_potion.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.potion.throw" + }, + "entity.squid.ambient": { + "sounds": [ + "entity/squid/ambient1", + "entity/squid/ambient2", + "entity/squid/ambient3", + "entity/squid/ambient4", + "entity/squid/ambient5" + ], + "subtitle": "subtitles.entity.squid.ambient" + }, + "entity.squid.death": { + "sounds": [ + "entity/squid/death1", + "entity/squid/death2", + "entity/squid/death3" + ], + "subtitle": "subtitles.entity.squid.death" + }, + "entity.squid.hurt": { + "sounds": [ + "entity/squid/hurt1", + "entity/squid/hurt2", + "entity/squid/hurt3", + "entity/squid/hurt4" + ], + "subtitle": "subtitles.entity.squid.hurt" + }, + "entity.squid.squirt": { + "sounds": [ + "entity/squid/squirt1", + "entity/squid/squirt2", + "entity/squid/squirt3" + ], + "subtitle": "subtitles.entity.squid.squirt" + }, + "entity.stray.ambient": { + "sounds": [ + "mob/stray/idle1", + "mob/stray/idle2", + "mob/stray/idle3", + "mob/stray/idle4" + ], + "subtitle": "subtitles.entity.stray.ambient" + }, + "entity.stray.death": { + "sounds": [ + "mob/stray/death1", + "mob/stray/death2" + ], + "subtitle": "subtitles.entity.stray.death" + }, + "entity.stray.hurt": { + "sounds": [ + "mob/stray/hurt1", + "mob/stray/hurt2", + "mob/stray/hurt3", + "mob/stray/hurt4" + ], + "subtitle": "subtitles.entity.stray.hurt" + }, + "entity.stray.step": { + "sounds": [ + "mob/stray/step1", + "mob/stray/step2", + "mob/stray/step3", + "mob/stray/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.strider.ambient": { + "sounds": [ + "mob/strider/idle1", + "mob/strider/idle2", + "mob/strider/idle3", + "mob/strider/idle4", + "mob/strider/idle5", + "mob/strider/idle6" + ], + "subtitle": "subtitles.entity.strider.idle" + }, + "entity.strider.death": { + "sounds": [ + "mob/strider/death1", + "mob/strider/death2", + "mob/strider/death3", + "mob/strider/death4" + ], + "subtitle": "subtitles.entity.strider.death" + }, + "entity.strider.eat": { + "sounds": [ + "mob/strider/eat1", + "mob/strider/eat2", + "mob/strider/eat3" + ], + "subtitle": "subtitles.entity.strider.eat" + }, + "entity.strider.happy": { + "sounds": [ + "mob/strider/happy1", + "mob/strider/happy2", + "mob/strider/happy3", + "mob/strider/happy4", + "mob/strider/happy5" + ], + "subtitle": "subtitles.entity.strider.happy" + }, + "entity.strider.hurt": { + "sounds": [ + "mob/strider/hurt1", + "mob/strider/hurt2", + "mob/strider/hurt3", + "mob/strider/hurt4" + ], + "subtitle": "subtitles.entity.strider.hurt" + }, + "entity.strider.retreat": { + "sounds": [ + { + "name": "mob/strider/retreat1", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat2", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat3", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat4", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.strider.retreat" + }, + "entity.strider.saddle": { + "sounds": [ + "mob/horse/leather" + ] + }, + "entity.strider.step": { + "sounds": [ + { + "name": "mob/strider/step1", + "volume": 0.25 + }, + { + "name": "mob/strider/step2", + "volume": 0.25 + }, + { + "name": "mob/strider/step3", + "volume": 0.25 + }, + { + "name": "mob/strider/step4", + "volume": 0.25 + }, + { + "name": "mob/strider/step5", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.strider.step_lava": { + "sounds": [ + { + "name": "mob/strider/step_lava1", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava2", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava3", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava4", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava5", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava6", + "volume": 0.2 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.tadpole.death": { + "sounds": [ + "mob/tadpole/death1", + "mob/tadpole/death2" + ], + "subtitle": "subtitles.entity.tadpole.death" + }, + "entity.tadpole.flop": { + "sounds": [ + { + "name": "entity.tropical_fish.flop", + "type": "event" + } + ], + "subtitle": "subtitles.entity.tadpole.flop" + }, + "entity.tadpole.grow_up": { + "sounds": [ + { + "name": "mob/frog/idle1", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle2", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle3", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle4", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle5", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle6", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle7", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle8", + "pitch": 1.2, + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.tadpole.grow_up" + }, + "entity.tadpole.hurt": { + "sounds": [ + "mob/tadpole/hurt1", + "mob/tadpole/hurt2", + "mob/tadpole/hurt3", + "mob/tadpole/hurt4" + ], + "subtitle": "subtitles.entity.tadpole.hurt" + }, + "entity.tnt.primed": { + "sounds": [ + "random/fuse" + ], + "subtitle": "subtitles.entity.tnt.primed" + }, + "entity.tropical_fish.ambient": { + "sounds": [] + }, + "entity.tropical_fish.death": { + "sounds": [ + { + "name": "entity/fish/hurt1", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt2", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt3", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt4", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.tropical_fish.death" + }, + "entity.tropical_fish.flop": { + "sounds": [ + { + "name": "entity/fish/flop1", + "volume": 0.3 + }, + { + "name": "entity/fish/flop2", + "volume": 0.3 + }, + { + "name": "entity/fish/flop3", + "volume": 0.3 + }, + { + "name": "entity/fish/flop4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.tropical_fish.flop" + }, + "entity.tropical_fish.hurt": { + "sounds": [ + "entity/fish/hurt1", + "entity/fish/hurt2", + "entity/fish/hurt3", + "entity/fish/hurt4" + ], + "subtitle": "subtitles.entity.tropical_fish.hurt" + }, + "entity.turtle.ambient_land": { + "sounds": [ + { + "name": "mob/turtle/idle1", + "volume": 0.8 + }, + { + "name": "mob/turtle/idle2", + "volume": 0.7 + }, + { + "name": "mob/turtle/idle3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.turtle.ambient_land" + }, + "entity.turtle.death": { + "sounds": [ + "mob/turtle/death1", + "mob/turtle/death2", + "mob/turtle/death3" + ], + "subtitle": "subtitles.entity.turtle.death" + }, + "entity.turtle.death_baby": { + "sounds": [ + "mob/turtle/baby/death1", + "mob/turtle/baby/death2" + ], + "subtitle": "subtitles.entity.turtle.death_baby" + }, + "entity.turtle.egg_break": { + "sounds": [ + "mob/turtle/egg/egg_break1", + "mob/turtle/egg/egg_break2" + ], + "subtitle": "subtitles.entity.turtle.egg_break" + }, + "entity.turtle.egg_crack": { + "sounds": [ + "mob/turtle/egg/egg_crack1", + "mob/turtle/egg/egg_crack2", + "mob/turtle/egg/egg_crack3", + "mob/turtle/egg/egg_crack4", + "mob/turtle/egg/egg_crack5" + ], + "subtitle": "subtitles.entity.turtle.egg_crack" + }, + "entity.turtle.egg_hatch": { + "sounds": [ + "mob/turtle/baby/egg_hatched1", + "mob/turtle/baby/egg_hatched2", + "mob/turtle/baby/egg_hatched3" + ], + "subtitle": "subtitles.entity.turtle.egg_hatch" + }, + "entity.turtle.hurt": { + "sounds": [ + "mob/turtle/hurt1", + "mob/turtle/hurt2", + "mob/turtle/hurt3", + "mob/turtle/hurt4", + "mob/turtle/hurt5" + ], + "subtitle": "subtitles.entity.turtle.hurt" + }, + "entity.turtle.hurt_baby": { + "sounds": [ + "mob/turtle/baby/hurt1", + "mob/turtle/baby/hurt2" + ], + "subtitle": "subtitles.entity.turtle.hurt_baby" + }, + "entity.turtle.lay_egg": { + "sounds": [ + "mob/turtle/egg/drop_egg1", + "mob/turtle/egg/drop_egg2" + ], + "subtitle": "subtitles.entity.turtle.lay_egg" + }, + "entity.turtle.shamble": { + "sounds": [ + "mob/turtle/walk1", + "mob/turtle/walk2", + "mob/turtle/walk3", + "mob/turtle/walk4", + "mob/turtle/walk5" + ], + "subtitle": "subtitles.entity.turtle.shamble" + }, + "entity.turtle.shamble_baby": { + "sounds": [ + "mob/turtle/baby/shamble1", + "mob/turtle/baby/shamble2", + "mob/turtle/baby/shamble3", + "mob/turtle/baby/shamble4" + ], + "subtitle": "subtitles.entity.turtle.shamble_baby" + }, + "entity.turtle.swim": { + "sounds": [ + { + "name": "mob/turtle/swim/swim1", + "volume": 0.6 + }, + { + "name": "mob/turtle/swim/swim2", + "volume": 0.3 + }, + { + "name": "mob/turtle/swim/swim3", + "volume": 0.2 + }, + { + "name": "mob/turtle/swim/swim4", + "volume": 0.6 + }, + { + "name": "mob/turtle/swim/swim5", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.turtle.swim" + }, + "entity.vex.ambient": { + "sounds": [ + "mob/vex/idle1", + "mob/vex/idle2", + "mob/vex/idle3", + "mob/vex/idle4" + ], + "subtitle": "subtitles.entity.vex.ambient" + }, + "entity.vex.charge": { + "sounds": [ + "mob/vex/charge1", + "mob/vex/charge2", + "mob/vex/charge3" + ], + "subtitle": "subtitles.entity.vex.charge" + }, + "entity.vex.death": { + "sounds": [ + "mob/vex/death1", + "mob/vex/death2" + ], + "subtitle": "subtitles.entity.vex.death" + }, + "entity.vex.hurt": { + "sounds": [ + "mob/vex/hurt1", + "mob/vex/hurt2" + ], + "subtitle": "subtitles.entity.vex.hurt" + }, + "entity.villager.ambient": { + "sounds": [ + "mob/villager/idle1", + "mob/villager/idle2", + "mob/villager/idle3" + ], + "subtitle": "subtitles.entity.villager.ambient" + }, + "entity.villager.celebrate": { + "sounds": [ + "mob/villager/yes1", + "mob/villager/yes2", + "mob/villager/yes3" + ], + "subtitle": "subtitles.entity.villager.celebrate" + }, + "entity.villager.death": { + "sounds": [ + "mob/villager/death" + ], + "subtitle": "subtitles.entity.villager.death" + }, + "entity.villager.hurt": { + "sounds": [ + "mob/villager/hit1", + "mob/villager/hit2", + "mob/villager/hit3", + "mob/villager/hit4" + ], + "subtitle": "subtitles.entity.villager.hurt" + }, + "entity.villager.no": { + "sounds": [ + "mob/villager/no1", + "mob/villager/no2", + "mob/villager/no3" + ], + "subtitle": "subtitles.entity.villager.no" + }, + "entity.villager.trade": { + "sounds": [ + "mob/villager/haggle1", + "mob/villager/haggle2", + "mob/villager/haggle3" + ], + "subtitle": "subtitles.entity.villager.trade" + }, + "entity.villager.work_armorer": { + "sounds": [ + "block/blastfurnace/blastfurnace1", + "block/blastfurnace/blastfurnace2", + "block/blastfurnace/blastfurnace3", + "block/blastfurnace/blastfurnace4", + "block/blastfurnace/blastfurnace5" + ], + "subtitle": "subtitles.entity.villager.work_armorer" + }, + "entity.villager.work_butcher": { + "sounds": [ + "block/smoker/smoker1", + "block/smoker/smoker2", + "block/smoker/smoker3", + "block/smoker/smoker4", + "block/smoker/smoker5" + ], + "subtitle": "subtitles.entity.villager.work_butcher" + }, + "entity.villager.work_cartographer": { + "sounds": [ + "ui/cartography_table/drawmap1", + "ui/cartography_table/drawmap2", + "ui/cartography_table/drawmap3" + ], + "subtitle": "subtitles.entity.villager.work_cartographer" + }, + "entity.villager.work_cleric": { + "sounds": [ + "block/brewing_stand/brew1", + "block/brewing_stand/brew2" + ], + "subtitle": "subtitles.entity.villager.work_cleric" + }, + "entity.villager.work_farmer": { + "sounds": [ + "block/composter/fill_success1", + "block/composter/fill_success2", + "block/composter/fill_success3", + "block/composter/fill_success4" + ], + "subtitle": "subtitles.entity.villager.work_farmer" + }, + "entity.villager.work_fisherman": { + "sounds": [ + "block/barrel/open1", + "block/barrel/open2" + ], + "subtitle": "subtitles.entity.villager.work_fisherman" + }, + "entity.villager.work_fletcher": { + "sounds": [ + "block/fletching_table/fletching_table1", + "block/fletching_table/fletching_table2" + ], + "subtitle": "subtitles.entity.villager.work_fletcher" + }, + "entity.villager.work_leatherworker": { + "sounds": [ + { + "name": "block/cauldron/dye1", + "volume": 0.9 + }, + { + "name": "block/cauldron/dye2", + "volume": 0.9 + }, + { + "name": "block/cauldron/dye3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.villager.work_leatherworker" + }, + "entity.villager.work_librarian": { + "sounds": [ + { + "name": "item/book/open_flip1", + "volume": 2.0 + }, + { + "name": "item/book/open_flip2", + "volume": 2.0 + }, + { + "name": "item/book/open_flip3", + "volume": 2.0 + } + ], + "subtitle": "subtitles.entity.villager.work_librarian" + }, + "entity.villager.work_mason": { + "sounds": [ + "ui/stonecutter/cut1", + { + "name": "ui/stonecutter/cut1", + "pitch": 0.92 + }, + "ui/stonecutter/cut2", + { + "name": "ui/stonecutter/cut2", + "pitch": 0.92 + } + ], + "subtitle": "subtitles.entity.villager.work_mason" + }, + "entity.villager.work_shepherd": { + "sounds": [ + { + "name": "ui/loom/take_result1", + "volume": 0.5 + }, + { + "name": "ui/loom/take_result2", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.villager.work_shepherd" + }, + "entity.villager.work_toolsmith": { + "sounds": [ + "block/smithing_table/smithing_table1", + "block/smithing_table/smithing_table2", + "block/smithing_table/smithing_table3" + ], + "subtitle": "subtitles.entity.villager.work_toolsmith" + }, + "entity.villager.work_weaponsmith": { + "sounds": [ + { + "name": "block/grindstone/grindstone1", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone2", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone3", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.villager.work_weaponsmith" + }, + "entity.villager.yes": { + "sounds": [ + "mob/villager/yes1", + "mob/villager/yes2", + "mob/villager/yes3" + ], + "subtitle": "subtitles.entity.villager.yes" + }, + "entity.vindicator.ambient": { + "sounds": [ + "mob/vindication_illager/idle1", + "mob/vindication_illager/idle2", + "mob/vindication_illager/idle3", + "mob/vindication_illager/idle4", + "mob/vindication_illager/idle5" + ], + "subtitle": "subtitles.entity.vindicator.ambient" + }, + "entity.vindicator.celebrate": { + "sounds": [ + "mob/vindication_illager/celebrate1", + "mob/vindication_illager/celebrate2" + ], + "subtitle": "subtitles.entity.vindicator.celebrate" + }, + "entity.vindicator.death": { + "sounds": [ + "mob/vindication_illager/death1", + "mob/vindication_illager/death2" + ], + "subtitle": "subtitles.entity.vindicator.death" + }, + "entity.vindicator.hurt": { + "sounds": [ + "mob/vindication_illager/hurt1", + "mob/vindication_illager/hurt2", + "mob/vindication_illager/hurt3" + ], + "subtitle": "subtitles.entity.vindicator.hurt" + }, + "entity.wandering_trader.ambient": { + "sounds": [ + "mob/wandering_trader/idle1", + "mob/wandering_trader/idle2", + "mob/wandering_trader/idle3", + "mob/wandering_trader/idle4", + "mob/wandering_trader/idle5" + ], + "subtitle": "subtitles.entity.wandering_trader.ambient" + }, + "entity.wandering_trader.death": { + "sounds": [ + "mob/wandering_trader/death" + ], + "subtitle": "subtitles.entity.wandering_trader.death" + }, + "entity.wandering_trader.disappeared": { + "sounds": [ + { + "name": "mob/wandering_trader/disappeared1", + "volume": 0.8 + }, + { + "name": "mob/wandering_trader/disappeared2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.wandering_trader.disappeared" + }, + "entity.wandering_trader.drink_milk": { + "sounds": [ + "mob/wandering_trader/drink_milk1", + "mob/wandering_trader/drink_milk2", + "mob/wandering_trader/drink_milk3", + "mob/wandering_trader/drink_milk4", + "mob/wandering_trader/drink_milk5" + ], + "subtitle": "subtitles.entity.wandering_trader.drink_milk" + }, + "entity.wandering_trader.drink_potion": { + "sounds": [ + { + "name": "mob/wandering_trader/drink_potion", + "volume": 0.7 + }, + { + "name": "random/drink", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.wandering_trader.drink_potion" + }, + "entity.wandering_trader.hurt": { + "sounds": [ + "mob/wandering_trader/hurt1", + "mob/wandering_trader/hurt2", + "mob/wandering_trader/hurt3", + "mob/wandering_trader/hurt4" + ], + "subtitle": "subtitles.entity.wandering_trader.hurt" + }, + "entity.wandering_trader.no": { + "sounds": [ + "mob/wandering_trader/no1", + "mob/wandering_trader/no2", + "mob/wandering_trader/no3", + "mob/wandering_trader/no4", + "mob/wandering_trader/no5" + ], + "subtitle": "subtitles.entity.wandering_trader.no" + }, + "entity.wandering_trader.reappeared": { + "sounds": [ + { + "name": "mob/wandering_trader/reappeared1", + "volume": 0.8 + }, + { + "name": "mob/wandering_trader/reappeared2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.wandering_trader.reappeared" + }, + "entity.wandering_trader.trade": { + "sounds": [ + "mob/wandering_trader/haggle1", + "mob/wandering_trader/haggle2", + "mob/wandering_trader/haggle3" + ], + "subtitle": "subtitles.entity.wandering_trader.trade" + }, + "entity.wandering_trader.yes": { + "sounds": [ + "mob/wandering_trader/yes1", + "mob/wandering_trader/yes2", + "mob/wandering_trader/yes3", + "mob/wandering_trader/yes4" + ], + "subtitle": "subtitles.entity.wandering_trader.yes" + }, + "entity.warden.agitated": { + "sounds": [ + "mob/warden/agitated_1", + "mob/warden/agitated_2", + "mob/warden/agitated_3", + "mob/warden/agitated_4", + "mob/warden/agitated_5", + "mob/warden/agitated_6" + ], + "subtitle": "subtitles.entity.warden.agitated" + }, + "entity.warden.ambient": { + "sounds": [ + "mob/warden/ambient_1", + "mob/warden/ambient_2", + "mob/warden/ambient_3", + "mob/warden/ambient_4", + "mob/warden/ambient_5", + "mob/warden/ambient_6", + "mob/warden/ambient_7", + "mob/warden/ambient_8", + "mob/warden/ambient_9", + "mob/warden/ambient_10", + "mob/warden/ambient_11", + "mob/warden/ambient_12" + ], + "subtitle": "subtitles.entity.warden.ambient" + }, + "entity.warden.angry": { + "sounds": [ + "mob/warden/angry_1", + "mob/warden/angry_2", + "mob/warden/angry_3", + "mob/warden/angry_4", + "mob/warden/angry_5", + "mob/warden/angry_6" + ], + "subtitle": "subtitles.entity.warden.angry" + }, + "entity.warden.attack_impact": { + "sounds": [ + "mob/warden/attack_impact_1", + "mob/warden/attack_impact_2" + ], + "subtitle": "subtitles.entity.warden.attack_impact" + }, + "entity.warden.death": { + "sounds": [ + "mob/warden/death_1", + "mob/warden/death_2" + ], + "subtitle": "subtitles.entity.warden.death" + }, + "entity.warden.dig": { + "sounds": [ + "mob/warden/dig" + ], + "subtitle": "subtitles.entity.warden.dig" + }, + "entity.warden.emerge": { + "sounds": [ + "mob/warden/emerge" + ], + "subtitle": "subtitles.entity.warden.emerge" + }, + "entity.warden.heartbeat": { + "sounds": [ + "mob/warden/heartbeat_1", + "mob/warden/heartbeat_2", + "mob/warden/heartbeat_3", + "mob/warden/heartbeat_4" + ], + "subtitle": "subtitles.entity.warden.heartbeat" + }, + "entity.warden.hurt": { + "sounds": [ + "mob/warden/hurt_1", + "mob/warden/hurt_2", + "mob/warden/hurt_3", + "mob/warden/hurt_4" + ], + "subtitle": "subtitles.entity.warden.hurt" + }, + "entity.warden.listening": { + "sounds": [ + "mob/warden/listening_1", + "mob/warden/listening_2", + "mob/warden/listening_3", + "mob/warden/listening_4", + "mob/warden/listening_5" + ], + "subtitle": "subtitles.entity.warden.listening" + }, + "entity.warden.listening_angry": { + "sounds": [ + "mob/warden/listening_angry_1", + "mob/warden/listening_angry_2", + "mob/warden/listening_angry_3", + "mob/warden/listening_angry_4", + "mob/warden/listening_angry_5" + ], + "subtitle": "subtitles.entity.warden.listening_angry" + }, + "entity.warden.nearby_close": { + "sounds": [ + "mob/warden/nearby_close_1", + "mob/warden/nearby_close_2", + "mob/warden/nearby_close_3", + "mob/warden/nearby_close_4" + ], + "subtitle": "subtitles.entity.warden.nearby_close" + }, + "entity.warden.nearby_closer": { + "sounds": [ + "mob/warden/nearby_closer_1", + "mob/warden/nearby_closer_2", + "mob/warden/nearby_closer_3" + ], + "subtitle": "subtitles.entity.warden.nearby_closer" + }, + "entity.warden.nearby_closest": { + "sounds": [ + "mob/warden/nearby_closest_1", + "mob/warden/nearby_closest_2", + "mob/warden/nearby_closest_3" + ], + "subtitle": "subtitles.entity.warden.nearby_closest" + }, + "entity.warden.roar": { + "sounds": [ + "mob/warden/roar_1", + "mob/warden/roar_2", + "mob/warden/roar_3", + "mob/warden/roar_4", + "mob/warden/roar_5" + ], + "subtitle": "subtitles.entity.warden.roar" + }, + "entity.warden.sniff": { + "sounds": [ + { + "name": "mob/warden/sniff_1", + "volume": 0.75 + }, + { + "name": "mob/warden/sniff_2", + "volume": 0.75 + }, + { + "name": "mob/warden/sniff_3", + "volume": 0.75 + }, + { + "name": "mob/warden/sniff_4", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.warden.sniff" + }, + "entity.warden.sonic_boom": { + "sounds": [ + "mob/warden/sonic_boom1", + "mob/warden/sonic_boom2", + "mob/warden/sonic_boom3", + "mob/warden/sonic_boom4" + ], + "subtitle": "subtitles.entity.warden.sonic_boom" + }, + "entity.warden.sonic_charge": { + "sounds": [ + "mob/warden/sonic_charge1", + "mob/warden/sonic_charge2", + "mob/warden/sonic_charge3", + "mob/warden/sonic_charge4" + ], + "subtitle": "subtitles.entity.warden.sonic_charge" + }, + "entity.warden.step": { + "sounds": [ + { + "name": "mob/warden/step_1", + "volume": 0.3 + }, + { + "name": "mob/warden/step_2", + "volume": 0.3 + }, + { + "name": "mob/warden/step_3", + "volume": 0.3 + }, + { + "name": "mob/warden/step_4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.warden.tendril_clicks": { + "sounds": [ + "mob/warden/tendril_clicks_1", + "mob/warden/tendril_clicks_2", + "mob/warden/tendril_clicks_3", + "mob/warden/tendril_clicks_4", + "mob/warden/tendril_clicks_5", + "mob/warden/tendril_clicks_6" + ], + "subtitle": "subtitles.entity.warden.tendril_clicks" + }, + "entity.wind_charge.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.wind_charge.throw" + }, + "entity.wind_charge.wind_burst": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "entity/wind_charge/wind_burst1", + "pitch": 1.25 + }, + { + "attenuation_distance": 8, + "name": "entity/wind_charge/wind_burst2", + "pitch": 1.25 + }, + { + "attenuation_distance": 8, + "name": "entity/wind_charge/wind_burst3", + "pitch": 1.25 + } + ], + "subtitle": "subtitles.entity.wind_charge.wind_burst" + }, + "entity.witch.ambient": { + "sounds": [ + "entity/witch/ambient1", + "entity/witch/ambient2", + "entity/witch/ambient3", + "entity/witch/ambient4", + "entity/witch/ambient5", + { + "name": "entity/witch/ambient5", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.witch.ambient" + }, + "entity.witch.celebrate": { + "sounds": [ + "entity/witch/ambient1", + "entity/witch/ambient4", + "entity/witch/celebrate" + ], + "subtitle": "subtitles.entity.witch.celebrate" + }, + "entity.witch.death": { + "sounds": [ + "entity/witch/death1", + "entity/witch/death2", + "entity/witch/death3" + ], + "subtitle": "subtitles.entity.witch.death" + }, + "entity.witch.drink": { + "sounds": [ + "entity/witch/drink1", + "entity/witch/drink2", + "entity/witch/drink3", + "entity/witch/drink4" + ], + "subtitle": "subtitles.entity.witch.drink" + }, + "entity.witch.hurt": { + "sounds": [ + "entity/witch/hurt1", + "entity/witch/hurt2", + "entity/witch/hurt3" + ], + "subtitle": "subtitles.entity.witch.hurt" + }, + "entity.witch.throw": { + "sounds": [ + "entity/witch/throw1", + "entity/witch/throw2", + "entity/witch/throw3" + ], + "subtitle": "subtitles.entity.witch.throw" + }, + "entity.wither.ambient": { + "sounds": [ + "mob/wither/idle1", + "mob/wither/idle2", + "mob/wither/idle3", + "mob/wither/idle4" + ], + "subtitle": "subtitles.entity.wither.ambient" + }, + "entity.wither.break_block": { + "sounds": [ + "mob/zombie/woodbreak" + ], + "subtitle": "subtitles.entity.wither.shoot" + }, + "entity.wither.death": { + "sounds": [ + "mob/wither/death" + ], + "subtitle": "subtitles.entity.wither.death" + }, + "entity.wither.hurt": { + "sounds": [ + "mob/wither/hurt1", + "mob/wither/hurt2", + "mob/wither/hurt3", + "mob/wither/hurt4" + ], + "subtitle": "subtitles.entity.wither.hurt" + }, + "entity.wither.shoot": { + "sounds": [ + "mob/wither/shoot" + ], + "subtitle": "subtitles.entity.wither.shoot" + }, + "entity.wither.spawn": { + "sounds": [ + "mob/wither/spawn" + ], + "subtitle": "subtitles.entity.wither.spawn" + }, + "entity.wither_skeleton.ambient": { + "sounds": [ + "mob/wither_skeleton/idle1", + "mob/wither_skeleton/idle2", + "mob/wither_skeleton/idle3" + ], + "subtitle": "subtitles.entity.wither_skeleton.ambient" + }, + "entity.wither_skeleton.death": { + "sounds": [ + "mob/wither_skeleton/death1", + "mob/wither_skeleton/death2" + ], + "subtitle": "subtitles.entity.wither_skeleton.death" + }, + "entity.wither_skeleton.hurt": { + "sounds": [ + "mob/wither_skeleton/hurt1", + "mob/wither_skeleton/hurt2", + "mob/wither_skeleton/hurt3", + "mob/wither_skeleton/hurt4" + ], + "subtitle": "subtitles.entity.wither_skeleton.hurt" + }, + "entity.wither_skeleton.step": { + "sounds": [ + "mob/wither_skeleton/step1", + "mob/wither_skeleton/step2", + "mob/wither_skeleton/step3", + "mob/wither_skeleton/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.wolf.ambient": { + "sounds": [ + "mob/wolf/bark1", + "mob/wolf/bark2", + "mob/wolf/bark3" + ], + "subtitle": "subtitles.entity.wolf.ambient" + }, + "entity.wolf.death": { + "sounds": [ + "mob/wolf/death" + ], + "subtitle": "subtitles.entity.wolf.death" + }, + "entity.wolf.growl": { + "sounds": [ + "mob/wolf/growl1", + "mob/wolf/growl2", + "mob/wolf/growl3" + ], + "subtitle": "subtitles.entity.wolf.growl" + }, + "entity.wolf.howl": { + "sounds": [ + "mob/wolf/howl1", + "mob/wolf/howl2" + ] + }, + "entity.wolf.hurt": { + "sounds": [ + "mob/wolf/hurt1", + "mob/wolf/hurt2", + "mob/wolf/hurt3" + ], + "subtitle": "subtitles.entity.wolf.hurt" + }, + "entity.wolf.pant": { + "sounds": [ + "mob/wolf/panting" + ], + "subtitle": "subtitles.entity.wolf.ambient" + }, + "entity.wolf.shake": { + "sounds": [ + "mob/wolf/shake" + ], + "subtitle": "subtitles.entity.wolf.shake" + }, + "entity.wolf.step": { + "sounds": [ + "mob/wolf/step1", + "mob/wolf/step2", + "mob/wolf/step3", + "mob/wolf/step4", + "mob/wolf/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.wolf.whine": { + "sounds": [ + "mob/wolf/whine" + ], + "subtitle": "subtitles.entity.wolf.ambient" + }, + "entity.zoglin.ambient": { + "sounds": [ + { + "name": "mob/zoglin/idle1", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle1", + "pitch": 0.8, + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle2", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle3", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle4", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle5", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.zoglin.ambient" + }, + "entity.zoglin.angry": { + "sounds": [ + { + "name": "mob/zoglin/angry1", + "volume": 0.8 + }, + { + "name": "mob/zoglin/angry2", + "volume": 0.8 + }, + { + "name": "mob/zoglin/angry3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.zoglin.angry" + }, + "entity.zoglin.attack": { + "sounds": [ + { + "name": "mob/zoglin/attack1", + "volume": 0.8 + }, + { + "name": "mob/zoglin/attack1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/zoglin/attack2", + "volume": 0.8 + }, + { + "name": "mob/zoglin/attack2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.zoglin.attack" + }, + "entity.zoglin.death": { + "sounds": [ + { + "name": "mob/zoglin/death1", + "volume": 0.93 + }, + { + "name": "mob/zoglin/death2", + "volume": 0.93 + }, + { + "name": "mob/zoglin/death3", + "volume": 0.93 + } + ], + "subtitle": "subtitles.entity.zoglin.death" + }, + "entity.zoglin.hurt": { + "sounds": [ + { + "name": "mob/zoglin/hurt1", + "volume": 0.83 + }, + { + "name": "mob/zoglin/hurt2", + "volume": 0.9 + }, + { + "name": "mob/zoglin/hurt3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.zoglin.hurt" + }, + "entity.zoglin.step": { + "sounds": [ + "mob/zoglin/step1", + "mob/zoglin/step2", + "mob/zoglin/step3", + "mob/zoglin/step4", + "mob/zoglin/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.zombie.ambient": { + "sounds": [ + "mob/zombie/say1", + "mob/zombie/say2", + "mob/zombie/say3" + ], + "subtitle": "subtitles.entity.zombie.ambient" + }, + "entity.zombie.attack_iron_door": { + "sounds": [ + "mob/zombie/metal1", + "mob/zombie/metal2", + "mob/zombie/metal3" + ], + "subtitle": "subtitles.block.generic.break" + }, + "entity.zombie.attack_wooden_door": { + "sounds": [ + "mob/zombie/wood1", + "mob/zombie/wood2", + "mob/zombie/wood3", + "mob/zombie/wood4" + ], + "subtitle": "subtitles.entity.zombie.attack_wooden_door" + }, + "entity.zombie.break_wooden_door": { + "sounds": [ + "mob/zombie/woodbreak" + ], + "subtitle": "subtitles.entity.zombie.break_wooden_door" + }, + "entity.zombie.converted_to_drowned": { + "sounds": [ + "mob/drowned/convert1", + "mob/drowned/convert2", + "mob/drowned/convert3" + ], + "subtitle": "subtitles.entity.zombie.converted_to_drowned" + }, + "entity.zombie.death": { + "sounds": [ + "mob/zombie/death" + ], + "subtitle": "subtitles.entity.zombie.death" + }, + "entity.zombie.destroy_egg": { + "sounds": [ + "mob/turtle/egg/jump_egg1", + "mob/turtle/egg/jump_egg2", + "mob/turtle/egg/jump_egg3", + "mob/turtle/egg/jump_egg4" + ], + "subtitle": "subtitles.entity.zombie.destroy_egg" + }, + "entity.zombie.hurt": { + "sounds": [ + "mob/zombie/hurt1", + "mob/zombie/hurt2" + ], + "subtitle": "subtitles.entity.zombie.hurt" + }, + "entity.zombie.infect": { + "sounds": [ + "mob/zombie/infect" + ], + "subtitle": "subtitles.entity.zombie.infect" + }, + "entity.zombie.step": { + "sounds": [ + "mob/zombie/step1", + "mob/zombie/step2", + "mob/zombie/step3", + "mob/zombie/step4", + "mob/zombie/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.zombie_horse.ambient": { + "sounds": [ + "mob/horse/zombie/idle1", + "mob/horse/zombie/idle2", + "mob/horse/zombie/idle3" + ], + "subtitle": "subtitles.entity.zombie_horse.ambient" + }, + "entity.zombie_horse.death": { + "sounds": [ + "mob/horse/zombie/death" + ], + "subtitle": "subtitles.entity.zombie_horse.death" + }, + "entity.zombie_horse.hurt": { + "sounds": [ + "mob/horse/zombie/hit1", + "mob/horse/zombie/hit2", + "mob/horse/zombie/hit3", + "mob/horse/zombie/hit4" + ], + "subtitle": "subtitles.entity.zombie_horse.hurt" + }, + "entity.zombie_villager.ambient": { + "sounds": [ + "mob/zombie_villager/say1", + "mob/zombie_villager/say2", + "mob/zombie_villager/say3" + ], + "subtitle": "subtitles.entity.zombie_villager.ambient" + }, + "entity.zombie_villager.converted": { + "sounds": [ + "mob/zombie/unfect" + ], + "subtitle": "subtitles.entity.zombie_villager.converted" + }, + "entity.zombie_villager.cure": { + "sounds": [ + "mob/zombie/remedy" + ], + "subtitle": "subtitles.entity.zombie_villager.cure" + }, + "entity.zombie_villager.death": { + "sounds": [ + "mob/zombie_villager/death" + ], + "subtitle": "subtitles.entity.zombie_villager.death" + }, + "entity.zombie_villager.hurt": { + "sounds": [ + "mob/zombie_villager/hurt1", + "mob/zombie_villager/hurt2" + ], + "subtitle": "subtitles.entity.zombie_villager.hurt" + }, + "entity.zombie_villager.step": { + "sounds": [ + "mob/zombie/step1", + "mob/zombie/step2", + "mob/zombie/step3", + "mob/zombie/step4", + "mob/zombie/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.zombified_piglin.ambient": { + "sounds": [ + "mob/zombified_piglin/zpig1", + "mob/zombified_piglin/zpig2", + "mob/zombified_piglin/zpig3", + "mob/zombified_piglin/zpig4" + ], + "subtitle": "subtitles.entity.zombified_piglin.ambient" + }, + "entity.zombified_piglin.angry": { + "sounds": [ + "mob/zombified_piglin/zpigangry1", + "mob/zombified_piglin/zpigangry2", + "mob/zombified_piglin/zpigangry3", + "mob/zombified_piglin/zpigangry4" + ], + "subtitle": "subtitles.entity.zombified_piglin.angry" + }, + "entity.zombified_piglin.death": { + "sounds": [ + "mob/zombified_piglin/zpigdeath" + ], + "subtitle": "subtitles.entity.zombified_piglin.death" + }, + "entity.zombified_piglin.hurt": { + "sounds": [ + "mob/zombified_piglin/zpighurt1", + "mob/zombified_piglin/zpighurt2" + ], + "subtitle": "subtitles.entity.zombified_piglin.hurt" + }, + "event.mob_effect.bad_omen": { + "sounds": [ + "event/mob_effects/bad_omen" + ], + "subtitle": "subtitles.event.mob_effect.bad_omen" + }, + "event.mob_effect.raid_omen": { + "sounds": [ + "event/mob_effects/raid_omen" + ], + "subtitle": "subtitles.event.mob_effect.raid_omen" + }, + "event.mob_effect.trial_omen": { + "sounds": [ + "event/mob_effects/trial_omen" + ], + "subtitle": "subtitles.event.mob_effect.trial_omen" + }, + "event.raid.horn": { + "sounds": [ + { + "name": "event/raid/raidhorn_01", + "volume": 0.01 + }, + { + "name": "event/raid/raidhorn_02", + "volume": 0.01 + }, + { + "name": "event/raid/raidhorn_03", + "volume": 0.01 + }, + { + "name": "event/raid/raidhorn_04", + "volume": 0.01 + } + ], + "subtitle": "subtitles.event.raid.horn" + }, + "item.armor.equip_chain": { + "sounds": [ + "item/armor/equip_chain1", + "item/armor/equip_chain2", + "item/armor/equip_chain3", + "item/armor/equip_chain4", + "item/armor/equip_chain5", + "item/armor/equip_chain6" + ], + "subtitle": "subtitles.item.armor.equip_chain" + }, + "item.armor.equip_diamond": { + "sounds": [ + "item/armor/equip_diamond1", + "item/armor/equip_diamond2", + "item/armor/equip_diamond3", + "item/armor/equip_diamond4", + "item/armor/equip_diamond5", + "item/armor/equip_diamond6" + ], + "subtitle": "subtitles.item.armor.equip_diamond" + }, + "item.armor.equip_elytra": { + "sounds": [ + "item/armor/equip_leather1", + "item/armor/equip_leather2", + "item/armor/equip_leather3", + "item/armor/equip_leather4", + "item/armor/equip_leather5", + "item/armor/equip_leather6" + ], + "subtitle": "subtitles.item.armor.equip_elytra" + }, + "item.armor.equip_generic": { + "sounds": [ + "item/armor/equip_generic1", + "item/armor/equip_generic2", + "item/armor/equip_generic3", + "item/armor/equip_generic4", + "item/armor/equip_generic5", + "item/armor/equip_generic6" + ], + "subtitle": "subtitles.item.armor.equip" + }, + "item.armor.equip_gold": { + "sounds": [ + "item/armor/equip_gold1", + "item/armor/equip_gold2", + "item/armor/equip_gold3", + "item/armor/equip_gold4", + "item/armor/equip_gold5", + "item/armor/equip_gold6" + ], + "subtitle": "subtitles.item.armor.equip_gold" + }, + "item.armor.equip_iron": { + "sounds": [ + "item/armor/equip_iron1", + "item/armor/equip_iron2", + "item/armor/equip_iron3", + "item/armor/equip_iron4", + "item/armor/equip_iron5", + "item/armor/equip_iron6" + ], + "subtitle": "subtitles.item.armor.equip_iron" + }, + "item.armor.equip_leather": { + "sounds": [ + "item/armor/equip_leather1", + "item/armor/equip_leather2", + "item/armor/equip_leather3", + "item/armor/equip_leather4", + "item/armor/equip_leather5", + "item/armor/equip_leather6" + ], + "subtitle": "subtitles.item.armor.equip_leather" + }, + "item.armor.equip_netherite": { + "sounds": [ + { + "name": "item/armor/equip_netherite1", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite1", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite2", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite2", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite3", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite3", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite4", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite4", + "pitch": 0.9, + "volume": 0.8 + } + ], + "subtitle": "subtitles.item.armor.equip_netherite" + }, + "item.armor.equip_turtle": { + "sounds": [ + "mob/turtle/armor", + { + "name": "mob/turtle/armor", + "pitch": 0.85 + }, + { + "name": "mob/turtle/armor", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.armor.equip_turtle" + }, + "item.armor.equip_wolf": { + "sounds": [ + "item/armor/equip_wolf1", + { + "name": "item/armor/equip_wolf1", + "pitch": 1.1 + }, + "item/armor/equip_wolf2", + { + "name": "item/armor/equip_wolf2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.armor.equip_wolf" + }, + "item.armor.unequip_wolf": { + "sounds": [ + "item/armor/unequip_wolf1", + "item/armor/unequip_wolf2" + ], + "subtitle": "subtitles.item.armor.unequip_wolf" + }, + "item.axe.scrape": { + "sounds": [ + "item/axe/scrape1", + { + "name": "item/axe/scrape1", + "pitch": 0.9 + }, + { + "name": "item/axe/scrape1", + "pitch": 1.1 + }, + "item/axe/scrape2", + { + "name": "item/axe/scrape2", + "pitch": 0.9 + }, + { + "name": "item/axe/scrape2", + "pitch": 1.1 + }, + "item/axe/scrape3", + { + "name": "item/axe/scrape3", + "pitch": 0.9 + }, + { + "name": "item/axe/scrape3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.axe.scrape" + }, + "item.axe.strip": { + "sounds": [ + { + "name": "item/axe/strip1", + "volume": 0.9 + }, + { + "name": "item/axe/strip1", + "pitch": 0.85, + "volume": 0.9 + }, + { + "name": "item/axe/strip2", + "volume": 0.9 + }, + { + "name": "item/axe/strip2", + "pitch": 0.85, + "volume": 0.9 + }, + { + "name": "item/axe/strip3", + "volume": 0.9 + }, + { + "name": "item/axe/strip3", + "pitch": 0.85, + "volume": 0.9 + }, + { + "name": "item/axe/strip4", + "volume": 0.9 + }, + { + "name": "item/axe/strip4", + "pitch": 0.85, + "volume": 0.9 + } + ], + "subtitle": "subtitles.item.axe.strip" + }, + "item.axe.wax_off": { + "sounds": [ + "item/axe/wax_off1", + { + "name": "item/axe/wax_off1", + "pitch": 0.9 + }, + { + "name": "item/axe/wax_off1", + "pitch": 1.1 + }, + "item/axe/wax_off2", + { + "name": "item/axe/wax_off2", + "pitch": 0.9 + }, + { + "name": "item/axe/wax_off2", + "pitch": 1.1 + }, + "item/axe/wax_off3", + { + "name": "item/axe/wax_off3", + "pitch": 0.9 + }, + { + "name": "item/axe/wax_off3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.axe.wax_off" + }, + "item.bone_meal.use": { + "sounds": [ + "item/bonemeal/bonemeal1", + { + "name": "item/bonemeal/bonemeal1", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal1", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal2", + { + "name": "item/bonemeal/bonemeal2", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal2", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal3", + { + "name": "item/bonemeal/bonemeal3", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal3", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal4", + { + "name": "item/bonemeal/bonemeal4", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal4", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal5", + { + "name": "item/bonemeal/bonemeal5", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal5", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bone_meal.use" + }, + "item.book.page_turn": { + "sounds": [ + { + "name": "item/book/open_flip1", + "volume": 2.0 + }, + { + "name": "item/book/open_flip2", + "volume": 2.0 + }, + { + "name": "item/book/open_flip3", + "volume": 2.0 + } + ], + "subtitle": "subtitles.item.book.page_turn" + }, + "item.book.put": { + "sounds": [ + "item/book/close_put1", + "item/book/close_put2" + ], + "subtitle": "subtitles.item.book.put" + }, + "item.bottle.empty": { + "sounds": [ + "item/bottle/empty1", + "item/bottle/empty2" + ], + "subtitle": "subtitles.item.bottle.empty" + }, + "item.bottle.fill": { + "sounds": [ + "item/bottle/fill1", + "item/bottle/fill2", + "item/bottle/fill3", + "item/bottle/fill4" + ], + "subtitle": "subtitles.item.bottle.fill" + }, + "item.bottle.fill_dragonbreath": { + "sounds": [ + "item/bottle/fill_dragonbreath1", + "item/bottle/fill_dragonbreath2" + ], + "subtitle": "subtitles.item.bottle.fill" + }, + "item.brush.brushing.generic": { + "sounds": [ + { + "name": "item/brush/brushing_generic1", + "pitch": 0.8, + "volume": 0.4 + }, + { + "name": "item/brush/brushing_generic2", + "pitch": 0.8, + "volume": 0.4 + }, + { + "name": "item/brush/brushing_generic3", + "pitch": 0.8, + "volume": 0.4 + }, + { + "name": "item/brush/brushing_generic4", + "pitch": 0.8, + "volume": 0.4 + } + ], + "subtitle": "subtitles.item.brush.brushing.generic" + }, + "item.brush.brushing.gravel": { + "sounds": [ + { + "name": "item/brush/brushing_gravel1", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_gravel2", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_gravel3", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_gravel4", + "pitch": 0.6, + "volume": 0.6 + } + ], + "subtitle": "subtitles.item.brush.brushing.gravel" + }, + "item.brush.brushing.gravel.complete": { + "sounds": [ + "item/brush/brushing_gravel_complete1", + "item/brush/brushing_gravel_complete2", + "item/brush/brushing_gravel_complete3", + "item/brush/brushing_gravel_complete4" + ], + "subtitle": "subtitles.item.brush.brushing.gravel.complete" + }, + "item.brush.brushing.sand": { + "sounds": [ + { + "name": "item/brush/brushing_sand1", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_sand2", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_sand3", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_sand4", + "pitch": 0.6, + "volume": 0.6 + } + ], + "subtitle": "subtitles.item.brush.brushing.sand" + }, + "item.brush.brushing.sand.complete": { + "sounds": [ + "item/brush/brush_sand_complete1", + "item/brush/brush_sand_complete2", + "item/brush/brush_sand_complete3", + "item/brush/brush_sand_complete4", + "item/brush/brush_sand_complete5" + ], + "subtitle": "subtitles.item.brush.brushing.sand.complete" + }, + "item.bucket.empty": { + "sounds": [ + "item/bucket/empty1", + { + "name": "item/bucket/empty1", + "pitch": 0.9 + }, + "item/bucket/empty2", + "item/bucket/empty3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_axolotl": { + "sounds": [ + "item/bucket/empty_fish1", + "item/bucket/empty_fish2", + "item/bucket/empty_fish3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_fish": { + "sounds": [ + "item/bucket/empty_fish1", + "item/bucket/empty_fish2", + "item/bucket/empty_fish3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_lava": { + "sounds": [ + "item/bucket/empty_lava1", + "item/bucket/empty_lava2", + "item/bucket/empty_lava3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_powder_snow": { + "sounds": [ + "item/bucket/empty_powder_snow1", + { + "name": "item/bucket/empty_powder_snow1", + "pitch": 0.95 + }, + { + "name": "item/bucket/empty_powder_snow1", + "pitch": 1.1 + }, + "item/bucket/empty_powder_snow2", + { + "name": "item/bucket/empty_powder_snow2", + "pitch": 0.95 + }, + { + "name": "item/bucket/empty_powder_snow2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_tadpole": { + "sounds": [ + { + "name": "item/bucket/empty_fish1", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/empty_fish2", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/empty_fish3", + "pitch": 1.5, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.fill": { + "sounds": [ + "item/bucket/fill1", + "item/bucket/fill2", + "item/bucket/fill3" + ], + "subtitle": "subtitles.item.bucket.fill" + }, + "item.bucket.fill_axolotl": { + "sounds": [ + "item/bucket/fill_axolotl1", + "item/bucket/fill_axolotl2", + "item/bucket/fill_axolotl3" + ], + "subtitle": "subtitles.item.bucket.fill_axolotl" + }, + "item.bucket.fill_fish": { + "sounds": [ + "item/bucket/fill_fish1", + "item/bucket/fill_fish2", + "item/bucket/fill_fish3" + ], + "subtitle": "subtitles.item.bucket.fill_fish" + }, + "item.bucket.fill_lava": { + "sounds": [ + "item/bucket/fill_lava1", + "item/bucket/fill_lava2", + "item/bucket/fill_lava3" + ], + "subtitle": "subtitles.item.bucket.fill" + }, + "item.bucket.fill_powder_snow": { + "sounds": [ + "item/bucket/fill_powder_snow1", + { + "name": "item/bucket/fill_powder_snow1", + "pitch": 0.9 + }, + { + "name": "item/bucket/fill_powder_snow1", + "pitch": 1.1 + }, + "item/bucket/fill_powder_snow2", + { + "name": "item/bucket/fill_powder_snow2", + "pitch": 0.9 + }, + { + "name": "item/bucket/fill_powder_snow2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bucket.fill" + }, + "item.bucket.fill_tadpole": { + "sounds": [ + { + "name": "item/bucket/fill_fish1", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/fill_fish2", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/fill_fish3", + "pitch": 1.5, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.bucket.fill_tadpole" + }, + "item.bundle.drop_contents": { + "sounds": [ + "item/bundle/drop_contents1", + { + "name": "item/bundle/drop_contents1", + "pitch": 0.95 + }, + "item/bundle/drop_contents2", + { + "name": "item/bundle/drop_contents2", + "pitch": 0.95 + }, + "item/bundle/drop_contents3", + { + "name": "item/bundle/drop_contents3", + "pitch": 0.95 + } + ], + "subtitle": "subtitles.item.bundle.drop_contents" + }, + "item.bundle.insert": { + "sounds": [ + "item/bundle/insert1", + { + "name": "item/bundle/insert1", + "pitch": 0.95 + }, + { + "name": "item/bundle/insert1", + "pitch": 1.05 + }, + "item/bundle/insert2", + { + "name": "item/bundle/insert2", + "pitch": 0.95 + }, + { + "name": "item/bundle/insert2", + "pitch": 1.05 + }, + "item/bundle/insert3", + { + "name": "item/bundle/insert3", + "pitch": 0.95 + }, + { + "name": "item/bundle/insert3", + "pitch": 1.05 + } + ], + "subtitle": "subtitles.item.bundle.insert" + }, + "item.bundle.insert_fail": { + "sounds": [ + "item/bundle/insert_fail" + ], + "subtitle": "subtitles.item.bundle.insert_fail" + }, + "item.bundle.remove_one": { + "sounds": [ + "item/bundle/remove_one1", + { + "name": "item/bundle/remove_one1", + "pitch": 1.05 + }, + { + "name": "item/bundle/remove_one1", + "pitch": 1.1 + }, + "item/bundle/remove_one2", + { + "name": "item/bundle/remove_one2", + "pitch": 1.05 + }, + { + "name": "item/bundle/remove_one2", + "pitch": 1.1 + }, + "item/bundle/remove_one3", + { + "name": "item/bundle/remove_one3", + "pitch": 1.05 + }, + { + "name": "item/bundle/remove_one3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bundle.remove_one" + }, + "item.chorus_fruit.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.item.chorus_fruit.teleport" + }, + "item.crop.plant": { + "sounds": [ + { + "name": "item/plant/crop1", + "volume": 0.45 + }, + { + "name": "item/plant/crop1", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop2", + "volume": 0.45 + }, + { + "name": "item/plant/crop2", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop3", + "volume": 0.45 + }, + { + "name": "item/plant/crop3", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop4", + "volume": 0.45 + }, + { + "name": "item/plant/crop4", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop5", + "volume": 0.45 + }, + { + "name": "item/plant/crop5", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop6", + "volume": 0.45 + }, + { + "name": "item/plant/crop6", + "pitch": 1.2, + "volume": 0.45 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "item.crossbow.hit": { + "sounds": [ + "random/bowhit1", + "random/bowhit2", + "random/bowhit3", + "random/bowhit4" + ], + "subtitle": "subtitles.item.crossbow.hit" + }, + "item.crossbow.loading_end": { + "sounds": [ + "item/crossbow/loading_end" + ], + "subtitle": "subtitles.item.crossbow.load" + }, + "item.crossbow.loading_middle": { + "sounds": [ + { + "name": "item/crossbow/loading_middle1", + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle1", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle1", + "pitch": 1.2, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle2", + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle2", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle2", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle3", + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle3", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle3", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.loading_start": { + "sounds": [ + { + "name": "item/crossbow/loading_start", + "volume": 0.3 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.quick_charge_1": { + "sounds": [ + { + "name": "item/crossbow/quick_charge/quick1_1", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick1_1", + "pitch": 0.9, + "volume": 0.5 + }, + { + "name": "item/crossbow/quick_charge/quick1_2", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick1_2", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick1_3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.quick_charge_2": { + "sounds": [ + { + "name": "item/crossbow/quick_charge/quick2_1", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_1", + "pitch": 0.95, + "volume": 0.5 + }, + { + "name": "item/crossbow/quick_charge/quick2_2", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_2", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_2", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_3", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_3", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_3", + "pitch": 1.05, + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.quick_charge_3": { + "sounds": [ + { + "name": "item/crossbow/quick_charge/quick3_1", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_1", + "pitch": 0.95, + "volume": 0.5 + }, + { + "name": "item/crossbow/quick_charge/quick3_2", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_2", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_2", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_3", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_3", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_3", + "pitch": 1.05, + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.shoot": { + "sounds": [ + { + "name": "item/crossbow/shoot1", + "volume": 0.8 + }, + { + "name": "item/crossbow/shoot1", + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot2", + "volume": 0.8 + }, + { + "name": "item/crossbow/shoot2", + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot3", + "volume": 0.8 + }, + { + "name": "item/crossbow/shoot3", + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot3", + "pitch": 0.9, + "volume": 0.9 + } + ], + "subtitle": "subtitles.item.crossbow.shoot" + }, + "item.dye.use": { + "sounds": [ + "item/dye/dye", + { + "name": "item/dye/dye", + "pitch": 0.9 + }, + { + "name": "item/dye/dye", + "pitch": 0.95 + }, + { + "name": "item/dye/dye", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.dye.use" + }, + "item.elytra.flying": { + "sounds": [ + { + "name": "item/elytra/elytra_loop", + "volume": 0.6 + } + ], + "subtitle": "subtitles.item.elytra.flying" + }, + "item.firecharge.use": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.item.firecharge.use" + }, + "item.flintandsteel.use": { + "sounds": [ + "fire/ignite" + ], + "subtitle": "subtitles.item.flintandsteel.use" + }, + "item.glow_ink_sac.use": { + "sounds": [ + "item/ink_sac/ink_sac1", + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.95 + }, + { + "name": "item/ink_sac/ink_sac1", + "pitch": 1.05 + }, + "item/ink_sac/ink_sac2", + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.95 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 1.05 + }, + "item/ink_sac/ink_sac3", + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.95 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 1.05 + } + ], + "subtitle": "subtitles.item.glow_ink_sac.use" + }, + "item.goat_horn.sound.0": { + "sounds": [ + "item/goat_horn/call0" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.1": { + "sounds": [ + "item/goat_horn/call1" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.2": { + "sounds": [ + "item/goat_horn/call2" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.3": { + "sounds": [ + "item/goat_horn/call3" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.4": { + "sounds": [ + "item/goat_horn/call4" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.5": { + "sounds": [ + "item/goat_horn/call5" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.6": { + "sounds": [ + "item/goat_horn/call6" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.7": { + "sounds": [ + "item/goat_horn/call7" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.hoe.till": { + "sounds": [ + "item/hoe/till1", + "item/hoe/till2", + "item/hoe/till3", + "item/hoe/till4" + ], + "subtitle": "subtitles.item.hoe.till" + }, + "item.honey_bottle.drink": { + "sounds": [ + "item/bottle/drink_honey1", + "item/bottle/drink_honey2", + { + "name": "item/bottle/drink_honey3", + "volume": 0.35 + }, + { + "name": "item/bottle/drink_honey3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.item.honey_bottle.drink" + }, + "item.honeycomb.wax_on": { + "sounds": [ + "item/honeycomb/wax_on1", + { + "name": "item/honeycomb/wax_on1", + "pitch": 0.9 + }, + { + "name": "item/honeycomb/wax_on1", + "pitch": 1.1 + }, + "item/honeycomb/wax_on2", + { + "name": "item/honeycomb/wax_on2", + "pitch": 0.9 + }, + { + "name": "item/honeycomb/wax_on2", + "pitch": 1.1 + }, + "item/honeycomb/wax_on3", + { + "name": "item/honeycomb/wax_on3", + "pitch": 0.9 + }, + { + "name": "item/honeycomb/wax_on3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.honeycomb.wax_on" + }, + "item.ink_sac.use": { + "sounds": [ + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.85 + }, + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.88 + }, + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.9 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.85 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.88 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.9 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.85 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.88 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.item.ink_sac.use" + }, + "item.lodestone_compass.lock": { + "sounds": [ + { + "name": "block/lodestone/lock1", + "pitch": 0.85 + }, + { + "name": "block/lodestone/lock1", + "pitch": 0.95 + }, + { + "name": "block/lodestone/lock2", + "pitch": 0.85 + }, + { + "name": "block/lodestone/lock2", + "pitch": 0.95 + } + ], + "subtitle": "subtitles.item.lodestone_compass.lock" + }, + "item.mace.smash_air": { + "sounds": [ + "item/mace/smash_air1", + "item/mace/smash_air2", + "item/mace/smash_air3" + ], + "subtitle": "subtitles.item.mace.smash_air" + }, + "item.mace.smash_ground": { + "sounds": [ + "item/mace/smash_ground1", + "item/mace/smash_ground2", + "item/mace/smash_ground3", + "item/mace/smash_ground4" + ], + "subtitle": "subtitles.item.mace.smash_ground" + }, + "item.mace.smash_ground_heavy": { + "sounds": [ + "item/mace/smash_ground_heavy" + ], + "subtitle": "subtitles.item.mace.smash_ground" + }, + "item.nether_wart.plant": { + "sounds": [ + { + "name": "item/plant/netherwart1", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart1", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 1.12, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "item.ominous_bottle.dispose": { + "sounds": [ + "item/ominous_bottle/dispose" + ], + "subtitle": "subtitles.item.ominous_bottle.dispose" + }, + "item.shield.block": { + "sounds": [ + "item/shield/block1", + "item/shield/block2", + "item/shield/block3", + "item/shield/block4", + "item/shield/block5" + ], + "subtitle": "subtitles.item.shield.block" + }, + "item.shield.break": { + "sounds": [ + "random/break" + ], + "subtitle": "subtitles.entity.item.break" + }, + "item.shovel.flatten": { + "sounds": [ + "item/shovel/flatten1", + "item/shovel/flatten2", + "item/shovel/flatten3", + "item/shovel/flatten4" + ], + "subtitle": "subtitles.item.shovel.flatten" + }, + "item.spyglass.stop_using": { + "sounds": [ + { + "name": "item/spyglass/stop", + "volume": 0.5 + }, + { + "name": "item/spyglass/stop", + "pitch": 0.8, + "volume": 0.5 + }, + { + "name": "item/spyglass/stop", + "pitch": 0.9, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.spyglass.stop_using" + }, + "item.spyglass.use": { + "sounds": [ + { + "name": "item/spyglass/use", + "pitch": 1.15, + "volume": 0.5 + }, + { + "name": "item/spyglass/use", + "pitch": 1.33, + "volume": 0.5 + }, + { + "name": "item/spyglass/use", + "pitch": 1.4, + "volume": 0.5 + }, + { + "name": "item/spyglass/use", + "pitch": 1.55, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.spyglass.use" + }, + "item.totem.use": { + "sounds": [ + "item/totem/use_totem" + ], + "subtitle": "subtitles.item.totem.use" + }, + "item.trident.hit": { + "sounds": [ + "item/trident/pierce1", + "item/trident/pierce2", + "item/trident/pierce3" + ], + "subtitle": "subtitles.item.trident.hit" + }, + "item.trident.hit_ground": { + "sounds": [ + { + "name": "item/trident/ground_impact1", + "volume": 0.9 + }, + { + "name": "item/trident/ground_impact2", + "volume": 0.9 + }, + { + "name": "item/trident/ground_impact3", + "volume": 0.9 + }, + { + "name": "item/trident/ground_impact4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.item.trident.hit_ground" + }, + "item.trident.return": { + "sounds": [ + { + "name": "item/trident/return1", + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.item.trident.return" + }, + "item.trident.riptide_1": { + "sounds": [ + "item/trident/riptide1" + ], + "subtitle": "subtitles.item.trident.riptide" + }, + "item.trident.riptide_2": { + "sounds": [ + "item/trident/riptide2" + ], + "subtitle": "subtitles.item.trident.riptide" + }, + "item.trident.riptide_3": { + "sounds": [ + "item/trident/riptide3" + ], + "subtitle": "subtitles.item.trident.riptide" + }, + "item.trident.throw": { + "sounds": [ + "item/trident/throw1", + "item/trident/throw2" + ], + "subtitle": "subtitles.item.trident.throw" + }, + "item.trident.thunder": { + "sounds": [ + "item/trident/thunder1", + "item/trident/thunder2" + ], + "subtitle": "subtitles.item.trident.thunder" + }, + "item.wolf_armor.break": { + "sounds": [ + "item/armor/break_wolf" + ], + "subtitle": "subtitles.item.wolf_armor.break" + }, + "item.wolf_armor.crack": { + "sounds": [ + "item/armor/crack_wolf1", + "item/armor/crack_wolf2", + "item/armor/crack_wolf3", + "item/armor/crack_wolf4" + ], + "subtitle": "subtitles.item.wolf_armor.crack" + }, + "item.wolf_armor.damage": { + "sounds": [ + "item/armor/damage_wolf1", + "item/armor/damage_wolf2", + "item/armor/damage_wolf3", + "item/armor/damage_wolf4" + ], + "subtitle": "subtitles.item.wolf_armor.damage" + }, + "item.wolf_armor.repair": { + "sounds": [ + "item/armor/repair_wolf1", + "item/armor/repair_wolf2", + "item/armor/repair_wolf3", + "item/armor/repair_wolf4" + ], + "subtitle": "subtitles.item.wolf_armor.repair" + }, + "music.creative": { + "sounds": [ + { + "name": "music.game", + "type": "event" + }, + { + "name": "music/game/creative/aria_math", + "stream": true + }, + { + "name": "music/game/creative/biome_fest", + "stream": true + }, + { + "name": "music/game/creative/blind_spots", + "stream": true + }, + { + "name": "music/game/creative/dreiton", + "stream": true + }, + { + "name": "music/game/creative/haunt_muskie", + "stream": true + }, + { + "name": "music/game/creative/taswell", + "stream": true + } + ] + }, + "music.credits": { + "sounds": [ + { + "name": "music/game/end/alpha", + "stream": true + } + ] + }, + "music.dragon": { + "sounds": [ + { + "name": "music/game/end/boss", + "stream": true + } + ] + }, + "music.end": { + "sounds": [ + { + "name": "music/game/end/the_end", + "stream": true + } + ] + }, + "music.game": { + "sounds": [ + { + "name": "music/game/a_familiar_room", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/komorebi", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/puzzlebox", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/sweden", + "stream": true + }, + { + "name": "music/game/watcher", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/wet_hands", + "stream": true + }, + { + "name": "music/game/yakusoku", + "stream": true, + "volume": 0.8 + } + ] + }, + "music.menu": { + "sounds": [ + { + "name": "music/game/deeper", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/komorebi", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/puzzlebox", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/watcher", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/yakusoku", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/menu/beginning_2", + "stream": true + }, + { + "name": "music/menu/floating_trees", + "stream": true + }, + { + "name": "music/menu/moog_city_2", + "stream": true + }, + { + "name": "music/menu/mutation", + "stream": true + } + ] + }, + "music.nether.basalt_deltas": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/soulsand_valley/so_below", + "stream": true, + "volume": 0.5, + "weight": 7 + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.crimson_forest": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/crimson_forest/chrysopoeia", + "stream": true, + "volume": 0.5, + "weight": 7 + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.nether_wastes": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/nether_wastes/rubedo", + "stream": true, + "volume": 0.5, + "weight": 6 + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.soul_sand_valley": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/soulsand_valley/so_below", + "stream": true, + "volume": 0.5, + "weight": 7 + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.warped_forest": { + "sounds": [] + }, + "music.overworld.badlands": { + "sounds": [ + { + "name": "music/game/crescent_dunes", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.bamboo_jungle": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.cherry_grove": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/sweden", + "stream": true + } + ] + }, + "music.overworld.deep_dark": { + "sounds": [ + { + "name": "music/game/ancestry", + "stream": true + }, + { + "name": "music/game/deeper", + "stream": true, + "volume": 0.4 + } + ] + }, + "music.overworld.desert": { + "sounds": [ + { + "name": "music/game/crescent_dunes", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.dripstone_caves": { + "sounds": [ + { + "name": "music/game/an_ordinary_day", + "stream": true + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/deeper", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/infinite_amethyst", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4, + "weight": 2 + } + ] + }, + "music.overworld.flower_forest": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.forest": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/sweden", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.frozen_peaks": { + "sounds": [ + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.grove": { + "sounds": [ + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/infinite_amethyst", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/sweden", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4 + } + ] + }, + "music.overworld.jagged_peaks": { + "sounds": [ + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.jungle": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.lush_caves": { + "sounds": [ + { + "name": "music/game/an_ordinary_day", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/clark", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4, + "weight": 4 + }, + { + "name": "music/game/mice_on_venus", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/minecraft", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/sweden", + "stream": true, + "weight": 2 + } + ] + }, + "music.overworld.meadow": { + "sounds": [ + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.old_growth_taiga": { + "sounds": [ + { + "name": "music/game/clark", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/danny", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/dry_hands", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/haggstrom", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/key", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/living_mice", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/mice_on_venus", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/minecraft", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/oxygene", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/sweden", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/wet_hands", + "stream": true, + "weight": 3 + } + ] + }, + "music.overworld.snowy_slopes": { + "sounds": [ + { + "name": "music/game/an_ordinary_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.sparse_jungle": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.stony_peaks": { + "sounds": [ + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/eld_unknown", + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.swamp": { + "sounds": [ + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + } + ] + }, + "music.under_water": { + "sounds": [ + { + "name": "music/game/water/axolotl", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/water/dragon_fish", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/water/shuniji", + "stream": true, + "volume": 0.4 + } + ] + }, + "music_disc.11": { + "sounds": [ + { + "name": "records/11", + "stream": true + } + ] + }, + "music_disc.13": { + "sounds": [ + { + "name": "records/13", + "stream": true + } + ] + }, + "music_disc.5": { + "sounds": [ + { + "name": "records/5", + "stream": true + } + ] + }, + "music_disc.blocks": { + "sounds": [ + { + "name": "records/blocks", + "stream": true + } + ] + }, + "music_disc.cat": { + "sounds": [ + { + "name": "records/cat", + "stream": true + } + ] + }, + "music_disc.chirp": { + "sounds": [ + { + "name": "records/chirp", + "stream": true + } + ] + }, + "music_disc.creator": { + "sounds": [ + { + "name": "records/creator", + "stream": true + } + ] + }, + "music_disc.creator_music_box": { + "sounds": [ + { + "name": "records/creator_music_box", + "stream": true + } + ] + }, + "music_disc.far": { + "sounds": [ + { + "name": "records/far", + "stream": true + } + ] + }, + "music_disc.mall": { + "sounds": [ + { + "name": "records/mall", + "stream": true + } + ] + }, + "music_disc.mellohi": { + "sounds": [ + { + "name": "records/mellohi", + "stream": true + } + ] + }, + "music_disc.otherside": { + "sounds": [ + { + "name": "records/otherside", + "stream": true + } + ] + }, + "music_disc.pigstep": { + "sounds": [ + { + "name": "records/pigstep", + "stream": true + } + ] + }, + "music_disc.precipice": { + "sounds": [ + { + "name": "records/precipice", + "stream": true + } + ] + }, + "music_disc.relic": { + "sounds": [ + { + "name": "records/relic", + "stream": true + } + ] + }, + "music_disc.stal": { + "sounds": [ + { + "name": "records/stal", + "stream": true + } + ] + }, + "music_disc.strad": { + "sounds": [ + { + "name": "records/strad", + "stream": true + } + ] + }, + "music_disc.wait": { + "sounds": [ + { + "name": "records/wait", + "stream": true + } + ] + }, + "music_disc.ward": { + "sounds": [ + { + "name": "records/ward", + "stream": true + } + ] + }, + "particle.soul_escape": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed1", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed2", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed3", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed4", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed5", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed6", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed7", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed8", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed9", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed10", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed11", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed12", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed13", + "volume": 0.25 + } + ], + "subtitle": "subtitles.particle.soul_escape" + }, + "ui.button.click": { + "sounds": [ + "random/click_stereo" + ] + }, + "ui.cartography_table.take_result": { + "sounds": [ + "ui/cartography_table/drawmap1", + "ui/cartography_table/drawmap2", + "ui/cartography_table/drawmap3" + ], + "subtitle": "subtitles.ui.cartography_table.take_result" + }, + "ui.hud.bubble_pop": { + "sounds": [ + "ui/hud/hud_bubble" + ], + "subtitle": "subtitles.ui.hud.bubble_pop" + }, + "ui.loom.select_pattern": { + "sounds": [ + "ui/loom/select_pattern1", + "ui/loom/select_pattern2", + "ui/loom/select_pattern3", + "ui/loom/select_pattern4", + "ui/loom/select_pattern5" + ] + }, + "ui.loom.take_result": { + "sounds": [ + { + "name": "ui/loom/take_result1", + "volume": 0.5 + }, + { + "name": "ui/loom/take_result2", + "volume": 0.5 + } + ], + "subtitle": "subtitles.ui.loom.take_result" + }, + "ui.stonecutter.select_recipe": { + "sounds": [ + "random/click" + ] + }, + "ui.stonecutter.take_result": { + "sounds": [ + "ui/stonecutter/cut1", + { + "name": "ui/stonecutter/cut1", + "pitch": 0.92 + }, + "ui/stonecutter/cut2", + { + "name": "ui/stonecutter/cut2", + "pitch": 0.92 + } + ], + "subtitle": "subtitles.ui.stonecutter.take_result" + }, + "ui.toast.challenge_complete": { + "sounds": [ + { + "name": "ui/toast/challenge_complete", + "volume": 0.6 + } + ] + }, + "ui.toast.in": { + "sounds": [ + { + "name": "ui/toast/in", + "volume": 0.4 + } + ] + }, + "ui.toast.out": { + "sounds": [ + { + "name": "ui/toast/out", + "volume": 0.4 + } + ] + }, + "weather.rain": { + "sounds": [ + "ambient/weather/rain1", + "ambient/weather/rain2", + "ambient/weather/rain3", + "ambient/weather/rain4", + "ambient/weather/rain5", + "ambient/weather/rain6", + "ambient/weather/rain7", + "ambient/weather/rain8" + ], + "subtitle": "subtitles.weather.rain" + }, + "weather.rain.above": { + "sounds": [ + "ambient/weather/rain1", + "ambient/weather/rain2", + "ambient/weather/rain3", + "ambient/weather/rain4" + ], + "subtitle": "subtitles.weather.rain" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_boat.json new file mode 100644 index 000000000..5b93e9865 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_button.json new file mode 100644 index 000000000..d5affffa7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_chest_boat.json new file mode 100644 index 000000000..fbac5cb80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_door.json new file mode 100644 index 000000000..7ecc5bbd8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence.json new file mode 100644 index 000000000..4db3c8918 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence_gate.json new file mode 100644 index 000000000..f58755330 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_hanging_sign.json new file mode 100644 index 000000000..16c7c4030 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_leaves.json new file mode 100644 index 000000000..b1ef8fa9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_log.json new file mode 100644 index 000000000..0b9f607e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_planks.json new file mode 100644 index 000000000..3c90abef5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_pressure_plate.json new file mode 100644 index 000000000..318e49ad9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sapling.json new file mode 100644 index 000000000..89e557914 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/acacia_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sign.json new file mode 100644 index 000000000..05032df9c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_slab.json new file mode 100644 index 000000000..bb3480c72 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_stairs.json new file mode 100644 index 000000000..58ab5e2d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_trapdoor.json new file mode 100644 index 000000000..701a68627 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_wood.json new file mode 100644 index 000000000..4a5086de4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/activator_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/activator_rail.json new file mode 100644 index 000000000..9ae2bd074 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/activator_rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/activator_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/air.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/air.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/air.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allay_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allay_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allay_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allium.json new file mode 100644 index 000000000..cf132b4b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/allium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_block.json new file mode 100644 index 000000000..b48995154 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/amethyst_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_bud.json new file mode 100644 index 000000000..d3bd62823 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_bud.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "display": { + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 0, 5, 0 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "thirdperson_righthand": { + "translation": [ 0, 4, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "head": { + "translation": [ 0, 14, -5 ] + }, + "gui": { + "translation": [ 0, 2, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_cluster.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_cluster.json new file mode 100644 index 000000000..abc8c7d35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_cluster.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/amethyst_cluster" + }, + "display": { + "head": { + "translation": [ 0, 14, -5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_shard.json new file mode 100644 index 000000000..a0bab4ff7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/amethyst_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ancient_debris.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ancient_debris.json new file mode 100644 index 000000000..f8c6c3d5f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ancient_debris.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/ancient_debris" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite.json new file mode 100644 index 000000000..d6b76e17b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_slab.json new file mode 100644 index 000000000..4bd787706 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_stairs.json new file mode 100644 index 000000000..03e452df3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_wall.json new file mode 100644 index 000000000..f10f1ec36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/angler_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/angler_pottery_sherd.json new file mode 100644 index 000000000..b805ab216 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/angler_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/angler_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/anvil.json new file mode 100644 index 000000000..9168b26bb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/anvil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/apple.json new file mode 100644 index 000000000..c314b0587 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/archer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/archer_pottery_sherd.json new file mode 100644 index 000000000..1b73b22dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/archer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/archer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_scute.json new file mode 100644 index 000000000..ca4d17d0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_scute.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/armadillo_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armor_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armor_stand.json new file mode 100644 index 000000000..f8f34a7b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armor_stand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/armor_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arms_up_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arms_up_pottery_sherd.json new file mode 100644 index 000000000..94339d522 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arms_up_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/arms_up_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arrow.json new file mode 100644 index 000000000..37689ea02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arrow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_bucket.json new file mode 100644 index 000000000..221f7fa6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/axolotl_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea.json new file mode 100644 index 000000000..062330c7e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/azalea" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea_leaves.json new file mode 100644 index 000000000..6b26318be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/azalea_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azure_bluet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azure_bluet.json new file mode 100644 index 000000000..5d4725150 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azure_bluet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/azure_bluet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/baked_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/baked_potato.json new file mode 100644 index 000000000..b9324fe71 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/baked_potato.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/baked_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo.json new file mode 100644 index 000000000..2a46e1c3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/bamboo" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_block.json new file mode 100644 index 000000000..f75fac0f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_button.json new file mode 100644 index 000000000..c1152b507 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_chest_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_chest_raft.json new file mode 100644 index 000000000..93370902d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_chest_raft.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_chest_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_door.json new file mode 100644 index 000000000..ff7c997db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence.json new file mode 100644 index 000000000..2b11ca8c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence_gate.json new file mode 100644 index 000000000..eba9a06e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_hanging_sign.json new file mode 100644 index 000000000..a634960ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic.json new file mode 100644 index 000000000..6892f31f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_mosaic" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_slab.json new file mode 100644 index 000000000..d7b3e3e2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_mosaic_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_stairs.json new file mode 100644 index 000000000..e6ae86d05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_mosaic_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_planks.json new file mode 100644 index 000000000..4e591abe4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_pressure_plate.json new file mode 100644 index 000000000..8a7a0ff5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_raft.json new file mode 100644 index 000000000..84ded131a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_raft.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_sign.json new file mode 100644 index 000000000..2d6bb57c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_slab.json new file mode 100644 index 000000000..0d94c19fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_stairs.json new file mode 100644 index 000000000..c96c60693 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_trapdoor.json new file mode 100644 index 000000000..cd10b18e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrel.json new file mode 100644 index 000000000..553ec3e04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/barrel" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrier.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrier.json new file mode 100644 index 000000000..080cff20c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrier.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/barrier" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/basalt.json new file mode 100644 index 000000000..eaa67e624 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/basalt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/basalt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bat_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beacon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beacon.json new file mode 100644 index 000000000..b6a014e6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beacon.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/beacon" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bedrock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bedrock.json new file mode 100644 index 000000000..c1b8427e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bedrock.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bedrock" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest.json new file mode 100644 index 000000000..39634a5b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:block/bee_nest_empty", + "overrides" : [ + { + "predicate" : { + "honey_level" : 0 + }, + "model" : "item/bee_nest_empty" + }, + { + "predicate" : { + "honey_level" : 1 + }, + "model" : "item/bee_nest_honey" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_empty.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_empty.json new file mode 100644 index 000000000..ac0aa6236 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_empty.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/bee_nest_bottom", + "front": "minecraft:block/bee_nest_front", + "particle": "minecraft:block/bee_nest_side", + "side": "minecraft:block/bee_nest_side", + "top": "minecraft:block/bee_nest_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_honey.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_honey.json new file mode 100644 index 000000000..25850dbf4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_honey.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/bee_nest_bottom", + "front": "minecraft:block/bee_nest_front_honey", + "particle": "minecraft:block/bee_nest_side", + "side": "minecraft:block/bee_nest_side", + "top": "minecraft:block/bee_nest_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beef.json new file mode 100644 index 000000000..5545b3c82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beef.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive.json new file mode 100644 index 000000000..afc4081bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:block/beehive_empty", + "overrides" : [ + { + "predicate" : { + "honey_level" : 0 + }, + "model" : "item/beehive_empty" + }, + { + "predicate" : { + "honey_level" : 1 + }, + "model" : "item/beehive_honey" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_empty.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_empty.json new file mode 100644 index 000000000..4c875e63a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_empty.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/beehive_end", + "front": "minecraft:block/beehive_front", + "particle": "minecraft:block/beehive_side", + "side": "minecraft:block/beehive_side", + "top": "minecraft:block/beehive_end" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_honey.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_honey.json new file mode 100644 index 000000000..1973867cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_honey.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/beehive_end", + "front": "minecraft:block/beehive_front_honey", + "particle": "minecraft:block/beehive_side", + "side": "minecraft:block/beehive_side", + "top": "minecraft:block/beehive_end" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot.json new file mode 100644 index 000000000..dcc7276a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beetroot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_seeds.json new file mode 100644 index 000000000..d20b2cd44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beetroot_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_soup.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_soup.json new file mode 100644 index 000000000..3a0755d68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_soup.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beetroot_soup" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bell.json new file mode 100644 index 000000000..fe24c1f4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/big_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/big_dripleaf.json new file mode 100644 index 000000000..56cc7f0ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/big_dripleaf.json @@ -0,0 +1,25 @@ +{ + "parent": "minecraft:block/big_dripleaf", + "display": { + "gui": { + "rotation": [ 30, 225, 0 ], + "translation": [ 0, -2, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, -1 ], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 0 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 1.13, 0, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_boat.json new file mode 100644 index 000000000..20f68b32d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_button.json new file mode 100644 index 000000000..f0065c479 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_chest_boat.json new file mode 100644 index 000000000..b7549aeb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_door.json new file mode 100644 index 000000000..2b0e4f916 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence.json new file mode 100644 index 000000000..ca097fb1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence_gate.json new file mode 100644 index 000000000..732026b87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_hanging_sign.json new file mode 100644 index 000000000..9d15f706c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_leaves.json new file mode 100644 index 000000000..4f543d46a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_log.json new file mode 100644 index 000000000..cd42b0b7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_planks.json new file mode 100644 index 000000000..06e3a6d36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_pressure_plate.json new file mode 100644 index 000000000..e8dfb6427 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sapling.json new file mode 100644 index 000000000..3c45f3b6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/birch_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sign.json new file mode 100644 index 000000000..d10beadcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_slab.json new file mode 100644 index 000000000..c17a8e794 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_stairs.json new file mode 100644 index 000000000..ec8fd2b96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_trapdoor.json new file mode 100644 index 000000000..7db49741f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_wood.json new file mode 100644 index 000000000..cd1881b08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bed.json new file mode 100644 index 000000000..c8757a9ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/black_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle.json new file mode 100644 index 000000000..84299e450 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/black_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_back.json new file mode 100644 index 000000000..863e592b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/black_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_front.json new file mode 100644 index 000000000..d0159a8fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/black_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_candle.json new file mode 100644 index 000000000..837c9349a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/black_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_carpet.json new file mode 100644 index 000000000..618d21305 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete.json new file mode 100644 index 000000000..eb5aadc33 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete_powder.json new file mode 100644 index 000000000..03af09ea0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_dye.json new file mode 100644 index 000000000..0502b4054 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/black_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_glazed_terracotta.json new file mode 100644 index 000000000..e1f73ff88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_shulker_box.json new file mode 100644 index 000000000..5f45328d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/black_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass.json new file mode 100644 index 000000000..dfc8fab34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass_pane.json new file mode 100644 index 000000000..75081749e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/black_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_terracotta.json new file mode 100644 index 000000000..eee57e8e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_wool.json new file mode 100644 index 000000000..a0e49abc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone.json new file mode 100644 index 000000000..e4defbd65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_slab.json new file mode 100644 index 000000000..481376f49 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_stairs.json new file mode 100644 index 000000000..83a61e181 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_wall.json new file mode 100644 index 000000000..8c2bc6d61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blade_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blade_pottery_sherd.json new file mode 100644 index 000000000..0795cc804 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blade_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blade_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blast_furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blast_furnace.json new file mode 100644 index 000000000..5189a0134 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blast_furnace.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blast_furnace" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_powder.json new file mode 100644 index 000000000..1e735c193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_powder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blaze_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_rod.json new file mode 100644 index 000000000..2c8c052a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/blaze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bed.json new file mode 100644 index 000000000..59f7f2ba3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle.json new file mode 100644 index 000000000..f6005a3c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blue_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_back.json new file mode 100644 index 000000000..29011ca3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/blue_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_front.json new file mode 100644 index 000000000..0dca2593f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/blue_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_candle.json new file mode 100644 index 000000000..e561230f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_carpet.json new file mode 100644 index 000000000..0ced6287e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete.json new file mode 100644 index 000000000..4c15897c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete_powder.json new file mode 100644 index 000000000..e5f13d4a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_dye.json new file mode 100644 index 000000000..4235b5988 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_glazed_terracotta.json new file mode 100644 index 000000000..f7b0efbbc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_ice.json new file mode 100644 index 000000000..86d267e58 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_ice.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_ice" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_orchid.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_orchid.json new file mode 100644 index 000000000..13449dc1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_orchid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/blue_orchid" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_shulker_box.json new file mode 100644 index 000000000..62a9dfd81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/blue_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass.json new file mode 100644 index 000000000..c3727cd87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass_pane.json new file mode 100644 index 000000000..c48900628 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_terracotta.json new file mode 100644 index 000000000..a89b057d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_wool.json new file mode 100644 index 000000000..22458dbdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bogged_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bogged_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bogged_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bolt_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bolt_armor_trim_smithing_template.json new file mode 100644 index 000000000..dfaada50d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bolt_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bolt_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone.json new file mode 100644 index 000000000..3063401c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone.json @@ -0,0 +1,13 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "item/bone" + }, + "display": { + "head": { + "rotation": [ 0, 0, -45 ], + "translation": [ 0, -4.5, -6.5], + "scale":[ 1, 1, 1 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_block.json new file mode 100644 index 000000000..1374ccda6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bone_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_meal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_meal.json new file mode 100644 index 000000000..60f7c5f09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_meal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bone_meal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/book.json new file mode 100644 index 000000000..1ca201bfe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bookshelf.json new file mode 100644 index 000000000..57943d425 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bookshelf" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bordure_indented_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bordure_indented_banner_pattern.json new file mode 100644 index 000000000..02706b20c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bordure_indented_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bordure_indented_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow.json new file mode 100644 index 000000000..c2128757d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow.json @@ -0,0 +1,50 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/bow" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ -80, 260, -40 ], + "translation": [ -1, -2, 2.5 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ -80, -280, 40 ], + "translation": [ -1, -2, 2.5 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + }, + "overrides": [ + { + "predicate": { + "pulling": 1 + }, + "model": "item/bow_pulling_0" + }, + { + "predicate": { + "pulling": 1, + "pull": 0.65 + }, + "model": "item/bow_pulling_1" + }, + { + "predicate": { + "pulling": 1, + "pull": 0.9 + }, + "model": "item/bow_pulling_2" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_0.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_0.json new file mode 100644 index 000000000..8a44db208 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bow", + "textures": { + "layer0": "item/bow_pulling_0" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_1.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_1.json new file mode 100644 index 000000000..5fd94893b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bow", + "textures": { + "layer0": "item/bow_pulling_1" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_2.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_2.json new file mode 100644 index 000000000..8584d5b3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bow", + "textures": { + "layer0": "item/bow_pulling_2" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bowl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bowl.json new file mode 100644 index 000000000..d6a579ca4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bowl.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bowl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral.json new file mode 100644 index 000000000..68c13d9d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_block.json new file mode 100644 index 000000000..04d112ab0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brain_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_fan.json new file mode 100644 index 000000000..9b00117a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bread.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bread.json new file mode 100644 index 000000000..9f62cd758 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bread.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bread" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_rod.json new file mode 100644 index 000000000..3e621f36d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/breeze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewer_pottery_sherd.json new file mode 100644 index 000000000..88b36e178 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brewer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewing_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewing_stand.json new file mode 100644 index 000000000..414f4eccd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewing_stand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brewing_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick.json new file mode 100644 index 000000000..4ba38e868 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_slab.json new file mode 100644 index 000000000..754deec6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_stairs.json new file mode 100644 index 000000000..2a2318dce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_wall.json new file mode 100644 index 000000000..52dcc04ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bricks.json new file mode 100644 index 000000000..dd257a865 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/broken_elytra.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/broken_elytra.json new file mode 100644 index 000000000..ca77df44f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/broken_elytra.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/broken_elytra" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bed.json new file mode 100644 index 000000000..fd4abaa04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/brown_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle.json new file mode 100644 index 000000000..7f289642b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brown_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_back.json new file mode 100644 index 000000000..bf1e27b07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/brown_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_front.json new file mode 100644 index 000000000..637ad47e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/brown_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_candle.json new file mode 100644 index 000000000..0486b2818 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brown_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_carpet.json new file mode 100644 index 000000000..144ce5ad6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete.json new file mode 100644 index 000000000..7aec153e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete_powder.json new file mode 100644 index 000000000..e228eaaa9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_dye.json new file mode 100644 index 000000000..d9cb87fbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brown_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_glazed_terracotta.json new file mode 100644 index 000000000..8ed9bac45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom.json new file mode 100644 index 000000000..f1779d5c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brown_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom_block.json new file mode 100644 index 000000000..c9d6b06e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_mushroom_block_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_shulker_box.json new file mode 100644 index 000000000..c28ee18a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/brown_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass.json new file mode 100644 index 000000000..a3aac5722 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass_pane.json new file mode 100644 index 000000000..0a40ae5fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brown_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_terracotta.json new file mode 100644 index 000000000..17f524a73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_wool.json new file mode 100644 index 000000000..85520a1bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush.json new file mode 100644 index 000000000..231aa70cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush.json @@ -0,0 +1,43 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, -45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + }, + "overrides": [ + { + "predicate": { + "brushing": 0.25 + }, + "model": "item/brush_brushing_0" + }, + { + "predicate": { + "brushing": 0.5 + }, + "model": "item/brush_brushing_1" + }, + { + "predicate": { + "brushing": 0.75 + }, + "model": "item/brush_brushing_2" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_0.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_0.json new file mode 100644 index 000000000..672921573 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_0.json @@ -0,0 +1,23 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, 0], + "translation": [ -4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_1.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_1.json new file mode 100644 index 000000000..8973ac981 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_1.json @@ -0,0 +1,23 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, -45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_2.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_2.json new file mode 100644 index 000000000..729697bec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_2.json @@ -0,0 +1,23 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 90 ], + "translation": [ -4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, -90 ], + "translation": [ 4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral.json new file mode 100644 index 000000000..8d8ea3f8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_block.json new file mode 100644 index 000000000..05a1309f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bubble_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_fan.json new file mode 100644 index 000000000..40a144167 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bucket.json new file mode 100644 index 000000000..727318a40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/budding_amethyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/budding_amethyst.json new file mode 100644 index 000000000..c210bd6e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/budding_amethyst.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/budding_amethyst" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle.json new file mode 100644 index 000000000..af189a9c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_back.json new file mode 100644 index 000000000..66851f188 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_front.json new file mode 100644 index 000000000..9c2545706 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/burn_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/burn_pottery_sherd.json new file mode 100644 index 000000000..1c81d466b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/burn_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/burn_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cactus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cactus.json new file mode 100644 index 000000000..d1413ecfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cactus.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cactus" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cake.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cake.json new file mode 100644 index 000000000..70a9bd0af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cake.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cake" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calcite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calcite.json new file mode 100644 index 000000000..11a880b3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calcite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/calcite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calibrated_sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calibrated_sculk_sensor.json new file mode 100644 index 000000000..d99476e50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calibrated_sculk_sensor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/calibrated_sculk_sensor_inactive" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/camel_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/camel_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/camel_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/campfire.json new file mode 100644 index 000000000..8042feb6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/campfire.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/candle.json new file mode 100644 index 000000000..9e4f4d11a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot.json new file mode 100644 index 000000000..3fe4125ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot_on_a_stick.json new file mode 100644 index 000000000..a768c1f25 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "minecraft:item/carrot_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cartography_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cartography_table.json new file mode 100644 index 000000000..b7fe4e474 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cartography_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cartography_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carved_pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carved_pumpkin.json new file mode 100644 index 000000000..54f009c07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carved_pumpkin.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/carved_pumpkin" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cat_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cauldron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cauldron.json new file mode 100644 index 000000000..43b8a2480 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cauldron.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cauldron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cave_spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cave_spider_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cave_spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain.json new file mode 100644 index 000000000..c6ed30bf1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chain" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain_command_block.json new file mode 100644 index 000000000..44af865a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain_command_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chain_command_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots.json new file mode 100644 index 000000000..1e54e8c65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_amethyst_trim.json new file mode 100644 index 000000000..14ea3c2b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_copper_trim.json new file mode 100644 index 000000000..d05f56ae5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_diamond_trim.json new file mode 100644 index 000000000..c66f7f1cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_emerald_trim.json new file mode 100644 index 000000000..748078fe8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_gold_trim.json new file mode 100644 index 000000000..6be04b71a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_iron_trim.json new file mode 100644 index 000000000..fc71c6d8b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_lapis_trim.json new file mode 100644 index 000000000..105d7c72d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_netherite_trim.json new file mode 100644 index 000000000..ecc9975e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_quartz_trim.json new file mode 100644 index 000000000..2657964ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_redstone_trim.json new file mode 100644 index 000000000..48eee0190 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate.json new file mode 100644 index 000000000..0bdb24bb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_amethyst_trim.json new file mode 100644 index 000000000..d3af51849 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_copper_trim.json new file mode 100644 index 000000000..7c8c3c439 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_diamond_trim.json new file mode 100644 index 000000000..374ccdb9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_emerald_trim.json new file mode 100644 index 000000000..3e871cda2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_gold_trim.json new file mode 100644 index 000000000..cc80f46da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_iron_trim.json new file mode 100644 index 000000000..81a5242c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_lapis_trim.json new file mode 100644 index 000000000..865560ab4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_netherite_trim.json new file mode 100644 index 000000000..4c9e2289d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_quartz_trim.json new file mode 100644 index 000000000..291441ae8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_redstone_trim.json new file mode 100644 index 000000000..4ee218315 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet.json new file mode 100644 index 000000000..dc35c600d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_amethyst_trim.json new file mode 100644 index 000000000..d1fdcc920 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_copper_trim.json new file mode 100644 index 000000000..ef16e96f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_diamond_trim.json new file mode 100644 index 000000000..e004f2d17 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_emerald_trim.json new file mode 100644 index 000000000..cf1b7fb64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_gold_trim.json new file mode 100644 index 000000000..c83e53433 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_iron_trim.json new file mode 100644 index 000000000..56b43947f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_lapis_trim.json new file mode 100644 index 000000000..8cae5aea5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_netherite_trim.json new file mode 100644 index 000000000..d7b200160 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_quartz_trim.json new file mode 100644 index 000000000..83b8eba24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_redstone_trim.json new file mode 100644 index 000000000..03406139f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings.json new file mode 100644 index 000000000..23bebc655 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_amethyst_trim.json new file mode 100644 index 000000000..7c1b0e8f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_copper_trim.json new file mode 100644 index 000000000..510189833 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_diamond_trim.json new file mode 100644 index 000000000..6344872e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_emerald_trim.json new file mode 100644 index 000000000..747b1f3a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_gold_trim.json new file mode 100644 index 000000000..4d23f0579 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_iron_trim.json new file mode 100644 index 000000000..71034c608 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_lapis_trim.json new file mode 100644 index 000000000..d54897c6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_netherite_trim.json new file mode 100644 index 000000000..ff14a3878 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_quartz_trim.json new file mode 100644 index 000000000..97a0aa847 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_redstone_trim.json new file mode 100644 index 000000000..8117e44af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/charcoal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/charcoal.json new file mode 100644 index 000000000..d50222351 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/charcoal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/charcoal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_boat.json new file mode 100644 index 000000000..dae18f875 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_button.json new file mode 100644 index 000000000..bec3bdc69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_chest_boat.json new file mode 100644 index 000000000..3be1e98f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_door.json new file mode 100644 index 000000000..bd650f606 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence.json new file mode 100644 index 000000000..ffe1fb32f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence_gate.json new file mode 100644 index 000000000..b4137071d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_hanging_sign.json new file mode 100644 index 000000000..0d513d12b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_leaves.json new file mode 100644 index 000000000..0b0683e9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_log.json new file mode 100644 index 000000000..7aceccbdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_planks.json new file mode 100644 index 000000000..d4f8dfeff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_pressure_plate.json new file mode 100644 index 000000000..b207b042a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sapling.json new file mode 100644 index 000000000..44470b530 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cherry_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sign.json new file mode 100644 index 000000000..e82a317d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_slab.json new file mode 100644 index 000000000..507749105 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_stairs.json new file mode 100644 index 000000000..df08ac739 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_trapdoor.json new file mode 100644 index 000000000..19daaafae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_wood.json new file mode 100644 index 000000000..71e59d450 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest.json new file mode 100644 index 000000000..cdfd54886 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest.json @@ -0,0 +1,38 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/oak_planks" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.4, 0.4, 0.4 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest_minecart.json new file mode 100644 index 000000000..bacac30e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chest_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken.json new file mode 100644 index 000000000..661e00acf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chipped_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chipped_anvil.json new file mode 100644 index 000000000..46804e59c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chipped_anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chipped_anvil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_bookshelf.json new file mode 100644 index 000000000..90befea8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_bookshelf_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_copper.json new file mode 100644 index 000000000..b88e810ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_deepslate.json new file mode 100644 index 000000000..811f62f9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_nether_bricks.json new file mode 100644 index 000000000..fb134fe3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_polished_blackstone.json new file mode 100644 index 000000000..a26153457 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_polished_blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_polished_blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_quartz_block.json new file mode 100644 index 000000000..f8b206168 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_quartz_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_quartz_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_red_sandstone.json new file mode 100644 index 000000000..e3ded796d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_sandstone.json new file mode 100644 index 000000000..f62617250 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_stone_bricks.json new file mode 100644 index 000000000..ac7e5e66f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff.json new file mode 100644 index 000000000..845bc289b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_tuff" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff_bricks.json new file mode 100644 index 000000000..6bea9351d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_tuff_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_flower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_flower.json new file mode 100644 index 000000000..dc807298f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_flower.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chorus_flower" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_fruit.json new file mode 100644 index 000000000..8c84c4f33 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_plant.json new file mode 100644 index 000000000..b0741a699 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_plant.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chorus_plant" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay.json new file mode 100644 index 000000000..2510d78a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/clay" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay_ball.json new file mode 100644 index 000000000..1cfb12b5f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay_ball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clay_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock.json new file mode 100644 index 000000000..407b8aa72 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock.json @@ -0,0 +1,73 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/clock_00" + }, + "overrides": [ + { "predicate": { "time": 0.0000000 }, "model": "item/clock" }, + { "predicate": { "time": 0.0078125 }, "model": "item/clock_01" }, + { "predicate": { "time": 0.0234375 }, "model": "item/clock_02" }, + { "predicate": { "time": 0.0390625 }, "model": "item/clock_03" }, + { "predicate": { "time": 0.0546875 }, "model": "item/clock_04" }, + { "predicate": { "time": 0.0703125 }, "model": "item/clock_05" }, + { "predicate": { "time": 0.0859375 }, "model": "item/clock_06" }, + { "predicate": { "time": 0.1015625 }, "model": "item/clock_07" }, + { "predicate": { "time": 0.1171875 }, "model": "item/clock_08" }, + { "predicate": { "time": 0.1328125 }, "model": "item/clock_09" }, + { "predicate": { "time": 0.1484375 }, "model": "item/clock_10" }, + { "predicate": { "time": 0.1640625 }, "model": "item/clock_11" }, + { "predicate": { "time": 0.1796875 }, "model": "item/clock_12" }, + { "predicate": { "time": 0.1953125 }, "model": "item/clock_13" }, + { "predicate": { "time": 0.2109375 }, "model": "item/clock_14" }, + { "predicate": { "time": 0.2265625 }, "model": "item/clock_15" }, + { "predicate": { "time": 0.2421875 }, "model": "item/clock_16" }, + { "predicate": { "time": 0.2578125 }, "model": "item/clock_17" }, + { "predicate": { "time": 0.2734375 }, "model": "item/clock_18" }, + { "predicate": { "time": 0.2890625 }, "model": "item/clock_19" }, + { "predicate": { "time": 0.3046875 }, "model": "item/clock_20" }, + { "predicate": { "time": 0.3203125 }, "model": "item/clock_21" }, + { "predicate": { "time": 0.3359375 }, "model": "item/clock_22" }, + { "predicate": { "time": 0.3515625 }, "model": "item/clock_23" }, + { "predicate": { "time": 0.3671875 }, "model": "item/clock_24" }, + { "predicate": { "time": 0.3828125 }, "model": "item/clock_25" }, + { "predicate": { "time": 0.3984375 }, "model": "item/clock_26" }, + { "predicate": { "time": 0.4140625 }, "model": "item/clock_27" }, + { "predicate": { "time": 0.4296875 }, "model": "item/clock_28" }, + { "predicate": { "time": 0.4453125 }, "model": "item/clock_29" }, + { "predicate": { "time": 0.4609375 }, "model": "item/clock_30" }, + { "predicate": { "time": 0.4765625 }, "model": "item/clock_31" }, + { "predicate": { "time": 0.4921875 }, "model": "item/clock_32" }, + { "predicate": { "time": 0.5078125 }, "model": "item/clock_33" }, + { "predicate": { "time": 0.5234375 }, "model": "item/clock_34" }, + { "predicate": { "time": 0.5390625 }, "model": "item/clock_35" }, + { "predicate": { "time": 0.5546875 }, "model": "item/clock_36" }, + { "predicate": { "time": 0.5703125 }, "model": "item/clock_37" }, + { "predicate": { "time": 0.5859375 }, "model": "item/clock_38" }, + { "predicate": { "time": 0.6015625 }, "model": "item/clock_39" }, + { "predicate": { "time": 0.6171875 }, "model": "item/clock_40" }, + { "predicate": { "time": 0.6328125 }, "model": "item/clock_41" }, + { "predicate": { "time": 0.6484375 }, "model": "item/clock_42" }, + { "predicate": { "time": 0.6640625 }, "model": "item/clock_43" }, + { "predicate": { "time": 0.6796875 }, "model": "item/clock_44" }, + { "predicate": { "time": 0.6953125 }, "model": "item/clock_45" }, + { "predicate": { "time": 0.7109375 }, "model": "item/clock_46" }, + { "predicate": { "time": 0.7265625 }, "model": "item/clock_47" }, + { "predicate": { "time": 0.7421875 }, "model": "item/clock_48" }, + { "predicate": { "time": 0.7578125 }, "model": "item/clock_49" }, + { "predicate": { "time": 0.7734375 }, "model": "item/clock_50" }, + { "predicate": { "time": 0.7890625 }, "model": "item/clock_51" }, + { "predicate": { "time": 0.8046875 }, "model": "item/clock_52" }, + { "predicate": { "time": 0.8203125 }, "model": "item/clock_53" }, + { "predicate": { "time": 0.8359375 }, "model": "item/clock_54" }, + { "predicate": { "time": 0.8515625 }, "model": "item/clock_55" }, + { "predicate": { "time": 0.8671875 }, "model": "item/clock_56" }, + { "predicate": { "time": 0.8828125 }, "model": "item/clock_57" }, + { "predicate": { "time": 0.8984375 }, "model": "item/clock_58" }, + { "predicate": { "time": 0.9140625 }, "model": "item/clock_59" }, + { "predicate": { "time": 0.9296875 }, "model": "item/clock_60" }, + { "predicate": { "time": 0.9453125 }, "model": "item/clock_61" }, + { "predicate": { "time": 0.9609375 }, "model": "item/clock_62" }, + { "predicate": { "time": 0.9765625 }, "model": "item/clock_63" }, + { "predicate": { "time": 0.9921875 }, "model": "item/clock" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_01.json new file mode 100644 index 000000000..fc6b62936 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_02.json new file mode 100644 index 000000000..329f07c4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_03.json new file mode 100644 index 000000000..2f727967d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_04.json new file mode 100644 index 000000000..a29f62930 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_05.json new file mode 100644 index 000000000..c054a610d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_06.json new file mode 100644 index 000000000..45d346d6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_07.json new file mode 100644 index 000000000..6e218b17e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_08.json new file mode 100644 index 000000000..5bacb1d17 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_09.json new file mode 100644 index 000000000..af1b9d9eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_10.json new file mode 100644 index 000000000..f4c66214e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_11.json new file mode 100644 index 000000000..9ddde2ece --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_12.json new file mode 100644 index 000000000..42cdfdde0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_13.json new file mode 100644 index 000000000..a81db14bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_14.json new file mode 100644 index 000000000..5eb2e365f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_15.json new file mode 100644 index 000000000..34b71c539 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_16.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_16.json new file mode 100644 index 000000000..6ad0e2c4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_16.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_16" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_17.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_17.json new file mode 100644 index 000000000..ce4688087 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_17.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_17" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_18.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_18.json new file mode 100644 index 000000000..ecda55f2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_18.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_18" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_19.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_19.json new file mode 100644 index 000000000..750bf76e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_19.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_19" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_20.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_20.json new file mode 100644 index 000000000..aa1136d58 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_20.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_20" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_21.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_21.json new file mode 100644 index 000000000..aabcd1303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_21.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_21" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_22.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_22.json new file mode 100644 index 000000000..0c9cfe8ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_22.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_22" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_23.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_23.json new file mode 100644 index 000000000..18752a4ce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_23.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_23" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_24.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_24.json new file mode 100644 index 000000000..7e875df9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_24.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_24" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_25.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_25.json new file mode 100644 index 000000000..4c939e6a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_25.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_25" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_26.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_26.json new file mode 100644 index 000000000..8039bdef0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_26.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_26" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_27.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_27.json new file mode 100644 index 000000000..76fd7d6e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_27.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_27" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_28.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_28.json new file mode 100644 index 000000000..ef5c699b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_28.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_28" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_29.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_29.json new file mode 100644 index 000000000..f95d697fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_29.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_29" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_30.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_30.json new file mode 100644 index 000000000..328a5161e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_30.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_30" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_31.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_31.json new file mode 100644 index 000000000..28b91d101 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_31.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_31" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_32.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_32.json new file mode 100644 index 000000000..c6d18099b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_32.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_32" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_33.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_33.json new file mode 100644 index 000000000..c5a1932f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_33.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_33" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_34.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_34.json new file mode 100644 index 000000000..584f10d3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_34.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_34" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_35.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_35.json new file mode 100644 index 000000000..aad78040a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_35.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_35" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_36.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_36.json new file mode 100644 index 000000000..d1a8c92bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_36.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_36" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_37.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_37.json new file mode 100644 index 000000000..ef30c8237 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_37.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_37" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_38.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_38.json new file mode 100644 index 000000000..243825acf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_38.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_38" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_39.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_39.json new file mode 100644 index 000000000..59de1c0a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_39.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_39" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_40.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_40.json new file mode 100644 index 000000000..1c629d8f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_40.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_40" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_41.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_41.json new file mode 100644 index 000000000..646d162e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_41.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_41" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_42.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_42.json new file mode 100644 index 000000000..8f3f38d11 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_42.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_42" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_43.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_43.json new file mode 100644 index 000000000..4930ee49d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_43.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_43" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_44.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_44.json new file mode 100644 index 000000000..e98964dad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_44.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_44" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_45.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_45.json new file mode 100644 index 000000000..dd8a50ea7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_45.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_45" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_46.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_46.json new file mode 100644 index 000000000..7bc0f9beb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_46.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_46" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_47.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_47.json new file mode 100644 index 000000000..97835facd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_47.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_47" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_48.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_48.json new file mode 100644 index 000000000..617408133 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_48.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_48" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_49.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_49.json new file mode 100644 index 000000000..3c6067e62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_49.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_49" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_50.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_50.json new file mode 100644 index 000000000..3e30e1d8b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_50.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_50" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_51.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_51.json new file mode 100644 index 000000000..45af5151e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_51.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_51" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_52.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_52.json new file mode 100644 index 000000000..9a28ead08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_52.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_52" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_53.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_53.json new file mode 100644 index 000000000..85176573d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_53.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_53" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_54.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_54.json new file mode 100644 index 000000000..096b67a56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_54.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_54" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_55.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_55.json new file mode 100644 index 000000000..730b22c00 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_55.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_55" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_56.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_56.json new file mode 100644 index 000000000..ad087180d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_56.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_56" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_57.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_57.json new file mode 100644 index 000000000..47711b17c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_57.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_57" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_58.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_58.json new file mode 100644 index 000000000..420370eae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_58.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_58" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_59.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_59.json new file mode 100644 index 000000000..d8ca2ed35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_59.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_59" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_60.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_60.json new file mode 100644 index 000000000..2b50d056d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_60.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_60" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_61.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_61.json new file mode 100644 index 000000000..c0cba9653 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_61.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_61" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_62.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_62.json new file mode 100644 index 000000000..cb92524ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_62.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_62" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_63.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_63.json new file mode 100644 index 000000000..db6691c95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_63.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_63" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal.json new file mode 100644 index 000000000..551d462ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/coal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_block.json new file mode 100644 index 000000000..ee2426737 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/coal_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_ore.json new file mode 100644 index 000000000..d6971d353 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/coal_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coarse_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coarse_dirt.json new file mode 100644 index 000000000..797b7cc79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coarse_dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/coarse_dirt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coast_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coast_armor_trim_smithing_template.json new file mode 100644 index 000000000..598b27c88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coast_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/coast_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate.json new file mode 100644 index 000000000..aceda4d8d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_slab.json new file mode 100644 index 000000000..a4ea4d2d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_stairs.json new file mode 100644 index 000000000..054c8e6cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_wall.json new file mode 100644 index 000000000..25b446455 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone.json new file mode 100644 index 000000000..35e828df6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_slab.json new file mode 100644 index 000000000..701123f08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_stairs.json new file mode 100644 index 000000000..48910bcc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_wall.json new file mode 100644 index 000000000..5c603a85e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobweb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobweb.json new file mode 100644 index 000000000..64ebc0bd1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobweb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cobweb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cocoa_beans.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cocoa_beans.json new file mode 100644 index 000000000..cb83b5d4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cocoa_beans.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cocoa_beans" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod.json new file mode 100644 index 000000000..a36ba0c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod.json @@ -0,0 +1,13 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/cod" + }, + "display": { + "head": { + "rotation": [ 0, 90, -60 ], + "translation": [ -7, -4, -7], + "scale":[ 0.8, 0.8, 0.8] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_bucket.json new file mode 100644 index 000000000..35c4ca0f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cod_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block.json new file mode 100644 index 000000000..43605276d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/command_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block_minecart.json new file mode 100644 index 000000000..7a3cf69b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/command_block_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/comparator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/comparator.json new file mode 100644 index 000000000..6aa4fbe2d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/comparator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/comparator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass.json new file mode 100644 index 000000000..ec66bb16d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass.json @@ -0,0 +1,41 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/compass_16" + }, + "overrides": [ + { "predicate": { "angle": 0.000000 }, "model": "item/compass" }, + { "predicate": { "angle": 0.015625 }, "model": "item/compass_17" }, + { "predicate": { "angle": 0.046875 }, "model": "item/compass_18" }, + { "predicate": { "angle": 0.078125 }, "model": "item/compass_19" }, + { "predicate": { "angle": 0.109375 }, "model": "item/compass_20" }, + { "predicate": { "angle": 0.140625 }, "model": "item/compass_21" }, + { "predicate": { "angle": 0.171875 }, "model": "item/compass_22" }, + { "predicate": { "angle": 0.203125 }, "model": "item/compass_23" }, + { "predicate": { "angle": 0.234375 }, "model": "item/compass_24" }, + { "predicate": { "angle": 0.265625 }, "model": "item/compass_25" }, + { "predicate": { "angle": 0.296875 }, "model": "item/compass_26" }, + { "predicate": { "angle": 0.328125 }, "model": "item/compass_27" }, + { "predicate": { "angle": 0.359375 }, "model": "item/compass_28" }, + { "predicate": { "angle": 0.390625 }, "model": "item/compass_29" }, + { "predicate": { "angle": 0.421875 }, "model": "item/compass_30" }, + { "predicate": { "angle": 0.453125 }, "model": "item/compass_31" }, + { "predicate": { "angle": 0.484375 }, "model": "item/compass_00" }, + { "predicate": { "angle": 0.515625 }, "model": "item/compass_01" }, + { "predicate": { "angle": 0.546875 }, "model": "item/compass_02" }, + { "predicate": { "angle": 0.578125 }, "model": "item/compass_03" }, + { "predicate": { "angle": 0.609375 }, "model": "item/compass_04" }, + { "predicate": { "angle": 0.640625 }, "model": "item/compass_05" }, + { "predicate": { "angle": 0.671875 }, "model": "item/compass_06" }, + { "predicate": { "angle": 0.703125 }, "model": "item/compass_07" }, + { "predicate": { "angle": 0.734375 }, "model": "item/compass_08" }, + { "predicate": { "angle": 0.765625 }, "model": "item/compass_09" }, + { "predicate": { "angle": 0.796875 }, "model": "item/compass_10" }, + { "predicate": { "angle": 0.828125 }, "model": "item/compass_11" }, + { "predicate": { "angle": 0.859375 }, "model": "item/compass_12" }, + { "predicate": { "angle": 0.890625 }, "model": "item/compass_13" }, + { "predicate": { "angle": 0.921875 }, "model": "item/compass_14" }, + { "predicate": { "angle": 0.953125 }, "model": "item/compass_15" }, + { "predicate": { "angle": 0.984375 }, "model": "item/compass" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_00.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_00.json new file mode 100644 index 000000000..dc856843d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_00.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_00" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_01.json new file mode 100644 index 000000000..75d4178dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_02.json new file mode 100644 index 000000000..b91b4ba83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_03.json new file mode 100644 index 000000000..10bf34a65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_04.json new file mode 100644 index 000000000..cf2e7eb7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_05.json new file mode 100644 index 000000000..e78ede9ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_06.json new file mode 100644 index 000000000..3679f2293 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_07.json new file mode 100644 index 000000000..37c1d3102 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_08.json new file mode 100644 index 000000000..706d7fb84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_09.json new file mode 100644 index 000000000..1a0dd1a36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_10.json new file mode 100644 index 000000000..965ec5602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_11.json new file mode 100644 index 000000000..dde2e5592 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_12.json new file mode 100644 index 000000000..ffe3aa7dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_13.json new file mode 100644 index 000000000..985d2d38b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_14.json new file mode 100644 index 000000000..27fc108b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_15.json new file mode 100644 index 000000000..0b72926ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_17.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_17.json new file mode 100644 index 000000000..ddcb506f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_17.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_17" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_18.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_18.json new file mode 100644 index 000000000..5f47bcdbe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_18.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_18" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_19.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_19.json new file mode 100644 index 000000000..256894713 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_19.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_19" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_20.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_20.json new file mode 100644 index 000000000..26b95b334 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_20.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_20" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_21.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_21.json new file mode 100644 index 000000000..0948b81aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_21.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_21" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_22.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_22.json new file mode 100644 index 000000000..a594efd24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_22.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_22" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_23.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_23.json new file mode 100644 index 000000000..8e7b9c002 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_23.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_23" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_24.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_24.json new file mode 100644 index 000000000..b9bba9033 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_24.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_24" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_25.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_25.json new file mode 100644 index 000000000..b896c210c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_25.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_25" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_26.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_26.json new file mode 100644 index 000000000..8c6c7aac3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_26.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_26" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_27.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_27.json new file mode 100644 index 000000000..f5e26c56e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_27.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_27" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_28.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_28.json new file mode 100644 index 000000000..7a766cfd2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_28.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_28" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_29.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_29.json new file mode 100644 index 000000000..990c9054f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_29.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_29" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_30.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_30.json new file mode 100644 index 000000000..725443ad2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_30.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_30" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_31.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_31.json new file mode 100644 index 000000000..bbbd539fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_31.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_31" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/composter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/composter.json new file mode 100644 index 000000000..a8a9be3b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/composter.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/composter" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/conduit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/conduit.json new file mode 100644 index 000000000..f5785cdf7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/conduit.json @@ -0,0 +1,38 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/conduit" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1.0, 1.0, 1.0 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.8, 0.8, 0.8 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_beef.json new file mode 100644 index 000000000..2360514a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_beef.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_chicken.json new file mode 100644 index 000000000..6608b49c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_chicken.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_cod.json new file mode 100644 index 000000000..ed4d23924 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_cod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_cod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_mutton.json new file mode 100644 index 000000000..41455e0e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_mutton.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_porkchop.json new file mode 100644 index 000000000..85a6bb4f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_porkchop.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_rabbit.json new file mode 100644 index 000000000..7217b8a86 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_rabbit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_salmon.json new file mode 100644 index 000000000..d4be30a79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_salmon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cookie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cookie.json new file mode 100644 index 000000000..c1addfd8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cookie.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cookie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_block.json new file mode 100644 index 000000000..7bc2c0184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_bulb.json new file mode 100644 index 000000000..bdf2e1755 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_door.json new file mode 100644 index 000000000..88468c6b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_grate.json new file mode 100644 index 000000000..f4cff5139 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ingot.json new file mode 100644 index 000000000..c8feae647 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/copper_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ore.json new file mode 100644 index 000000000..773d45934 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_trapdoor.json new file mode 100644 index 000000000..77db2f8d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cornflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cornflower.json new file mode 100644 index 000000000..ca317c8b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cornflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cornflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cow_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cow_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cow_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_bricks.json new file mode 100644 index 000000000..5edc2399b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_deepslate_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_tiles.json new file mode 100644 index 000000000..9fc7a8c02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_deepslate_tiles" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_nether_bricks.json new file mode 100644 index 000000000..09da8a18a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_polished_blackstone_bricks.json new file mode 100644 index 000000000..87b9f26e6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_polished_blackstone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_polished_blackstone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_stone_bricks.json new file mode 100644 index 000000000..46802074e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafter.json new file mode 100644 index 000000000..65fda3009 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafter.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crafter" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafting_table.json new file mode 100644 index 000000000..323e84b6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafting_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crafting_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_heart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_heart.json new file mode 100644 index 000000000..a071b7265 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_heart.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/creaking_heart" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_banner_pattern.json new file mode 100644 index 000000000..d626b7310 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/creeper_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_button.json new file mode 100644 index 000000000..f58c71fc6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_door.json new file mode 100644 index 000000000..ef94c1cc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/crimson_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence.json new file mode 100644 index 000000000..3bdd71d1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence_gate.json new file mode 100644 index 000000000..36ef1c8ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fungus.json new file mode 100644 index 000000000..6fdfd2fa2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fungus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/crimson_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hanging_sign.json new file mode 100644 index 000000000..47d3729d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/crimson_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hyphae.json new file mode 100644 index 000000000..6efe46101 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_nylium.json new file mode 100644 index 000000000..74f939241 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_nylium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_nylium" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_planks.json new file mode 100644 index 000000000..759128e13 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_pressure_plate.json new file mode 100644 index 000000000..436b0ba9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_roots.json new file mode 100644 index 000000000..19ea0092c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_roots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/crimson_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_sign.json new file mode 100644 index 000000000..3d2a86b74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/crimson_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_slab.json new file mode 100644 index 000000000..63ad29274 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stairs.json new file mode 100644 index 000000000..9cefb2d27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stem.json new file mode 100644 index 000000000..56d2001dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_trapdoor.json new file mode 100644 index 000000000..b1cba031f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow.json new file mode 100644 index 000000000..0cddcac42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow.json @@ -0,0 +1,63 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/crossbow_standby" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ -90, 0, -60 ], + "translation": [ 2, 0.1, -3 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ -90, 0, 30 ], + "translation": [ 2, 0.1, -3 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_righthand": { + "rotation": [ -90, 0, -55 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ -90, 0, 35 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + }, + "overrides": [ + { + "predicate": { + "pulling": 1 + }, + "model": "item/crossbow_pulling_0" + }, + { + "predicate": { + "pulling": 1, + "pull": 0.58 + }, + "model": "item/crossbow_pulling_1" + }, + { + "predicate": { + "pulling": 1, + "pull": 1.0 + }, + "model": "item/crossbow_pulling_2" + }, + { + "predicate": { + "charged": 1 + }, + "model": "item/crossbow_arrow" + }, + { + "predicate": { + "charged": 1, + "firework": 1 + }, + "model": "item/crossbow_firework" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_arrow.json new file mode 100644 index 000000000..bc3e3543c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_arrow.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_arrow" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_firework.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_firework.json new file mode 100644 index 000000000..1ebe175ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_firework" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_0.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_0.json new file mode 100644 index 000000000..afd73b86a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_pulling_0" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_1.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_1.json new file mode 100644 index 000000000..1c48a748b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_pulling_1" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_2.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_2.json new file mode 100644 index 000000000..3c2df5001 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_pulling_2" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crying_obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crying_obsidian.json new file mode 100644 index 000000000..0d94bfb8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crying_obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crying_obsidian" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper.json new file mode 100644 index 000000000..ce1ec597d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_slab.json new file mode 100644 index 000000000..b6b05101c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_stairs.json new file mode 100644 index 000000000..7376f52cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone.json new file mode 100644 index 000000000..665df158c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone_slab.json new file mode 100644 index 000000000..7767595ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_red_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone.json new file mode 100644 index 000000000..865262dc0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone_slab.json new file mode 100644 index 000000000..cccc00353 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bed.json new file mode 100644 index 000000000..046fa8118 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/cyan_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle.json new file mode 100644 index 000000000..996896862 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cyan_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_back.json new file mode 100644 index 000000000..27a03d17f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/cyan_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_front.json new file mode 100644 index 000000000..c7eccd842 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/cyan_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_candle.json new file mode 100644 index 000000000..4b565936e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cyan_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_carpet.json new file mode 100644 index 000000000..f67e70625 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete.json new file mode 100644 index 000000000..210de1016 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete_powder.json new file mode 100644 index 000000000..8fe4c5464 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_dye.json new file mode 100644 index 000000000..634aa6ec1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cyan_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_glazed_terracotta.json new file mode 100644 index 000000000..c98c2ac8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_shulker_box.json new file mode 100644 index 000000000..e06a479cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/cyan_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass.json new file mode 100644 index 000000000..8cdd4b939 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass_pane.json new file mode 100644 index 000000000..61db9a4d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cyan_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_terracotta.json new file mode 100644 index 000000000..4053734c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_wool.json new file mode 100644 index 000000000..30c92e7a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/damaged_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/damaged_anvil.json new file mode 100644 index 000000000..657cbd68a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/damaged_anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/damaged_anvil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dandelion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dandelion.json new file mode 100644 index 000000000..1628250e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dandelion.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dandelion" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/danger_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/danger_pottery_sherd.json new file mode 100644 index 000000000..136b5d965 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/danger_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/danger_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_boat.json new file mode 100644 index 000000000..66ced7960 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_button.json new file mode 100644 index 000000000..f2ff59ba9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_chest_boat.json new file mode 100644 index 000000000..bc981607d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_door.json new file mode 100644 index 000000000..89ad212f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence.json new file mode 100644 index 000000000..c624d9c99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence_gate.json new file mode 100644 index 000000000..25cbe8054 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_hanging_sign.json new file mode 100644 index 000000000..5d095e988 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_leaves.json new file mode 100644 index 000000000..395882a7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_log.json new file mode 100644 index 000000000..6304aefb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_planks.json new file mode 100644 index 000000000..a3adda1d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_pressure_plate.json new file mode 100644 index 000000000..7cd16b9d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sapling.json new file mode 100644 index 000000000..1a02b3242 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dark_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sign.json new file mode 100644 index 000000000..962a237af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_slab.json new file mode 100644 index 000000000..c66e4e434 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_stairs.json new file mode 100644 index 000000000..1d7b821bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_trapdoor.json new file mode 100644 index 000000000..a91f3c8fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_wood.json new file mode 100644 index 000000000..3a285ba3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine.json new file mode 100644 index 000000000..461468dff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_prismarine" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_slab.json new file mode 100644 index 000000000..a9605d9f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_prismarine_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_stairs.json new file mode 100644 index 000000000..2a11deadb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_prismarine_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/daylight_detector.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/daylight_detector.json new file mode 100644 index 000000000..f52d6d9a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/daylight_detector.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/daylight_detector" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral.json new file mode 100644 index 000000000..8e2439122 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_block.json new file mode 100644 index 000000000..3134d2b74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_brain_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_fan.json new file mode 100644 index 000000000..a6488a838 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral.json new file mode 100644 index 000000000..7802938b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_block.json new file mode 100644 index 000000000..ba3411da6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_bubble_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_fan.json new file mode 100644 index 000000000..e06ea5f95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bush.json new file mode 100644 index 000000000..cb8a5f08f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bush.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_bush" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral.json new file mode 100644 index 000000000..7795cff34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_block.json new file mode 100644 index 000000000..f169720a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_fire_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_fan.json new file mode 100644 index 000000000..7d33a6e77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral.json new file mode 100644 index 000000000..8dc414ad3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_block.json new file mode 100644 index 000000000..a7ed136d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_horn_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_fan.json new file mode 100644 index 000000000..4e2715a9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral.json new file mode 100644 index 000000000..1d08eff69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_block.json new file mode 100644 index 000000000..a16902f98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_tube_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_fan.json new file mode 100644 index 000000000..86ad4fd4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/debug_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/debug_stick.json new file mode 100644 index 000000000..f0dc3b971 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/decorated_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/decorated_pot.json new file mode 100644 index 000000000..70c96e0fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/decorated_pot.json @@ -0,0 +1,39 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "entity/decorated_pot/decorated_pot_side" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 2, 0.5], + "scale":[ 0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.60, 0.60, 0.60] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 0], + "scale":[ 0.25, 0.25, 0.25] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 16, 0], + "scale":[ 1.5, 1.5, 1.5 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate.json new file mode 100644 index 000000000..13980a844 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_slab.json new file mode 100644 index 000000000..7e35175de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_stairs.json new file mode 100644 index 000000000..38c5e3f96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_wall.json new file mode 100644 index 000000000..d13b4d425 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_bricks.json new file mode 100644 index 000000000..5c1525883 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_coal_ore.json new file mode 100644 index 000000000..f94aeadab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_coal_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_coal_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_copper_ore.json new file mode 100644 index 000000000..b5425550d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_copper_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_copper_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_diamond_ore.json new file mode 100644 index 000000000..24eb2e5af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_diamond_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_diamond_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_emerald_ore.json new file mode 100644 index 000000000..a5354b18c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_emerald_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_emerald_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_gold_ore.json new file mode 100644 index 000000000..910ff2f7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_gold_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_gold_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_iron_ore.json new file mode 100644 index 000000000..0b10edeaa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_iron_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_iron_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_lapis_ore.json new file mode 100644 index 000000000..d829cea2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_lapis_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_lapis_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_redstone_ore.json new file mode 100644 index 000000000..c9832e9a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_redstone_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_redstone_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_slab.json new file mode 100644 index 000000000..f09796405 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tile_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_stairs.json new file mode 100644 index 000000000..2a7ec05e6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tile_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_wall.json new file mode 100644 index 000000000..226fa452a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tile_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tiles.json new file mode 100644 index 000000000..bdaaaec5f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tiles" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/detector_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/detector_rail.json new file mode 100644 index 000000000..707b24920 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/detector_rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/detector_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond.json new file mode 100644 index 000000000..dacde7f16 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_axe.json new file mode 100644 index 000000000..9ab049970 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_block.json new file mode 100644 index 000000000..48d351c4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diamond_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots.json new file mode 100644 index 000000000..2badf8fd5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_boots_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_amethyst_trim.json new file mode 100644 index 000000000..a193a70c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_copper_trim.json new file mode 100644 index 000000000..5ad8de504 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_diamond_darker_trim.json new file mode 100644 index 000000000..9dd940a29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_emerald_trim.json new file mode 100644 index 000000000..039509d04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_gold_trim.json new file mode 100644 index 000000000..99c5a53b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_iron_trim.json new file mode 100644 index 000000000..f692720f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_lapis_trim.json new file mode 100644 index 000000000..411b13107 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_netherite_trim.json new file mode 100644 index 000000000..55b29ae24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_quartz_trim.json new file mode 100644 index 000000000..fdecfc8b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_redstone_trim.json new file mode 100644 index 000000000..5661c5216 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate.json new file mode 100644 index 000000000..b87eb4b50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_chestplate_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_amethyst_trim.json new file mode 100644 index 000000000..34901619b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_copper_trim.json new file mode 100644 index 000000000..9a1c45212 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_diamond_darker_trim.json new file mode 100644 index 000000000..731236728 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_emerald_trim.json new file mode 100644 index 000000000..7656f0b93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_gold_trim.json new file mode 100644 index 000000000..b3b7c9916 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_iron_trim.json new file mode 100644 index 000000000..6eeae07fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_lapis_trim.json new file mode 100644 index 000000000..a973c512c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_netherite_trim.json new file mode 100644 index 000000000..bb5a1007a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_quartz_trim.json new file mode 100644 index 000000000..937d5ee31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_redstone_trim.json new file mode 100644 index 000000000..63d776079 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet.json new file mode 100644 index 000000000..982a1110d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_helmet_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_amethyst_trim.json new file mode 100644 index 000000000..623a571ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_copper_trim.json new file mode 100644 index 000000000..c0a1d8824 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_diamond_darker_trim.json new file mode 100644 index 000000000..0d82b9c02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_emerald_trim.json new file mode 100644 index 000000000..d23a9a6ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_gold_trim.json new file mode 100644 index 000000000..cd80cebe0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_iron_trim.json new file mode 100644 index 000000000..694acc9b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_lapis_trim.json new file mode 100644 index 000000000..014fe7355 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_netherite_trim.json new file mode 100644 index 000000000..35098eb05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_quartz_trim.json new file mode 100644 index 000000000..104fb171a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_redstone_trim.json new file mode 100644 index 000000000..f520dae20 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_hoe.json new file mode 100644 index 000000000..c777b6d39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_horse_armor.json new file mode 100644 index 000000000..017194b73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings.json new file mode 100644 index 000000000..fdc94914e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_leggings_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_amethyst_trim.json new file mode 100644 index 000000000..355ce9663 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_copper_trim.json new file mode 100644 index 000000000..882c71998 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_diamond_darker_trim.json new file mode 100644 index 000000000..2d6367397 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_emerald_trim.json new file mode 100644 index 000000000..4bacdd8b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_gold_trim.json new file mode 100644 index 000000000..90655d486 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_iron_trim.json new file mode 100644 index 000000000..7503db5e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_lapis_trim.json new file mode 100644 index 000000000..8f0a3f847 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_netherite_trim.json new file mode 100644 index 000000000..9d8085c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_quartz_trim.json new file mode 100644 index 000000000..85edee564 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_redstone_trim.json new file mode 100644 index 000000000..2232f1a3b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_ore.json new file mode 100644 index 000000000..da18313d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diamond_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_pickaxe.json new file mode 100644 index 000000000..88301e5cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_shovel.json new file mode 100644 index 000000000..dc4e6c84b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_sword.json new file mode 100644 index 000000000..26f4a2e09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite.json new file mode 100644 index 000000000..f9d3f6b46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_slab.json new file mode 100644 index 000000000..fbfbc7a6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_stairs.json new file mode 100644 index 000000000..fdfa11abe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_wall.json new file mode 100644 index 000000000..192d72827 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt.json new file mode 100644 index 000000000..8f9dbab5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dirt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt_path.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt_path.json new file mode 100644 index 000000000..e60515e4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt_path.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dirt_path" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/disc_fragment_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/disc_fragment_5.json new file mode 100644 index 000000000..806624c7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/disc_fragment_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/disc_fragment_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dispenser.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dispenser.json new file mode 100644 index 000000000..b88156bcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dispenser.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dispenser" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dolphin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dolphin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dolphin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/donkey_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/donkey_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/donkey_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_breath.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_breath.json new file mode 100644 index 000000000..424980b1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_breath.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dragon_breath" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_egg.json new file mode 100644 index 000000000..1570a78ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dragon_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_head.json new file mode 100644 index 000000000..862647621 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_head.json @@ -0,0 +1,15 @@ +{ + "parent": "item/template_skull", + "display": { + "gui": { + "translation": [ -2, 2, 0 ], + "rotation": [ 30, 45, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, -1, 2 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp.json new file mode 100644 index 000000000..a4e4efffc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dried_kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp_block.json new file mode 100644 index 000000000..2f3f1c329 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dried_kelp_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dripstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dripstone_block.json new file mode 100644 index 000000000..d6d9c09d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dripstone_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dripstone_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dropper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dropper.json new file mode 100644 index 000000000..a8b40e592 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dropper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dropper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/drowned_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/drowned_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/drowned_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dune_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dune_armor_trim_smithing_template.json new file mode 100644 index 000000000..eaf0f46c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dune_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dune_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/echo_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/echo_shard.json new file mode 100644 index 000000000..a6f71e738 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/echo_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/echo_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/egg.json new file mode 100644 index 000000000..86ec3cae9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elder_guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elder_guardian_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elder_guardian_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elytra.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elytra.json new file mode 100644 index 000000000..3909ded52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elytra.json @@ -0,0 +1,14 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/elytra" + }, + "overrides": [ + { + "predicate": { + "broken": 1 + }, + "model": "item/broken_elytra" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald.json new file mode 100644 index 000000000..4f19c1d9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_block.json new file mode 100644 index 000000000..27c3713ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/emerald_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_ore.json new file mode 100644 index 000000000..3569bde18 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/emerald_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_book.json new file mode 100644 index 000000000..b6a35e577 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/enchanted_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_golden_apple.json new file mode 100644 index 000000000..868c92193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_golden_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanting_table.json new file mode 100644 index 000000000..9f76fca22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanting_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/enchanting_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_crystal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_crystal.json new file mode 100644 index 000000000..15aa5897f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_crystal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/end_crystal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_portal_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_portal_frame.json new file mode 100644 index 000000000..718814c22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_portal_frame.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_portal_frame" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_rod.json new file mode 100644 index 000000000..809dec3fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_rod.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_rod" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone.json new file mode 100644 index 000000000..fc4cf92a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_slab.json new file mode 100644 index 000000000..3daf70724 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_stairs.json new file mode 100644 index 000000000..b43fdfe6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_wall.json new file mode 100644 index 000000000..a0a4f8439 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_bricks.json new file mode 100644 index 000000000..a0bb1b983 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_chest.json new file mode 100644 index 000000000..58aba3388 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "item/chest", + "textures": { + "particle": "block/obsidian" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_dragon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_dragon_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_dragon_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_eye.json new file mode 100644 index 000000000..d29cc4e08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_eye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ender_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_pearl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_pearl.json new file mode 100644 index 000000000..e6ccd02fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_pearl.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ender_pearl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enderman_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enderman_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enderman_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/endermite_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/endermite_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/endermite_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/evoker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/evoker_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/evoker_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/experience_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/experience_bottle.json new file mode 100644 index 000000000..22a77fe72 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/experience_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/experience_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/explorer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/explorer_pottery_sherd.json new file mode 100644 index 000000000..affa6dd29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/explorer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/explorer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_chiseled_copper.json new file mode 100644 index 000000000..11278b6ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper.json new file mode 100644 index 000000000..5881fd7b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_bulb.json new file mode 100644 index 000000000..6ddcba9ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_door.json new file mode 100644 index 000000000..78a9d4d8d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/exposed_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_grate.json new file mode 100644 index 000000000..b7a3c78e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_trapdoor.json new file mode 100644 index 000000000..7546ce3c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper.json new file mode 100644 index 000000000..b5c7d8f01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_slab.json new file mode 100644 index 000000000..29ce47239 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_stairs.json new file mode 100644 index 000000000..24bdd2851 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/eye_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/eye_armor_trim_smithing_template.json new file mode 100644 index 000000000..d629fc1b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/eye_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/eye_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/farmland.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/farmland.json new file mode 100644 index 000000000..1c5eceae5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/farmland.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/farmland" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/feather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/feather.json new file mode 100644 index 000000000..1b88f92d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/feather.json @@ -0,0 +1,13 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/feather" + }, + "display": { + "head": { + "rotation": [ 0, 0, 45 ], + "translation": [ -1, 13, 7], + "scale":[ 1, 1, 1] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fermented_spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fermented_spider_eye.json new file mode 100644 index 000000000..06bbefceb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fermented_spider_eye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/fermented_spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fern.json new file mode 100644 index 000000000..851ce5d38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/fern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/field_masoned_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/field_masoned_banner_pattern.json new file mode 100644 index 000000000..404fbedee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/field_masoned_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/field_masoned_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/filled_map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/filled_map.json new file mode 100644 index 000000000..077d2530e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/filled_map.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/filled_map", + "layer1": "item/filled_map_markings" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_charge.json new file mode 100644 index 000000000..27d3f0d81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/fire_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral.json new file mode 100644 index 000000000..8585f4c8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_block.json new file mode 100644 index 000000000..eebe05e14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/fire_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_fan.json new file mode 100644 index 000000000..c27e2d3a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_rocket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_rocket.json new file mode 100644 index 000000000..cb7cf197c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_rocket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/firework_rocket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_star.json new file mode 100644 index 000000000..4e2e9fe80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_star.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/firework_star", + "layer1": "item/firework_star_overlay" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod.json new file mode 100644 index 000000000..6d52bb97e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod.json @@ -0,0 +1,14 @@ +{ + "parent": "item/handheld_rod", + "textures": { + "layer0": "item/fishing_rod" + }, + "overrides": [ + { + "predicate": { + "cast": 1 + }, + "model": "item/fishing_rod_cast" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod_cast.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod_cast.json new file mode 100644 index 000000000..55c2a5253 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "item/fishing_rod", + "textures": { + "layer0": "item/fishing_rod_cast" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fletching_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fletching_table.json new file mode 100644 index 000000000..bc2b1bdc7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fletching_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/fletching_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint.json new file mode 100644 index 000000000..3a5572958 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flint" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint_and_steel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint_and_steel.json new file mode 100644 index 000000000..d11a12a90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint_and_steel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flint_and_steel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_armor_trim_smithing_template.json new file mode 100644 index 000000000..0aec5a447 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flow_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_banner_pattern.json new file mode 100644 index 000000000..82c9af4ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flow_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_pottery_sherd.json new file mode 100644 index 000000000..ad6dac5dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flow_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_banner_pattern.json new file mode 100644 index 000000000..ea8b8215f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flower_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_pot.json new file mode 100644 index 000000000..e50e0fa1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_pot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flower_pot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea.json new file mode 100644 index 000000000..e5f437e8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/flowering_azalea" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea_leaves.json new file mode 100644 index 000000000..c3ecf6e7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/flowering_azalea_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fox_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fox_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fox_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/friend_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/friend_pottery_sherd.json new file mode 100644 index 000000000..b618f305d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/friend_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/friend_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frog_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frog_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frog_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frogspawn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frogspawn.json new file mode 100644 index 000000000..6fd44430f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frogspawn.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/frogspawn" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace.json new file mode 100644 index 000000000..593027e9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/furnace" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace_minecart.json new file mode 100644 index 000000000..e3e6f2223 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/furnace_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/generated.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/generated.json new file mode 100644 index 000000000..89aa79e95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/generated.json @@ -0,0 +1,30 @@ +{ + "parent": "builtin/generated", + "gui_light": "front", + "display": { + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 2, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 13, 7], + "scale":[ 1, 1, 1] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "scale": [ 1, 1, 1 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_tear.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_tear.json new file mode 100644 index 000000000..d7d6e6f3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_tear.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ghast_tear" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gilded_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gilded_blackstone.json new file mode 100644 index 000000000..a0779ccd8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gilded_blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gilded_blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass.json new file mode 100644 index 000000000..658254343 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_bottle.json new file mode 100644 index 000000000..9b4ab510c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glass_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_pane.json new file mode 100644 index 000000000..de799dcff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glistering_melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glistering_melon_slice.json new file mode 100644 index 000000000..90c290a08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glistering_melon_slice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glistering_melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/globe_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/globe_banner_pattern.json new file mode 100644 index 000000000..3948f16f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/globe_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/globe_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_berries.json new file mode 100644 index 000000000..b77ea725e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_berries.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glow_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_ink_sac.json new file mode 100644 index 000000000..fc21cec42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_ink_sac.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glow_ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_item_frame.json new file mode 100644 index 000000000..a2323a19b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_item_frame.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glow_item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_lichen.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_lichen.json new file mode 100644 index 000000000..7b796f838 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_lichen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/glow_lichen" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_squid_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_squid_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone.json new file mode 100644 index 000000000..5567a8878 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/glowstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone_dust.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone_dust.json new file mode 100644 index 000000000..4b78f60be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone_dust.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glowstone_dust" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_horn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_horn.json new file mode 100644 index 000000000..eb549504e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_horn.json @@ -0,0 +1,36 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/goat_horn" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 3, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + }, + "overrides": [ + { + "predicate": { + "tooting": 1 + }, + "model": "item/tooting_goat_horn" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_block.json new file mode 100644 index 000000000..f9cefd04e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gold_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ingot.json new file mode 100644 index 000000000..230e3111f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gold_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_nugget.json new file mode 100644 index 000000000..3da43c93d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_nugget.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gold_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ore.json new file mode 100644 index 000000000..64c164535 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gold_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_apple.json new file mode 100644 index 000000000..868c92193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_axe.json new file mode 100644 index 000000000..42008eeae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots.json new file mode 100644 index 000000000..427896c37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_boots_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_amethyst_trim.json new file mode 100644 index 000000000..da31bd587 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_copper_trim.json new file mode 100644 index 000000000..e79eb60a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_diamond_trim.json new file mode 100644 index 000000000..2ced80f9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_emerald_trim.json new file mode 100644 index 000000000..78154d772 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_gold_darker_trim.json new file mode 100644 index 000000000..354544588 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_iron_trim.json new file mode 100644 index 000000000..b63010f02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_lapis_trim.json new file mode 100644 index 000000000..268ab549a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_netherite_trim.json new file mode 100644 index 000000000..e329b9cbc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_quartz_trim.json new file mode 100644 index 000000000..4e8cc2d3b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_redstone_trim.json new file mode 100644 index 000000000..bda608e0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_carrot.json new file mode 100644 index 000000000..8d36365f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_carrot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate.json new file mode 100644 index 000000000..b828f0323 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_chestplate_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_amethyst_trim.json new file mode 100644 index 000000000..d0b4b1816 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_copper_trim.json new file mode 100644 index 000000000..f9b9f9382 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_diamond_trim.json new file mode 100644 index 000000000..adf1bc6f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_emerald_trim.json new file mode 100644 index 000000000..af97428b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_gold_darker_trim.json new file mode 100644 index 000000000..3328597c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_iron_trim.json new file mode 100644 index 000000000..ed2aa0edd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_lapis_trim.json new file mode 100644 index 000000000..4c748a101 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_netherite_trim.json new file mode 100644 index 000000000..aab4dfb37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_quartz_trim.json new file mode 100644 index 000000000..1632e6ce6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_redstone_trim.json new file mode 100644 index 000000000..2f24fa905 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet.json new file mode 100644 index 000000000..114e56935 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_helmet_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_amethyst_trim.json new file mode 100644 index 000000000..47ccae21b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_copper_trim.json new file mode 100644 index 000000000..4a3ee8e40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_diamond_trim.json new file mode 100644 index 000000000..2ad2462a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_emerald_trim.json new file mode 100644 index 000000000..f9623b16d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_gold_darker_trim.json new file mode 100644 index 000000000..2276b5ad1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_iron_trim.json new file mode 100644 index 000000000..81f10c4d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_lapis_trim.json new file mode 100644 index 000000000..ff7d2b4d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_netherite_trim.json new file mode 100644 index 000000000..bbbb72913 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_quartz_trim.json new file mode 100644 index 000000000..583d8cda9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_redstone_trim.json new file mode 100644 index 000000000..3a85360b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_hoe.json new file mode 100644 index 000000000..7d2a2e5df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_horse_armor.json new file mode 100644 index 000000000..9fbc0e909 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings.json new file mode 100644 index 000000000..285ffb0d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_leggings_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_amethyst_trim.json new file mode 100644 index 000000000..3d4bb850b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_copper_trim.json new file mode 100644 index 000000000..41e999edc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_diamond_trim.json new file mode 100644 index 000000000..d85fda9b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_emerald_trim.json new file mode 100644 index 000000000..544b209fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_gold_darker_trim.json new file mode 100644 index 000000000..23eae507f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_iron_trim.json new file mode 100644 index 000000000..877cb174d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_lapis_trim.json new file mode 100644 index 000000000..bb2fca2b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_netherite_trim.json new file mode 100644 index 000000000..0a41f244c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_quartz_trim.json new file mode 100644 index 000000000..c966b6d5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_redstone_trim.json new file mode 100644 index 000000000..ec9e671ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_pickaxe.json new file mode 100644 index 000000000..185c855bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_shovel.json new file mode 100644 index 000000000..c2d1dc003 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_sword.json new file mode 100644 index 000000000..02e540976 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite.json new file mode 100644 index 000000000..4dd54d023 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_slab.json new file mode 100644 index 000000000..95ee61093 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_stairs.json new file mode 100644 index 000000000..68b4e669c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_wall.json new file mode 100644 index 000000000..de4942707 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grass_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grass_block.json new file mode 100644 index 000000000..f54d345a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grass_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/grass_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gravel.json new file mode 100644 index 000000000..ee8cbc03e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gravel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gravel" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bed.json new file mode 100644 index 000000000..306670549 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle.json new file mode 100644 index 000000000..a076d1563 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gray_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_back.json new file mode 100644 index 000000000..7b4a9a7d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/gray_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_front.json new file mode 100644 index 000000000..cbcccfeca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/gray_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_candle.json new file mode 100644 index 000000000..176cf59ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_carpet.json new file mode 100644 index 000000000..5fe85f098 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete.json new file mode 100644 index 000000000..9b89dd7b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete_powder.json new file mode 100644 index 000000000..47d3dd50c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_dye.json new file mode 100644 index 000000000..f3c301065 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_glazed_terracotta.json new file mode 100644 index 000000000..d58bce8a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_shulker_box.json new file mode 100644 index 000000000..c70434932 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/gray_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass.json new file mode 100644 index 000000000..34c0fa6cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass_pane.json new file mode 100644 index 000000000..e2b88aa70 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_terracotta.json new file mode 100644 index 000000000..6c415c038 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_wool.json new file mode 100644 index 000000000..88c930a64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bed.json new file mode 100644 index 000000000..d7c7154a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/green_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle.json new file mode 100644 index 000000000..c4589577d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/green_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_back.json new file mode 100644 index 000000000..a0b9c2a7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/green_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_front.json new file mode 100644 index 000000000..23dd69896 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/green_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_candle.json new file mode 100644 index 000000000..494c6ed42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/green_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_carpet.json new file mode 100644 index 000000000..772c294ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete.json new file mode 100644 index 000000000..0e3b0f95d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete_powder.json new file mode 100644 index 000000000..4c9c70f0e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_dye.json new file mode 100644 index 000000000..2ded932e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/green_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_glazed_terracotta.json new file mode 100644 index 000000000..68333f848 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_shulker_box.json new file mode 100644 index 000000000..6e8e01e7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/green_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass.json new file mode 100644 index 000000000..e10e37a8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass_pane.json new file mode 100644 index 000000000..ff4a30f74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/green_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_terracotta.json new file mode 100644 index 000000000..bf20f272f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_wool.json new file mode 100644 index 000000000..a8cfdf478 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grindstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grindstone.json new file mode 100644 index 000000000..2faa8ae80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grindstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/grindstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guardian_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guardian_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gunpowder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gunpowder.json new file mode 100644 index 000000000..82faa64c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gunpowder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gunpowder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_banner_pattern.json new file mode 100644 index 000000000..c24b83c7c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/guster_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_pottery_sherd.json new file mode 100644 index 000000000..f1bda3e1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/guster_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld.json new file mode 100644 index 000000000..51ea90fc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld.json @@ -0,0 +1,25 @@ +{ + "parent": "item/generated", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, -90, 55 ], + "translation": [ 0, 4.0, 0.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, -55 ], + "translation": [ 0, 4.0, 0.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_mace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_mace.json new file mode 100644 index 000000000..928ce0d22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_mace.json @@ -0,0 +1,25 @@ +{ + "parent": "item/handheld", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, -90, 55 ], + "translation": [ 0, 4.0, 1 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, -55 ], + "translation": [ 0, 4.0, 1 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 0, 3, 0.8 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 0, 3, 0.8 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_rod.json new file mode 100644 index 000000000..de794a4ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_rod.json @@ -0,0 +1,25 @@ +{ + "parent": "item/handheld", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 55 ], + "translation": [ 0, 4.0, 2.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, -90, -55 ], + "translation": [ 0, 4.0, 2.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 25 ], + "translation": [ 0, 1.6, 0.8 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, -90, -25 ], + "translation": [ 0, 1.6, 0.8 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hanging_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hanging_roots.json new file mode 100644 index 000000000..05320edbb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hanging_roots.json @@ -0,0 +1,18 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "minecraft:block/hanging_roots" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 0, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hay_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hay_block.json new file mode 100644 index 000000000..6c92e25d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hay_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/hay_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_of_the_sea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_of_the_sea.json new file mode 100644 index 000000000..eb299204f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_of_the_sea.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/heart_of_the_sea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_pottery_sherd.json new file mode 100644 index 000000000..e5c457415 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/heart_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heartbreak_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heartbreak_pottery_sherd.json new file mode 100644 index 000000000..48c49fa4f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heartbreak_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/heartbreak_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_core.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_core.json new file mode 100644 index 000000000..aed92e076 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_core.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/heavy_core" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_weighted_pressure_plate.json new file mode 100644 index 000000000..ef384772b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_weighted_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/heavy_weighted_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hoglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hoglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_block.json new file mode 100644 index 000000000..29818ade0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/honey_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_bottle.json new file mode 100644 index 000000000..2a69e5f9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/honey_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb.json new file mode 100644 index 000000000..b183a8eca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/honeycomb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb_block.json new file mode 100644 index 000000000..0a2c9541e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/honeycomb_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper.json new file mode 100644 index 000000000..b9e548805 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/hopper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper_minecart.json new file mode 100644 index 000000000..8bf456072 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/hopper_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral.json new file mode 100644 index 000000000..5994465ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_block.json new file mode 100644 index 000000000..ba702d24c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/horn_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_fan.json new file mode 100644 index 000000000..e2078bf4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horse_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horse_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/host_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/host_armor_trim_smithing_template.json new file mode 100644 index 000000000..cff91b211 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/host_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/host_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/howl_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/howl_pottery_sherd.json new file mode 100644 index 000000000..377031992 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/howl_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/howl_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/husk_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/husk_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/husk_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ice.json new file mode 100644 index 000000000..1ec90d771 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ice.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/ice" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_chiseled_stone_bricks.json new file mode 100644 index 000000000..ac7e5e66f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_chiseled_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cobblestone.json new file mode 100644 index 000000000..35e828df6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cracked_stone_bricks.json new file mode 100644 index 000000000..46802074e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cracked_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_deepslate.json new file mode 100644 index 000000000..13980a844 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_mossy_stone_bricks.json new file mode 100644 index 000000000..a9fe750fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_mossy_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone.json new file mode 100644 index 000000000..37f27f10b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone_bricks.json new file mode 100644 index 000000000..51de871c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ink_sac.json new file mode 100644 index 000000000..4e528dcd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ink_sac.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_axe.json new file mode 100644 index 000000000..6ddc54911 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_bars.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_bars.json new file mode 100644 index 000000000..97aa41fc7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_bars.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/iron_bars" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_block.json new file mode 100644 index 000000000..acac52cae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/iron_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots.json new file mode 100644 index 000000000..a1f2a4fcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_boots_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_amethyst_trim.json new file mode 100644 index 000000000..c520b66aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_copper_trim.json new file mode 100644 index 000000000..f4321a79a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_diamond_trim.json new file mode 100644 index 000000000..58dfbd8a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_emerald_trim.json new file mode 100644 index 000000000..ebba41162 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_gold_trim.json new file mode 100644 index 000000000..b1601c91a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_iron_darker_trim.json new file mode 100644 index 000000000..65b960829 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_lapis_trim.json new file mode 100644 index 000000000..1aefdf66a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_netherite_trim.json new file mode 100644 index 000000000..f6a2d1021 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_quartz_trim.json new file mode 100644 index 000000000..52af0ee74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_redstone_trim.json new file mode 100644 index 000000000..a838412c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate.json new file mode 100644 index 000000000..a0385c25e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_chestplate_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_amethyst_trim.json new file mode 100644 index 000000000..ab82095dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_copper_trim.json new file mode 100644 index 000000000..956ba4845 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_diamond_trim.json new file mode 100644 index 000000000..e559d7cc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_emerald_trim.json new file mode 100644 index 000000000..e143c99de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_gold_trim.json new file mode 100644 index 000000000..f5dfee4c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_iron_darker_trim.json new file mode 100644 index 000000000..38ba7c1b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_lapis_trim.json new file mode 100644 index 000000000..03ae6fbd1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_netherite_trim.json new file mode 100644 index 000000000..ccb152452 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_quartz_trim.json new file mode 100644 index 000000000..981e14a3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_redstone_trim.json new file mode 100644 index 000000000..208a2524f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_door.json new file mode 100644 index 000000000..a057f8f8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_golem_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_golem_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet.json new file mode 100644 index 000000000..a2e575f93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_helmet_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_amethyst_trim.json new file mode 100644 index 000000000..53b64e68a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_copper_trim.json new file mode 100644 index 000000000..61314f95e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_diamond_trim.json new file mode 100644 index 000000000..d469b22f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_emerald_trim.json new file mode 100644 index 000000000..bc596c65b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_gold_trim.json new file mode 100644 index 000000000..f68de78da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_iron_darker_trim.json new file mode 100644 index 000000000..b471361fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_lapis_trim.json new file mode 100644 index 000000000..ef272104f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_netherite_trim.json new file mode 100644 index 000000000..9f6c5f523 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_quartz_trim.json new file mode 100644 index 000000000..c34faf479 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_redstone_trim.json new file mode 100644 index 000000000..9ad0a7b50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_hoe.json new file mode 100644 index 000000000..889dd3a38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_horse_armor.json new file mode 100644 index 000000000..3a560516f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ingot.json new file mode 100644 index 000000000..1fc74dfc6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings.json new file mode 100644 index 000000000..826c4f73f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_leggings_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_amethyst_trim.json new file mode 100644 index 000000000..e64f52a62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_copper_trim.json new file mode 100644 index 000000000..48a46fe8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_diamond_trim.json new file mode 100644 index 000000000..a706ce346 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_emerald_trim.json new file mode 100644 index 000000000..88c613757 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_gold_trim.json new file mode 100644 index 000000000..90ca5a6ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_iron_darker_trim.json new file mode 100644 index 000000000..e85d215ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_lapis_trim.json new file mode 100644 index 000000000..063137c1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_netherite_trim.json new file mode 100644 index 000000000..5afcdf928 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_quartz_trim.json new file mode 100644 index 000000000..5ce4703ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_redstone_trim.json new file mode 100644 index 000000000..c907c7a1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_nugget.json new file mode 100644 index 000000000..3873a52ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_nugget.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ore.json new file mode 100644 index 000000000..5a3561391 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/iron_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_pickaxe.json new file mode 100644 index 000000000..8a5f40797 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_shovel.json new file mode 100644 index 000000000..26674cfb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_sword.json new file mode 100644 index 000000000..ebbcd4118 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_trapdoor.json new file mode 100644 index 000000000..b3a30b76d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/iron_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/item_frame.json new file mode 100644 index 000000000..09797547d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/item_frame.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jack_o_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jack_o_lantern.json new file mode 100644 index 000000000..d23072034 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jack_o_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jack_o_lantern" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jigsaw.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jigsaw.json new file mode 100644 index 000000000..b0c476303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jigsaw.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jigsaw" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jukebox.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jukebox.json new file mode 100644 index 000000000..4d2923ac5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jukebox.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jukebox" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_boat.json new file mode 100644 index 000000000..4cc14d5c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_button.json new file mode 100644 index 000000000..360738a39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_chest_boat.json new file mode 100644 index 000000000..e2b2e3bbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_door.json new file mode 100644 index 000000000..2fbc71f50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence.json new file mode 100644 index 000000000..c5e6b2aa0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence_gate.json new file mode 100644 index 000000000..8612c91d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_hanging_sign.json new file mode 100644 index 000000000..19222949e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_leaves.json new file mode 100644 index 000000000..4be7c1ad4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_log.json new file mode 100644 index 000000000..2e6c371bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_planks.json new file mode 100644 index 000000000..03f6926ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_pressure_plate.json new file mode 100644 index 000000000..18a6d0f5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sapling.json new file mode 100644 index 000000000..4dd71de23 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/jungle_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sign.json new file mode 100644 index 000000000..2ee2828e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_slab.json new file mode 100644 index 000000000..ed5a4321f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_stairs.json new file mode 100644 index 000000000..87e9264c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_trapdoor.json new file mode 100644 index 000000000..996f2808f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_wood.json new file mode 100644 index 000000000..c993caea2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/kelp.json new file mode 100644 index 000000000..b701d7b50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/kelp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/knowledge_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/knowledge_book.json new file mode 100644 index 000000000..bc355f72a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/knowledge_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/knowledge_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ladder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ladder.json new file mode 100644 index 000000000..b4fd6267c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ladder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/ladder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lantern.json new file mode 100644 index 000000000..ce9e5c103 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lantern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_block.json new file mode 100644 index 000000000..1dcdaf6e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lapis_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_lazuli.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_lazuli.json new file mode 100644 index 000000000..ee8bdea52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_lazuli.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lapis_lazuli" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_ore.json new file mode 100644 index 000000000..87cec1e47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lapis_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_amethyst_bud.json new file mode 100644 index 000000000..0e601416d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_amethyst_bud.json @@ -0,0 +1,11 @@ + { + "parent": "item/amethyst_bud", + "textures": { + "layer0": "minecraft:block/large_amethyst_bud" + }, + "display": { + "fixed": { + "translation": [ 0, 4, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_fern.json new file mode 100644 index 000000000..1072e9402 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_fern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/large_fern_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lava_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lava_bucket.json new file mode 100644 index 000000000..4052c615e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lava_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lava_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lead.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lead.json new file mode 100644 index 000000000..df628d663 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lead.json @@ -0,0 +1,13 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/lead" + }, + "display": { + "head": { + "rotation": [ 0, 0, 0 ], + "translation": [ 2.75, -2.75, -6.5], + "scale":[ 0.8, 0.8, 0.8] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather.json new file mode 100644 index 000000000..2b48d1f83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots.json new file mode 100644 index 000000000..fcba9da9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_amethyst_trim.json new file mode 100644 index 000000000..2b6f4a7e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_copper_trim.json new file mode 100644 index 000000000..e6a7f7c87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_diamond_trim.json new file mode 100644 index 000000000..07dc69b0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_emerald_trim.json new file mode 100644 index 000000000..9ebfe59ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_gold_trim.json new file mode 100644 index 000000000..e17c9a74b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_iron_trim.json new file mode 100644 index 000000000..196913b60 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_lapis_trim.json new file mode 100644 index 000000000..8c5b3bdd5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_netherite_trim.json new file mode 100644 index 000000000..254a56366 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_quartz_trim.json new file mode 100644 index 000000000..5d056ad76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_redstone_trim.json new file mode 100644 index 000000000..c85de7a41 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate.json new file mode 100644 index 000000000..93976e782 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_amethyst_trim.json new file mode 100644 index 000000000..b615e9476 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_copper_trim.json new file mode 100644 index 000000000..cccfd3c0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_diamond_trim.json new file mode 100644 index 000000000..660d6665a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_emerald_trim.json new file mode 100644 index 000000000..38ab18ae7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_gold_trim.json new file mode 100644 index 000000000..7dd884934 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_iron_trim.json new file mode 100644 index 000000000..9b6fcf497 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_lapis_trim.json new file mode 100644 index 000000000..343d68283 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_netherite_trim.json new file mode 100644 index 000000000..a95532ca9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_quartz_trim.json new file mode 100644 index 000000000..319aa4473 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_redstone_trim.json new file mode 100644 index 000000000..cb2008c1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet.json new file mode 100644 index 000000000..616e6ebdc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_amethyst_trim.json new file mode 100644 index 000000000..6f4df1bbe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_copper_trim.json new file mode 100644 index 000000000..2c1275a89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_diamond_trim.json new file mode 100644 index 000000000..315eb0dec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_emerald_trim.json new file mode 100644 index 000000000..0167efb86 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_gold_trim.json new file mode 100644 index 000000000..0e8c4560c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_iron_trim.json new file mode 100644 index 000000000..7b1b8b853 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_lapis_trim.json new file mode 100644 index 000000000..555c28286 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_netherite_trim.json new file mode 100644 index 000000000..9e3ddb7db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_quartz_trim.json new file mode 100644 index 000000000..63fe5bc15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_redstone_trim.json new file mode 100644 index 000000000..df0448307 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_horse_armor.json new file mode 100644 index 000000000..f96eae753 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings.json new file mode 100644 index 000000000..dcf68e178 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_amethyst_trim.json new file mode 100644 index 000000000..331e2096c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_copper_trim.json new file mode 100644 index 000000000..cc6a39454 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_diamond_trim.json new file mode 100644 index 000000000..9a5313eae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_emerald_trim.json new file mode 100644 index 000000000..71156943a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_gold_trim.json new file mode 100644 index 000000000..528c94e7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_iron_trim.json new file mode 100644 index 000000000..3e9d66348 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_lapis_trim.json new file mode 100644 index 000000000..6858077cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_netherite_trim.json new file mode 100644 index 000000000..abf3b6157 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_quartz_trim.json new file mode 100644 index 000000000..29b21d50c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_redstone_trim.json new file mode 100644 index 000000000..9b35d59f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lectern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lectern.json new file mode 100644 index 000000000..4f2c887a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lectern.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lectern" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lever.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lever.json new file mode 100644 index 000000000..d5a62d479 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lever.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lever" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light.json new file mode 100644 index 000000000..f53de1b53 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light.json @@ -0,0 +1,24 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light" + }, + "overrides": [ + { "predicate": { "level": 0.0000 }, "model": "item/light_00" }, + { "predicate": { "level": 0.0625 }, "model": "item/light_01" }, + { "predicate": { "level": 0.1250 }, "model": "item/light_02" }, + { "predicate": { "level": 0.1875 }, "model": "item/light_03" }, + { "predicate": { "level": 0.2500 }, "model": "item/light_04" }, + { "predicate": { "level": 0.3125 }, "model": "item/light_05" }, + { "predicate": { "level": 0.3750 }, "model": "item/light_06" }, + { "predicate": { "level": 0.4375 }, "model": "item/light_07" }, + { "predicate": { "level": 0.5000 }, "model": "item/light_08" }, + { "predicate": { "level": 0.5625 }, "model": "item/light_09" }, + { "predicate": { "level": 0.6250 }, "model": "item/light_10" }, + { "predicate": { "level": 0.6875 }, "model": "item/light_11" }, + { "predicate": { "level": 0.7500 }, "model": "item/light_12" }, + { "predicate": { "level": 0.8125 }, "model": "item/light_13" }, + { "predicate": { "level": 0.8750 }, "model": "item/light_14" }, + { "predicate": { "level": 0.9375 }, "model": "item/light_15" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_00.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_00.json new file mode 100644 index 000000000..f6029196c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_00.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_00" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_01.json new file mode 100644 index 000000000..50fe9d526 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_02.json new file mode 100644 index 000000000..3112e828d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_03.json new file mode 100644 index 000000000..7b7d13046 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_04.json new file mode 100644 index 000000000..eeca8b9c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_05.json new file mode 100644 index 000000000..920f2957c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_06.json new file mode 100644 index 000000000..f60f6bf7e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_07.json new file mode 100644 index 000000000..b795ac71e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_08.json new file mode 100644 index 000000000..d34ca3a15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_09.json new file mode 100644 index 000000000..861002fe1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_10.json new file mode 100644 index 000000000..3bda0d190 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_11.json new file mode 100644 index 000000000..582b6183d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_12.json new file mode 100644 index 000000000..f9dc8d109 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_13.json new file mode 100644 index 000000000..2f9d3815e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_14.json new file mode 100644 index 000000000..263b45fe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_15.json new file mode 100644 index 000000000..6f39d142a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bed.json new file mode 100644 index 000000000..fac4cda76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/light_blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle.json new file mode 100644 index 000000000..7f4e733b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_blue_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_back.json new file mode 100644 index 000000000..3a0cfc265 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_blue_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_front.json new file mode 100644 index 000000000..824e3ccda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_blue_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_candle.json new file mode 100644 index 000000000..e445d4ad5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_carpet.json new file mode 100644 index 000000000..9f199e5c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete.json new file mode 100644 index 000000000..68a0890f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete_powder.json new file mode 100644 index 000000000..22ec71d5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_dye.json new file mode 100644 index 000000000..297407daf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_glazed_terracotta.json new file mode 100644 index 000000000..3d2b3bd70 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_shulker_box.json new file mode 100644 index 000000000..d17a7729e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/light_blue_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass.json new file mode 100644 index 000000000..0aef7a927 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass_pane.json new file mode 100644 index 000000000..d810047f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/light_blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_terracotta.json new file mode 100644 index 000000000..06294ea2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_wool.json new file mode 100644 index 000000000..4f7bd4de3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bed.json new file mode 100644 index 000000000..67c2af9eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/light_gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle.json new file mode 100644 index 000000000..88a6b82d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_gray_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_back.json new file mode 100644 index 000000000..cbeab6291 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_gray_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_front.json new file mode 100644 index 000000000..bb274a9be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_gray_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_candle.json new file mode 100644 index 000000000..332e87c61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_carpet.json new file mode 100644 index 000000000..f603263e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete.json new file mode 100644 index 000000000..9a4e67de2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete_powder.json new file mode 100644 index 000000000..6726d5691 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_dye.json new file mode 100644 index 000000000..40a44accb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_glazed_terracotta.json new file mode 100644 index 000000000..46b9f1765 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_shulker_box.json new file mode 100644 index 000000000..0efe127aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/light_gray_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass.json new file mode 100644 index 000000000..e05c7e8d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass_pane.json new file mode 100644 index 000000000..502847437 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/light_gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_terracotta.json new file mode 100644 index 000000000..a6cbc2418 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_wool.json new file mode 100644 index 000000000..0bdc80f41 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_weighted_pressure_plate.json new file mode 100644 index 000000000..0922c6701 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_weighted_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_weighted_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lightning_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lightning_rod.json new file mode 100644 index 000000000..d701601a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lightning_rod.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lightning_rod" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lilac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lilac.json new file mode 100644 index 000000000..7e062c921 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lilac.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lilac_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_of_the_valley.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_of_the_valley.json new file mode 100644 index 000000000..2cd5a1cd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_of_the_valley.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lily_of_the_valley" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_pad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_pad.json new file mode 100644 index 000000000..e3aaf7f9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_pad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lily_pad" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bed.json new file mode 100644 index 000000000..3efda22b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/lime_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle.json new file mode 100644 index 000000000..3af851fbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lime_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_back.json new file mode 100644 index 000000000..5516ba153 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/lime_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_front.json new file mode 100644 index 000000000..2179105a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/lime_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_candle.json new file mode 100644 index 000000000..84617ccf8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lime_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_carpet.json new file mode 100644 index 000000000..b6f18c0a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete.json new file mode 100644 index 000000000..6becad9d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete_powder.json new file mode 100644 index 000000000..a74380d09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_dye.json new file mode 100644 index 000000000..36ae6c824 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lime_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_glazed_terracotta.json new file mode 100644 index 000000000..14b5723d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_shulker_box.json new file mode 100644 index 000000000..5e0062e22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/lime_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass.json new file mode 100644 index 000000000..becc32963 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass_pane.json new file mode 100644 index 000000000..7f15356d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lime_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_terracotta.json new file mode 100644 index 000000000..e61230306 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_wool.json new file mode 100644 index 000000000..e6600fa83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lingering_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lingering_potion.json new file mode 100644 index 000000000..35ce5d798 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lingering_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/potion_overlay", + "layer1": "item/lingering_potion" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/llama_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/llama_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lodestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lodestone.json new file mode 100644 index 000000000..f926ec2e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lodestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lodestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/loom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/loom.json new file mode 100644 index 000000000..0fe6a7fa6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/loom.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/loom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mace.json new file mode 100644 index 000000000..b62af83de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mace.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_mace", + "textures": { + "layer0": "minecraft:item/mace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bed.json new file mode 100644 index 000000000..19af87b67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/magenta_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle.json new file mode 100644 index 000000000..973ef505f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magenta_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_back.json new file mode 100644 index 000000000..6d8ed84d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/magenta_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_front.json new file mode 100644 index 000000000..89b5a6228 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/magenta_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_candle.json new file mode 100644 index 000000000..b4b756203 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magenta_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_carpet.json new file mode 100644 index 000000000..386f8fcc7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete.json new file mode 100644 index 000000000..8dce5e8f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete_powder.json new file mode 100644 index 000000000..e221911bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_dye.json new file mode 100644 index 000000000..f1ebae5bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magenta_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_glazed_terracotta.json new file mode 100644 index 000000000..45b94ea37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_shulker_box.json new file mode 100644 index 000000000..f21cad42d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/magenta_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass.json new file mode 100644 index 000000000..62ff86a5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass_pane.json new file mode 100644 index 000000000..ad9621d10 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/magenta_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_terracotta.json new file mode 100644 index 000000000..07d441995 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_wool.json new file mode 100644 index 000000000..e3ef178ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_block.json new file mode 100644 index 000000000..ac1aa2f4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magma_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cream.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cream.json new file mode 100644 index 000000000..f9d7a14d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cream.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magma_cream" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cube_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cube_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cube_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_boat.json new file mode 100644 index 000000000..6816d9e02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_button.json new file mode 100644 index 000000000..4bab5228e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_chest_boat.json new file mode 100644 index 000000000..006def690 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_door.json new file mode 100644 index 000000000..c67a120c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence.json new file mode 100644 index 000000000..b0d4d8c40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence_gate.json new file mode 100644 index 000000000..7eddb3396 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_hanging_sign.json new file mode 100644 index 000000000..431863612 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_leaves.json new file mode 100644 index 000000000..be1fca786 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_log.json new file mode 100644 index 000000000..9dbddf082 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_planks.json new file mode 100644 index 000000000..4c4f23bc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_pressure_plate.json new file mode 100644 index 000000000..90b728fe2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_propagule.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_propagule.json new file mode 100644 index 000000000..38a689e6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_propagule.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_propagule" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_roots.json new file mode 100644 index 000000000..39131b24f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_roots.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_roots" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_sign.json new file mode 100644 index 000000000..867584b16 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_slab.json new file mode 100644 index 000000000..036a10f77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_stairs.json new file mode 100644 index 000000000..281b61b54 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_trapdoor.json new file mode 100644 index 000000000..dec13fdec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_wood.json new file mode 100644 index 000000000..99e25bc79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/map.json new file mode 100644 index 000000000..282650e26 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/map" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/medium_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/medium_amethyst_bud.json new file mode 100644 index 000000000..686d48f48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/medium_amethyst_bud.json @@ -0,0 +1,11 @@ + { + "parent": "item/amethyst_bud", + "textures": { + "layer0": "minecraft:block/medium_amethyst_bud" + }, + "display": { + "fixed": { + "translation": [ 0, 6, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon.json new file mode 100644 index 000000000..f0bcf44e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/melon" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_seeds.json new file mode 100644 index 000000000..71e34075f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/melon_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_slice.json new file mode 100644 index 000000000..70a587eb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_slice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/milk_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/milk_bucket.json new file mode 100644 index 000000000..4f4a252f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/milk_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/milk_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/minecart.json new file mode 100644 index 000000000..f478d37cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/miner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/miner_pottery_sherd.json new file mode 100644 index 000000000..c31761d1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/miner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/miner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mojang_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mojang_banner_pattern.json new file mode 100644 index 000000000..bfac8a9e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mojang_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mojang_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mooshroom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mooshroom_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mooshroom_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_block.json new file mode 100644 index 000000000..14bf2a81b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/moss_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_carpet.json new file mode 100644 index 000000000..86a4dfd8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/moss_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone.json new file mode 100644 index 000000000..e865e8fc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_slab.json new file mode 100644 index 000000000..814e6a7a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_stairs.json new file mode 100644 index 000000000..bc2712d25 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_wall.json new file mode 100644 index 000000000..8baaff2b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_slab.json new file mode 100644 index 000000000..539b74242 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_stairs.json new file mode 100644 index 000000000..2366348b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_wall.json new file mode 100644 index 000000000..185b158a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_bricks.json new file mode 100644 index 000000000..a9fe750fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mourner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mourner_pottery_sherd.json new file mode 100644 index 000000000..08950424b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mourner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mourner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud.json new file mode 100644 index 000000000..bee0b1b02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_slab.json new file mode 100644 index 000000000..06e29291c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_stairs.json new file mode 100644 index 000000000..f6d908dd1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_wall.json new file mode 100644 index 000000000..1679aa639 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_bricks.json new file mode 100644 index 000000000..4ff42f1ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/muddy_mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/muddy_mangrove_roots.json new file mode 100644 index 000000000..a23b27d15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/muddy_mangrove_roots.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/muddy_mangrove_roots" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mule_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mule_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mule_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stem.json new file mode 100644 index 000000000..b791415fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mushroom_stem_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stew.json new file mode 100644 index 000000000..70e31deb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mushroom_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_11.json new file mode 100644 index 000000000..aa9afb6fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_13.json new file mode 100644 index 000000000..eb7eee8b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_5.json new file mode 100644 index 000000000..c431c6704 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_blocks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_blocks.json new file mode 100644 index 000000000..fa70fbc5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_blocks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_blocks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_cat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_cat.json new file mode 100644 index 000000000..86c9ff552 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_cat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_cat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_chirp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_chirp.json new file mode 100644 index 000000000..b89464c2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_chirp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_chirp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator.json new file mode 100644 index 000000000..cd8e281c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_creator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator_music_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator_music_box.json new file mode 100644 index 000000000..eeece1829 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator_music_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_creator_music_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_far.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_far.json new file mode 100644 index 000000000..3fe312854 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_far.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_far" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mall.json new file mode 100644 index 000000000..41eea3675 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_mall" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mellohi.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mellohi.json new file mode 100644 index 000000000..8b6fc61cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mellohi.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_mellohi" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_otherside.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_otherside.json new file mode 100644 index 000000000..3cfc540e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_otherside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_otherside" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_pigstep.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_pigstep.json new file mode 100644 index 000000000..241ffa8e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_pigstep.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_pigstep" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_precipice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_precipice.json new file mode 100644 index 000000000..051ae5e8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_precipice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_precipice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_relic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_relic.json new file mode 100644 index 000000000..d225ce681 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_relic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_relic" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_stal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_stal.json new file mode 100644 index 000000000..b9b968211 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_stal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_stal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_strad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_strad.json new file mode 100644 index 000000000..add37ea1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_strad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_strad" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_wait.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_wait.json new file mode 100644 index 000000000..215e160de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_wait.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_wait" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_ward.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_ward.json new file mode 100644 index 000000000..24bb7ee92 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_ward.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_ward" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mutton.json new file mode 100644 index 000000000..56c070d45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mutton.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mycelium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mycelium.json new file mode 100644 index 000000000..c97f2ec0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mycelium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mycelium" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/name_tag.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/name_tag.json new file mode 100644 index 000000000..ee668ff55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/name_tag.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/name_tag" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nautilus_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nautilus_shell.json new file mode 100644 index 000000000..35a8e5097 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nautilus_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nautilus_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick.json new file mode 100644 index 000000000..b72605844 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_fence.json new file mode 100644 index 000000000..5a72d31a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_slab.json new file mode 100644 index 000000000..dc7b20972 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_stairs.json new file mode 100644 index 000000000..c0669dfe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_wall.json new file mode 100644 index 000000000..e01270d4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_bricks.json new file mode 100644 index 000000000..ada571f62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_gold_ore.json new file mode 100644 index 000000000..ca989c791 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_gold_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_gold_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_quartz_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_quartz_ore.json new file mode 100644 index 000000000..4c6d1bf76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_quartz_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_quartz_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_sprouts.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_sprouts.json new file mode 100644 index 000000000..847698f84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_sprouts.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_sprouts" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_star.json new file mode 100644 index 000000000..b2874c285 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_star.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_star" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart.json new file mode 100644 index 000000000..de82d450e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_wart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart_block.json new file mode 100644 index 000000000..a66f9a274 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_wart_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_axe.json new file mode 100644 index 000000000..50d50009a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_block.json new file mode 100644 index 000000000..828da634f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/netherite_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots.json new file mode 100644 index 000000000..6aa46fb3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_boots_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_amethyst_trim.json new file mode 100644 index 000000000..e2049a22f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_copper_trim.json new file mode 100644 index 000000000..f0b92c017 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_diamond_trim.json new file mode 100644 index 000000000..8be51aca8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_emerald_trim.json new file mode 100644 index 000000000..65a08e500 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_gold_trim.json new file mode 100644 index 000000000..806f861b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_iron_trim.json new file mode 100644 index 000000000..2bffc3498 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_lapis_trim.json new file mode 100644 index 000000000..5d68abb3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_netherite_darker_trim.json new file mode 100644 index 000000000..b5c31415d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_quartz_trim.json new file mode 100644 index 000000000..23ff1d64a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_redstone_trim.json new file mode 100644 index 000000000..1c68b81f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate.json new file mode 100644 index 000000000..64e84e2ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_chestplate_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_amethyst_trim.json new file mode 100644 index 000000000..945363a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_copper_trim.json new file mode 100644 index 000000000..51c30e494 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_diamond_trim.json new file mode 100644 index 000000000..3a38051a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_emerald_trim.json new file mode 100644 index 000000000..e774df9d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_gold_trim.json new file mode 100644 index 000000000..fcd52da7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_iron_trim.json new file mode 100644 index 000000000..09d65529f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_lapis_trim.json new file mode 100644 index 000000000..ee2a9d3e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_netherite_darker_trim.json new file mode 100644 index 000000000..b80d9cff2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_quartz_trim.json new file mode 100644 index 000000000..51af51b88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_redstone_trim.json new file mode 100644 index 000000000..a1979f266 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet.json new file mode 100644 index 000000000..a39c9484b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_helmet_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_amethyst_trim.json new file mode 100644 index 000000000..534ef695d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_copper_trim.json new file mode 100644 index 000000000..d435422bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_diamond_trim.json new file mode 100644 index 000000000..e50ce756c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_emerald_trim.json new file mode 100644 index 000000000..22876e114 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_gold_trim.json new file mode 100644 index 000000000..405e6bbce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_iron_trim.json new file mode 100644 index 000000000..c7afe68c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_lapis_trim.json new file mode 100644 index 000000000..3bc06d400 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_netherite_darker_trim.json new file mode 100644 index 000000000..630061661 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_quartz_trim.json new file mode 100644 index 000000000..3b614408a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_redstone_trim.json new file mode 100644 index 000000000..533466cb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_hoe.json new file mode 100644 index 000000000..d9c185dcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_ingot.json new file mode 100644 index 000000000..0ef436c07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings.json new file mode 100644 index 000000000..eb7328071 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_leggings_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_amethyst_trim.json new file mode 100644 index 000000000..7a254f283 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_copper_trim.json new file mode 100644 index 000000000..3c2f5f3fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_diamond_trim.json new file mode 100644 index 000000000..ac71f9eed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_emerald_trim.json new file mode 100644 index 000000000..a30340338 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_gold_trim.json new file mode 100644 index 000000000..1e49fde47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_iron_trim.json new file mode 100644 index 000000000..09d1dbb99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_lapis_trim.json new file mode 100644 index 000000000..62a4e71d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_netherite_darker_trim.json new file mode 100644 index 000000000..734ea70e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_quartz_trim.json new file mode 100644 index 000000000..55e5445e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_redstone_trim.json new file mode 100644 index 000000000..e6bafbe73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_pickaxe.json new file mode 100644 index 000000000..663d51627 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_scrap.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_scrap.json new file mode 100644 index 000000000..8465c6781 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_scrap.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_scrap" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_shovel.json new file mode 100644 index 000000000..88e93948e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_sword.json new file mode 100644 index 000000000..a2d7ef428 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_upgrade_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_upgrade_smithing_template.json new file mode 100644 index 000000000..17012d1bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_upgrade_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherrack.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherrack.json new file mode 100644 index 000000000..39d75ee84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherrack.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/netherrack" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/note_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/note_block.json new file mode 100644 index 000000000..dd873344e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/note_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/note_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_boat.json new file mode 100644 index 000000000..793cf5206 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_button.json new file mode 100644 index 000000000..7e99608e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_chest_boat.json new file mode 100644 index 000000000..0d6c1c49b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_door.json new file mode 100644 index 000000000..93f7e7351 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence.json new file mode 100644 index 000000000..039fd9143 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence_gate.json new file mode 100644 index 000000000..04dee087b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_hanging_sign.json new file mode 100644 index 000000000..400c727f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_leaves.json new file mode 100644 index 000000000..a54fc8a7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_log.json new file mode 100644 index 000000000..b450f38fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_planks.json new file mode 100644 index 000000000..a03517532 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_pressure_plate.json new file mode 100644 index 000000000..ec3f44562 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sapling.json new file mode 100644 index 000000000..93a96b44e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sign.json new file mode 100644 index 000000000..0f6a0f050 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_slab.json new file mode 100644 index 000000000..263d7d00d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_stairs.json new file mode 100644 index 000000000..282b43100 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_trapdoor.json new file mode 100644 index 000000000..a041a5b48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_wood.json new file mode 100644 index 000000000..a51270ef8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/observer.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/observer.json new file mode 100644 index 000000000..c1e1ddfed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/observer.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/observer" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/obsidian.json new file mode 100644 index 000000000..0c124ed6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/obsidian" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ocelot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ocelot_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ocelot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ochre_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ochre_froglight.json new file mode 100644 index 000000000..d5bf2ba40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ochre_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/ochre_froglight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_bottle.json new file mode 100644 index 000000000..de2d68f74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ominous_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_trial_key.json new file mode 100644 index 000000000..32057a58b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_trial_key.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ominous_trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bed.json new file mode 100644 index 000000000..c014375aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/orange_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle.json new file mode 100644 index 000000000..593cfc8d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/orange_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_back.json new file mode 100644 index 000000000..f99807204 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/orange_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_front.json new file mode 100644 index 000000000..4387fded3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/orange_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_candle.json new file mode 100644 index 000000000..9f35bc60e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/orange_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_carpet.json new file mode 100644 index 000000000..f1421e235 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete.json new file mode 100644 index 000000000..6238369f9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete_powder.json new file mode 100644 index 000000000..3c854fe1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_dye.json new file mode 100644 index 000000000..4c5e5e9b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/orange_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_glazed_terracotta.json new file mode 100644 index 000000000..9a67ff627 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_shulker_box.json new file mode 100644 index 000000000..e8a725a2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/orange_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass.json new file mode 100644 index 000000000..b00fed28b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass_pane.json new file mode 100644 index 000000000..756f767a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/orange_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_terracotta.json new file mode 100644 index 000000000..6d399783a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_tulip.json new file mode 100644 index 000000000..70ba2d3af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/orange_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_wool.json new file mode 100644 index 000000000..e7c54f33f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxeye_daisy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxeye_daisy.json new file mode 100644 index 000000000..dc6eaab32 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxeye_daisy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/oxeye_daisy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_chiseled_copper.json new file mode 100644 index 000000000..720204270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper.json new file mode 100644 index 000000000..63a0dabe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_bulb.json new file mode 100644 index 000000000..1624fe6e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_door.json new file mode 100644 index 000000000..cd2edca38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oxidized_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_grate.json new file mode 100644 index 000000000..e2521c38e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_trapdoor.json new file mode 100644 index 000000000..3685e9b2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper.json new file mode 100644 index 000000000..36dfa030a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_slab.json new file mode 100644 index 000000000..a3d022426 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..fd8af1aab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_ice.json new file mode 100644 index 000000000..bada5d8ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_ice.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/packed_ice" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_mud.json new file mode 100644 index 000000000..8ac65758b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_mud.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/packed_mud" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/painting.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/painting.json new file mode 100644 index 000000000..0222609b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/painting.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/painting" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_hanging_moss.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_hanging_moss.json new file mode 100644 index 000000000..41100eeda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_hanging_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pale_hanging_moss" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_block.json new file mode 100644 index 000000000..89a69ea6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_moss_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_carpet.json new file mode 100644 index 000000000..26f94ad46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_moss_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_boat.json new file mode 100644 index 000000000..d40a5136e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_button.json new file mode 100644 index 000000000..cdad389ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_chest_boat.json new file mode 100644 index 000000000..00d122ead --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_door.json new file mode 100644 index 000000000..0f7964be1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence.json new file mode 100644 index 000000000..b5b713542 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence_gate.json new file mode 100644 index 000000000..1c5a842ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_hanging_sign.json new file mode 100644 index 000000000..4d5f08f48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_leaves.json new file mode 100644 index 000000000..5b7e13626 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_log.json new file mode 100644 index 000000000..0eb844ba0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_planks.json new file mode 100644 index 000000000..d797221c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_pressure_plate.json new file mode 100644 index 000000000..4cd5b4f21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sapling.json new file mode 100644 index 000000000..7c162db68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pale_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sign.json new file mode 100644 index 000000000..c9018638a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_slab.json new file mode 100644 index 000000000..bcd617eca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_stairs.json new file mode 100644 index 000000000..6b6827725 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_trapdoor.json new file mode 100644 index 000000000..4da9662e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_wood.json new file mode 100644 index 000000000..60be9f583 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/panda_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/panda_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/panda_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/paper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/paper.json new file mode 100644 index 000000000..5cfa9dd85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/paper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/paper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/parrot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/parrot_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/parrot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pearlescent_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pearlescent_froglight.json new file mode 100644 index 000000000..3a9d87f48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pearlescent_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pearlescent_froglight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/peony.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/peony.json new file mode 100644 index 000000000..b87b076e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/peony.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/peony_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/petrified_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/petrified_oak_slab.json new file mode 100644 index 000000000..36ecfd7c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/petrified_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/petrified_oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_membrane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_membrane.json new file mode 100644 index 000000000..aa7891ced --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_membrane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/phantom_membrane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pig_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pig_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pig_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_banner_pattern.json new file mode 100644 index 000000000..e19d96c8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/piglin_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_brute_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_brute_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_brute_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pillager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pillager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pillager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bed.json new file mode 100644 index 000000000..7565d98f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/pink_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle.json new file mode 100644 index 000000000..2d76ab30e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_back.json new file mode 100644 index 000000000..c30768bb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/pink_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_front.json new file mode 100644 index 000000000..26d8f26d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/pink_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_candle.json new file mode 100644 index 000000000..0d64b1caf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_carpet.json new file mode 100644 index 000000000..b27091087 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete.json new file mode 100644 index 000000000..770e1febc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete_powder.json new file mode 100644 index 000000000..29803f664 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_dye.json new file mode 100644 index 000000000..bf230ebc6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_glazed_terracotta.json new file mode 100644 index 000000000..c8ea2b254 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_petals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_petals.json new file mode 100644 index 000000000..ce099c8a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_petals.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_petals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_shulker_box.json new file mode 100644 index 000000000..e71465fea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/pink_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass.json new file mode 100644 index 000000000..b0bc89687 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass_pane.json new file mode 100644 index 000000000..13681586a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pink_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_terracotta.json new file mode 100644 index 000000000..2e5587491 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_tulip.json new file mode 100644 index 000000000..9d76762d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pink_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_wool.json new file mode 100644 index 000000000..9f1e510fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piston.json new file mode 100644 index 000000000..669d1c40d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piston.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/piston_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_plant.json new file mode 100644 index 000000000..e5898a0fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_plant.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pitcher_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_pod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_pod.json new file mode 100644 index 000000000..b5f561ac3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_pod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pitcher_pod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/player_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/player_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/player_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/plenty_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/plenty_pottery_sherd.json new file mode 100644 index 000000000..c3fd23217 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/plenty_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/plenty_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/podzol.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/podzol.json new file mode 100644 index 000000000..ec0474983 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/podzol.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/podzol" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pointed_dripstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pointed_dripstone.json new file mode 100644 index 000000000..f30f9594f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pointed_dripstone.json @@ -0,0 +1,18 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pointed_dripstone" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 100, 0 ], + "translation": [ -1, -1, 0], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 100, 0 ], + "translation": [ 0, -2, 0], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poisonous_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poisonous_potato.json new file mode 100644 index 000000000..f35777956 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poisonous_potato.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/poisonous_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polar_bear_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polar_bear_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polar_bear_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite.json new file mode 100644 index 000000000..4968aa477 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_andesite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_slab.json new file mode 100644 index 000000000..dbaf20ca5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_andesite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_stairs.json new file mode 100644 index 000000000..0695848c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_andesite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_basalt.json new file mode 100644 index 000000000..00d0a8ab0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_basalt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_basalt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone.json new file mode 100644 index 000000000..b60255afe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_slab.json new file mode 100644 index 000000000..35a5786cb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_stairs.json new file mode 100644 index 000000000..bfdf49c15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_wall.json new file mode 100644 index 000000000..58262eeda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_bricks.json new file mode 100644 index 000000000..2c7c6530e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_button.json new file mode 100644 index 000000000..e815336ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_pressure_plate.json new file mode 100644 index 000000000..766e8c663 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_slab.json new file mode 100644 index 000000000..ab598bb6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_stairs.json new file mode 100644 index 000000000..a21c5771d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_wall.json new file mode 100644 index 000000000..23e2c0d43 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate.json new file mode 100644 index 000000000..a2e3fde15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_slab.json new file mode 100644 index 000000000..0bb032412 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_stairs.json new file mode 100644 index 000000000..06f41f9f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_wall.json new file mode 100644 index 000000000..1d05cf88b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite.json new file mode 100644 index 000000000..aed477503 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_diorite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_slab.json new file mode 100644 index 000000000..2fd79e187 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_diorite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_stairs.json new file mode 100644 index 000000000..0ec5d5a68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_diorite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite.json new file mode 100644 index 000000000..11ee51c44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_granite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_slab.json new file mode 100644 index 000000000..add758b6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_granite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_stairs.json new file mode 100644 index 000000000..083d71c89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_granite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff.json new file mode 100644 index 000000000..a34c7b0a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_slab.json new file mode 100644 index 000000000..948607bf7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_stairs.json new file mode 100644 index 000000000..98b91c002 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_wall.json new file mode 100644 index 000000000..c0a8bed68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/popped_chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/popped_chorus_fruit.json new file mode 100644 index 000000000..b5357bde3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/popped_chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/popped_chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poppy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poppy.json new file mode 100644 index 000000000..089cf3ed3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poppy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/poppy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/porkchop.json new file mode 100644 index 000000000..7de45731d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/porkchop.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potato.json new file mode 100644 index 000000000..3ba923817 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potato.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potion.json new file mode 100644 index 000000000..73c2a578b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potion.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/potion_overlay", + "layer1": "item/potion" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powder_snow_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powder_snow_bucket.json new file mode 100644 index 000000000..e99a5f9f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powder_snow_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/powder_snow_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powered_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powered_rail.json new file mode 100644 index 000000000..ecaf13bf2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powered_rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/powered_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine.json new file mode 100644 index 000000000..052a4159f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_slab.json new file mode 100644 index 000000000..905e44298 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_stairs.json new file mode 100644 index 000000000..e5f6c0f4a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_bricks.json new file mode 100644 index 000000000..dfe1634ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_crystals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_crystals.json new file mode 100644 index 000000000..6883eebef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_crystals.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/prismarine_crystals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_shard.json new file mode 100644 index 000000000..7b533d3f9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/prismarine_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_slab.json new file mode 100644 index 000000000..9894ef18d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_stairs.json new file mode 100644 index 000000000..356abf591 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_wall.json new file mode 100644 index 000000000..16dec992c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prize_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prize_pottery_sherd.json new file mode 100644 index 000000000..f73490ab0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prize_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/prize_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish.json new file mode 100644 index 000000000..11ebd2190 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pufferfish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_bucket.json new file mode 100644 index 000000000..b5abbd8f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pufferfish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin.json new file mode 100644 index 000000000..f725b4769 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pumpkin" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_pie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_pie.json new file mode 100644 index 000000000..72ba77d56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_pie.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pumpkin_pie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_seeds.json new file mode 100644 index 000000000..bd203f063 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pumpkin_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bed.json new file mode 100644 index 000000000..606fae8c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/purple_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle.json new file mode 100644 index 000000000..a6a56bf61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/purple_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_back.json new file mode 100644 index 000000000..17cf859ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/purple_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_front.json new file mode 100644 index 000000000..6ac614970 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/purple_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_candle.json new file mode 100644 index 000000000..9a0d2020a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/purple_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_carpet.json new file mode 100644 index 000000000..94ffd9f44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete.json new file mode 100644 index 000000000..437f58fcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete_powder.json new file mode 100644 index 000000000..77dba4327 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_dye.json new file mode 100644 index 000000000..a4082d107 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/purple_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_glazed_terracotta.json new file mode 100644 index 000000000..be42ab1a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_shulker_box.json new file mode 100644 index 000000000..8521d10fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/purple_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass.json new file mode 100644 index 000000000..cf2ee6736 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass_pane.json new file mode 100644 index 000000000..646a69b90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/purple_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_terracotta.json new file mode 100644 index 000000000..a69670d85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_wool.json new file mode 100644 index 000000000..71160d268 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_block.json new file mode 100644 index 000000000..3e7dfa5a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_pillar.json new file mode 100644 index 000000000..2cb1ab30e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_pillar" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_slab.json new file mode 100644 index 000000000..385a03bef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_stairs.json new file mode 100644 index 000000000..4f8810267 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz.json new file mode 100644 index 000000000..6da4a8601 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_block.json new file mode 100644 index 000000000..f0966126c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_bricks.json new file mode 100644 index 000000000..d2d45cf7c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_pillar.json new file mode 100644 index 000000000..52905d111 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_pillar" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_slab.json new file mode 100644 index 000000000..9cd0ebe73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_stairs.json new file mode 100644 index 000000000..4126d6e4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit.json new file mode 100644 index 000000000..0c0294fff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_foot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_foot.json new file mode 100644 index 000000000..dc68690a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_foot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit_foot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_hide.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_hide.json new file mode 100644 index 000000000..b6327793e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_hide.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit_hide" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_stew.json new file mode 100644 index 000000000..311dfe991 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_stew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rail.json new file mode 100644 index 000000000..4e07db100 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raiser_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raiser_armor_trim_smithing_template.json new file mode 100644 index 000000000..b80f4a01d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raiser_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raiser_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ravager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ravager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ravager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper.json new file mode 100644 index 000000000..94712fdeb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raw_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper_block.json new file mode 100644 index 000000000..d24df4666 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/raw_copper_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold.json new file mode 100644 index 000000000..df31aa71a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raw_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold_block.json new file mode 100644 index 000000000..915e94b9c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/raw_gold_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron.json new file mode 100644 index 000000000..57ba62723 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raw_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron_block.json new file mode 100644 index 000000000..b6e6e032f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/raw_iron_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass.json new file mode 100644 index 000000000..91fb13b8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass.json @@ -0,0 +1,41 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/recovery_compass_16" + }, + "overrides": [ + { "predicate": { "angle": 0.000000 }, "model": "item/recovery_compass" }, + { "predicate": { "angle": 0.015625 }, "model": "item/recovery_compass_17" }, + { "predicate": { "angle": 0.046875 }, "model": "item/recovery_compass_18" }, + { "predicate": { "angle": 0.078125 }, "model": "item/recovery_compass_19" }, + { "predicate": { "angle": 0.109375 }, "model": "item/recovery_compass_20" }, + { "predicate": { "angle": 0.140625 }, "model": "item/recovery_compass_21" }, + { "predicate": { "angle": 0.171875 }, "model": "item/recovery_compass_22" }, + { "predicate": { "angle": 0.203125 }, "model": "item/recovery_compass_23" }, + { "predicate": { "angle": 0.234375 }, "model": "item/recovery_compass_24" }, + { "predicate": { "angle": 0.265625 }, "model": "item/recovery_compass_25" }, + { "predicate": { "angle": 0.296875 }, "model": "item/recovery_compass_26" }, + { "predicate": { "angle": 0.328125 }, "model": "item/recovery_compass_27" }, + { "predicate": { "angle": 0.359375 }, "model": "item/recovery_compass_28" }, + { "predicate": { "angle": 0.390625 }, "model": "item/recovery_compass_29" }, + { "predicate": { "angle": 0.421875 }, "model": "item/recovery_compass_30" }, + { "predicate": { "angle": 0.453125 }, "model": "item/recovery_compass_31" }, + { "predicate": { "angle": 0.484375 }, "model": "item/recovery_compass_00" }, + { "predicate": { "angle": 0.515625 }, "model": "item/recovery_compass_01" }, + { "predicate": { "angle": 0.546875 }, "model": "item/recovery_compass_02" }, + { "predicate": { "angle": 0.578125 }, "model": "item/recovery_compass_03" }, + { "predicate": { "angle": 0.609375 }, "model": "item/recovery_compass_04" }, + { "predicate": { "angle": 0.640625 }, "model": "item/recovery_compass_05" }, + { "predicate": { "angle": 0.671875 }, "model": "item/recovery_compass_06" }, + { "predicate": { "angle": 0.703125 }, "model": "item/recovery_compass_07" }, + { "predicate": { "angle": 0.734375 }, "model": "item/recovery_compass_08" }, + { "predicate": { "angle": 0.765625 }, "model": "item/recovery_compass_09" }, + { "predicate": { "angle": 0.796875 }, "model": "item/recovery_compass_10" }, + { "predicate": { "angle": 0.828125 }, "model": "item/recovery_compass_11" }, + { "predicate": { "angle": 0.859375 }, "model": "item/recovery_compass_12" }, + { "predicate": { "angle": 0.890625 }, "model": "item/recovery_compass_13" }, + { "predicate": { "angle": 0.921875 }, "model": "item/recovery_compass_14" }, + { "predicate": { "angle": 0.953125 }, "model": "item/recovery_compass_15" }, + { "predicate": { "angle": 0.984375 }, "model": "item/recovery_compass" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_00.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_00.json new file mode 100644 index 000000000..753be1b22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_00.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_00" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_01.json new file mode 100644 index 000000000..3e0630888 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_02.json new file mode 100644 index 000000000..c6bfef5db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_03.json new file mode 100644 index 000000000..874a349e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_04.json new file mode 100644 index 000000000..d1fb39c2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_05.json new file mode 100644 index 000000000..c1958b511 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_06.json new file mode 100644 index 000000000..7ebdd8c82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_07.json new file mode 100644 index 000000000..eabb1f035 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_08.json new file mode 100644 index 000000000..d59f4c131 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_09.json new file mode 100644 index 000000000..cb2ddbc9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_10.json new file mode 100644 index 000000000..30618a33f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_11.json new file mode 100644 index 000000000..6d29eae1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_12.json new file mode 100644 index 000000000..c455ce86f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_13.json new file mode 100644 index 000000000..9982cc53d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_14.json new file mode 100644 index 000000000..0ba7e45b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_15.json new file mode 100644 index 000000000..adb5c1298 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_17.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_17.json new file mode 100644 index 000000000..5a906f0b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_17.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_17" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_18.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_18.json new file mode 100644 index 000000000..d2665866a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_18.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_18" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_19.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_19.json new file mode 100644 index 000000000..fe36dcac0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_19.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_19" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_20.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_20.json new file mode 100644 index 000000000..1632015ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_20.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_20" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_21.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_21.json new file mode 100644 index 000000000..1f52a2cfb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_21.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_21" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_22.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_22.json new file mode 100644 index 000000000..bae9ef118 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_22.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_22" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_23.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_23.json new file mode 100644 index 000000000..f46180c5c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_23.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_23" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_24.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_24.json new file mode 100644 index 000000000..c7acb6b87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_24.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_24" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_25.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_25.json new file mode 100644 index 000000000..234b7ab93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_25.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_25" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_26.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_26.json new file mode 100644 index 000000000..0f988f3b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_26.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_26" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_27.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_27.json new file mode 100644 index 000000000..1587617bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_27.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_27" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_28.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_28.json new file mode 100644 index 000000000..4153fb073 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_28.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_28" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_29.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_29.json new file mode 100644 index 000000000..47e3fff10 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_29.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_29" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_30.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_30.json new file mode 100644 index 000000000..6a39baad3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_30.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_30" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_31.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_31.json new file mode 100644 index 000000000..e1bb4c130 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_31.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_31" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bed.json new file mode 100644 index 000000000..7a15f5512 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/red_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle.json new file mode 100644 index 000000000..2b450a41e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/red_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_back.json new file mode 100644 index 000000000..1ff1d08e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/red_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_front.json new file mode 100644 index 000000000..b8fe9c321 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/red_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_candle.json new file mode 100644 index 000000000..54fbba028 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/red_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_carpet.json new file mode 100644 index 000000000..18e4d52eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete.json new file mode 100644 index 000000000..34a0630b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete_powder.json new file mode 100644 index 000000000..36e0ede7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_dye.json new file mode 100644 index 000000000..77765d363 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/red_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_glazed_terracotta.json new file mode 100644 index 000000000..3870bc2ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom.json new file mode 100644 index 000000000..3be0c03ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/red_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom_block.json new file mode 100644 index 000000000..5ed44fb45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_mushroom_block_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_slab.json new file mode 100644 index 000000000..73ba1684a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_stairs.json new file mode 100644 index 000000000..98d716be0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_wall.json new file mode 100644 index 000000000..48f50a647 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_bricks.json new file mode 100644 index 000000000..51d3d11c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sand.json new file mode 100644 index 000000000..f3459a820 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sand" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone.json new file mode 100644 index 000000000..305751fa5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_slab.json new file mode 100644 index 000000000..c74735659 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_stairs.json new file mode 100644 index 000000000..6c0f1c52e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_wall.json new file mode 100644 index 000000000..7dc10d93d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_shulker_box.json new file mode 100644 index 000000000..618ccff66 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/red_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass.json new file mode 100644 index 000000000..235d35da2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass_pane.json new file mode 100644 index 000000000..699b006f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/red_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_terracotta.json new file mode 100644 index 000000000..2ded3a9d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_tulip.json new file mode 100644 index 000000000..406b1ecef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/red_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_wool.json new file mode 100644 index 000000000..b0dd8dd66 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone.json new file mode 100644 index 000000000..d273009e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_block.json new file mode 100644 index 000000000..71d9d176c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/redstone_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_lamp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_lamp.json new file mode 100644 index 000000000..47f36c435 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_lamp.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/redstone_lamp" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_ore.json new file mode 100644 index 000000000..503fed06e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/redstone_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_torch.json new file mode 100644 index 000000000..ba2060bba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/redstone_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/reinforced_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/reinforced_deepslate.json new file mode 100644 index 000000000..624fd3c45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/reinforced_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/reinforced_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeater.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeater.json new file mode 100644 index 000000000..7a8b05fb4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeater.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/repeater" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeating_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeating_command_block.json new file mode 100644 index 000000000..75492a4b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeating_command_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/repeating_command_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/respawn_anchor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/respawn_anchor.json new file mode 100644 index 000000000..7fa102a3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/respawn_anchor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/respawn_anchor_0" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rib_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rib_armor_trim_smithing_template.json new file mode 100644 index 000000000..dce771717 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rib_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rib_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rooted_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rooted_dirt.json new file mode 100644 index 000000000..3d6a9cda4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rooted_dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/rooted_dirt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rose_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rose_bush.json new file mode 100644 index 000000000..4a71ea357 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rose_bush.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/rose_bush_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rotten_flesh.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rotten_flesh.json new file mode 100644 index 000000000..6d7899529 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rotten_flesh.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rotten_flesh" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/saddle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/saddle.json new file mode 100644 index 000000000..91895cb40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/saddle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/saddle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon.json new file mode 100644 index 000000000..dcac1db78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_bucket.json new file mode 100644 index 000000000..15217f222 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/salmon_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sand.json new file mode 100644 index 000000000..96c1d00d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sand" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone.json new file mode 100644 index 000000000..474b0ddba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_slab.json new file mode 100644 index 000000000..7b8fc6bdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_stairs.json new file mode 100644 index 000000000..989e41fff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_wall.json new file mode 100644 index 000000000..b4f2149ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scaffolding.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scaffolding.json new file mode 100644 index 000000000..1946d80f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scaffolding.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/scaffolding_stable" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scrape_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scrape_pottery_sherd.json new file mode 100644 index 000000000..52717375a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scrape_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/scrape_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk.json new file mode 100644 index 000000000..12d25d5fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_catalyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_catalyst.json new file mode 100644 index 000000000..89e0b5f7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_catalyst.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk_catalyst" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_sensor.json new file mode 100644 index 000000000..a2b8a77da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_sensor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk_sensor_inactive" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_shrieker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_shrieker.json new file mode 100644 index 000000000..a6c19ae0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_shrieker.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk_shrieker" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_vein.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_vein.json new file mode 100644 index 000000000..78df0e28f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_vein.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/sculk_vein" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_lantern.json new file mode 100644 index 000000000..72561fc08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sea_lantern" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_pickle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_pickle.json new file mode 100644 index 000000000..c7f2f9688 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_pickle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sea_pickle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/seagrass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/seagrass.json new file mode 100644 index 000000000..91c88ccb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/seagrass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/seagrass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sentry_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sentry_armor_trim_smithing_template.json new file mode 100644 index 000000000..37c62bc90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sentry_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sentry_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shaper_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shaper_armor_trim_smithing_template.json new file mode 100644 index 000000000..0d10c46b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shaper_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shaper_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheaf_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheaf_pottery_sherd.json new file mode 100644 index 000000000..f5f85477d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheaf_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sheaf_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shears.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shears.json new file mode 100644 index 000000000..bc9bf0148 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shears.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shears" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheep_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheep_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheep_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shelter_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shelter_pottery_sherd.json new file mode 100644 index 000000000..11fc43b3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shelter_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shelter_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield.json new file mode 100644 index 000000000..dbfc19385 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield.json @@ -0,0 +1,52 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "block/dark_oak_planks" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 10, 6, -4 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 10, 6, 12 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, 5 ], + "translation": [ -10, 2, -10 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 180, 5 ], + "translation": [ 10, 0, -10 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -4.5, 4.5, -5], + "scale":[ 0.55, 0.55, 0.55] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 2, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + }, + "overrides": [ + { + "predicate": { + "blocking": 1 + }, + "model": "item/shield_blocking" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield_blocking.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield_blocking.json new file mode 100644 index 000000000..c68d1cf30 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield_blocking.json @@ -0,0 +1,34 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "block/dark_oak_planks" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 45, 155, 0 ], + "translation": [ -3.49, 11, -2 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 45, 155, 0 ], + "translation": [ 11.51, 7, 2.5 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, -5 ], + "translation": [ -15, 5, -11 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 180, -5 ], + "translation": [ 5, 5, -11 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/short_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/short_grass.json new file mode 100644 index 000000000..50fc8466b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/short_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/short_grass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shroomlight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shroomlight.json new file mode 100644 index 000000000..5d8aef635 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shroomlight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/shroomlight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_box.json new file mode 100644 index 000000000..f547516b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_shell.json new file mode 100644 index 000000000..6aae0f45e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shulker_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silence_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silence_armor_trim_smithing_template.json new file mode 100644 index 000000000..5254eced6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silence_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/silence_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silverfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silverfish_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silverfish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_horse_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_horse_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_skull.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_skull.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_banner_pattern.json new file mode 100644 index 000000000..a39281f76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/skull_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_pottery_sherd.json new file mode 100644 index 000000000..b7765121c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/skull_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_ball.json new file mode 100644 index 000000000..812f0860a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_ball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/slime_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_block.json new file mode 100644 index 000000000..848fbdafc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/slime_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_amethyst_bud.json new file mode 100644 index 000000000..cfa83d8e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_amethyst_bud.json @@ -0,0 +1,16 @@ +{ + "parent": "item/amethyst_bud", + "textures": { + "layer0": "minecraft:block/small_amethyst_bud" + }, + "display": { + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 0, 6, 0 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "fixed": { + "translation": [ 0, 7, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_dripleaf.json new file mode 100644 index 000000000..488841ff7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_dripleaf.json @@ -0,0 +1,15 @@ +{ + "parent": "minecraft:block/small_dripleaf_top", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 4, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "translation": [ 0, 3.2, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smithing_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smithing_table.json new file mode 100644 index 000000000..3028d70f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smithing_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smithing_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smoker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smoker.json new file mode 100644 index 000000000..7d2740184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smoker.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smoker" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_basalt.json new file mode 100644 index 000000000..327e00547 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_basalt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_basalt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz.json new file mode 100644 index 000000000..b2047c832 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_quartz" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_slab.json new file mode 100644 index 000000000..55c15fa9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_quartz_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_stairs.json new file mode 100644 index 000000000..bddcd1cc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_quartz_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone.json new file mode 100644 index 000000000..3e8943e41 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_slab.json new file mode 100644 index 000000000..cae67922c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_red_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_stairs.json new file mode 100644 index 000000000..1ba4dd5e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_red_sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone.json new file mode 100644 index 000000000..d702d2871 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_slab.json new file mode 100644 index 000000000..934c7adac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_stairs.json new file mode 100644 index 000000000..74ab5a1a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone.json new file mode 100644 index 000000000..393605bd2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone_slab.json new file mode 100644 index 000000000..e33dcb4c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_stone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_egg.json new file mode 100644 index 000000000..0f35a4d91 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sniffer_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snort_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snort_pottery_sherd.json new file mode 100644 index 000000000..d3a8ebc30 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snort_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/snort_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snout_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snout_armor_trim_smithing_template.json new file mode 100644 index 000000000..a6c6c622e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snout_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/snout_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow.json new file mode 100644 index 000000000..a4d1c9894 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/snow_height2" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_block.json new file mode 100644 index 000000000..1564e7759 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/snow_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_golem_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_golem_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snowball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snowball.json new file mode 100644 index 000000000..7dec4deea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snowball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/snowball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_campfire.json new file mode 100644 index 000000000..ef63b765a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_campfire.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/soul_campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_lantern.json new file mode 100644 index 000000000..53e659088 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_lantern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/soul_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_sand.json new file mode 100644 index 000000000..50df79cfb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/soul_sand" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_soil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_soil.json new file mode 100644 index 000000000..c8c62d360 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_soil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/soul_soil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_torch.json new file mode 100644 index 000000000..96dbfdfb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/soul_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spawner.json new file mode 100644 index 000000000..f54a94f6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spectral_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spectral_arrow.json new file mode 100644 index 000000000..33a79f8ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spectral_arrow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spectral_arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_eye.json new file mode 100644 index 000000000..fd7547f4a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_eye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spire_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spire_armor_trim_smithing_template.json new file mode 100644 index 000000000..fe7a6df08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spire_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spire_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/splash_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/splash_potion.json new file mode 100644 index 000000000..d9aaa6b84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/splash_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/potion_overlay", + "layer1": "item/splash_potion" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sponge.json new file mode 100644 index 000000000..4e456fd9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sponge.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sponge" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spore_blossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spore_blossom.json new file mode 100644 index 000000000..3eb054c87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spore_blossom.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spore_blossom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_boat.json new file mode 100644 index 000000000..a425c2c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_button.json new file mode 100644 index 000000000..91d8bc033 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_chest_boat.json new file mode 100644 index 000000000..36d7a7f59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_door.json new file mode 100644 index 000000000..c1a3bf29c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence.json new file mode 100644 index 000000000..e2c378405 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence_gate.json new file mode 100644 index 000000000..6f4473e4a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_hanging_sign.json new file mode 100644 index 000000000..90c40e299 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_leaves.json new file mode 100644 index 000000000..6c64eda57 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_log.json new file mode 100644 index 000000000..84bd7dc31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_planks.json new file mode 100644 index 000000000..d87b17208 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_pressure_plate.json new file mode 100644 index 000000000..b0de07876 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sapling.json new file mode 100644 index 000000000..1c9752de5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/spruce_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sign.json new file mode 100644 index 000000000..f5c26ebf9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_slab.json new file mode 100644 index 000000000..d5fa4c0f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_stairs.json new file mode 100644 index 000000000..7957a5a1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_trapdoor.json new file mode 100644 index 000000000..0eb91e4ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_wood.json new file mode 100644 index 000000000..593e4ec82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass.json new file mode 100644 index 000000000..c5d7e691c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spyglass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass_in_hand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass_in_hand.json new file mode 100644 index 000000000..073bfd290 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass_in_hand.json @@ -0,0 +1,52 @@ +{ + "textures": { + "spyglass": "item/spyglass_model" + }, + "elements": [ + { + "from": [7, 8.5, 7], + "to": [9, 13.5, 9], + "faces": { + "north": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "east": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "south": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "west": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#spyglass"} + } + }, + { + "from": [6.9, 2.4, 6.9], + "to": [9.1, 8.6, 9.1], + "faces": { + "north": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "east": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "south": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "west": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "up": {"uv": [0, 5, 2, 7], "texture": "#spyglass"}, + "down": {"uv": [0, 13, 2, 15], "texture": "#spyglass"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "translation": [0, -2, 0] + }, + "ground": { + "rotation": [90, 0, 0] + }, + "gui": { + "rotation": [-67.5, 0, 45], + "scale": [1.5, 1.5, 1.5] + }, + "head": { + "rotation": [90, 0, 0], + "translation": [0, 0, -16], + "scale": [1.6, 1.6, 1.6] + }, + "fixed": { + "translation": [0, 0, -1.5], + "scale": [1.5, 1.5, 1.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/squid_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/squid_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stick.json new file mode 100644 index 000000000..f0dc3b971 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sticky_piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sticky_piston.json new file mode 100644 index 000000000..69bfdc943 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sticky_piston.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sticky_piston_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone.json new file mode 100644 index 000000000..37f27f10b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_axe.json new file mode 100644 index 000000000..1e3bc7e89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_slab.json new file mode 100644 index 000000000..9dd874ac4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_stairs.json new file mode 100644 index 000000000..d62eb4b36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_wall.json new file mode 100644 index 000000000..929da51fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_bricks.json new file mode 100644 index 000000000..51de871c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_button.json new file mode 100644 index 000000000..8802ddfbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_hoe.json new file mode 100644 index 000000000..13f40c63b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pickaxe.json new file mode 100644 index 000000000..dec09cbe7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pressure_plate.json new file mode 100644 index 000000000..bcb76d79b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_shovel.json new file mode 100644 index 000000000..727a68b95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_slab.json new file mode 100644 index 000000000..63de5381d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_stairs.json new file mode 100644 index 000000000..7b9a82a95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_sword.json new file mode 100644 index 000000000..ba4a89f15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stonecutter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stonecutter.json new file mode 100644 index 000000000..54ffedeb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stonecutter.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stonecutter" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stray_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stray_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stray_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/strider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/strider_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/strider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/string.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/string.json new file mode 100644 index 000000000..ca6251bf8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/string.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/string" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_log.json new file mode 100644 index 000000000..d9a3ce1f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_acacia_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_wood.json new file mode 100644 index 000000000..4c6537235 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_acacia_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_bamboo_block.json new file mode 100644 index 000000000..38c93f323 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_bamboo_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_bamboo_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_log.json new file mode 100644 index 000000000..d984bf7da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_birch_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_wood.json new file mode 100644 index 000000000..dc0b6698a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_birch_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_log.json new file mode 100644 index 000000000..6fb61fed7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_cherry_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_wood.json new file mode 100644 index 000000000..73a11cdc1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_cherry_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_hyphae.json new file mode 100644 index 000000000..254d55150 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_crimson_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_stem.json new file mode 100644 index 000000000..701f56705 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_crimson_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_log.json new file mode 100644 index 000000000..d193f5f09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_dark_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_wood.json new file mode 100644 index 000000000..683446da5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_dark_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_log.json new file mode 100644 index 000000000..1c6cf473b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_jungle_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_wood.json new file mode 100644 index 000000000..ed78aec7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_jungle_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_log.json new file mode 100644 index 000000000..4155be189 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_mangrove_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_wood.json new file mode 100644 index 000000000..159d89d92 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_mangrove_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_log.json new file mode 100644 index 000000000..bb3cafbe7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_wood.json new file mode 100644 index 000000000..9ba3fb2ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_log.json new file mode 100644 index 000000000..3021c2852 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_pale_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_wood.json new file mode 100644 index 000000000..c55c0a6a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_pale_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_log.json new file mode 100644 index 000000000..e110cdf53 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_spruce_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_wood.json new file mode 100644 index 000000000..658f768b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_spruce_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_hyphae.json new file mode 100644 index 000000000..0ebe2320b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_warped_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_stem.json new file mode 100644 index 000000000..6147725dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_warped_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_block.json new file mode 100644 index 000000000..1325f7708 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/structure_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_void.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_void.json new file mode 100644 index 000000000..65fb4840e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_void.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/structure_void" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar.json new file mode 100644 index 000000000..74e73ebd9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sugar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar_cane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar_cane.json new file mode 100644 index 000000000..ee6d1fc12 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar_cane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sugar_cane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sunflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sunflower.json new file mode 100644 index 000000000..694e244c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sunflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/sunflower_front" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_gravel.json new file mode 100644 index 000000000..dd5bed5f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_gravel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/suspicious_gravel_0" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_sand.json new file mode 100644 index 000000000..c8a0dcb06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/suspicious_sand_0" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_stew.json new file mode 100644 index 000000000..15e645a3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_stew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/suspicious_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sweet_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sweet_berries.json new file mode 100644 index 000000000..e16589413 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sweet_berries.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sweet_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_bucket.json new file mode 100644 index 000000000..44e1336b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tadpole_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tall_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tall_grass.json new file mode 100644 index 000000000..df809ea7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tall_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tall_grass_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/target.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/target.json new file mode 100644 index 000000000..0e4e696b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/target.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/target" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_banner.json new file mode 100644 index 000000000..d59875551 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_banner.json @@ -0,0 +1,39 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "block/oak_planks" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 2, 0.5], + "scale":[ 0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [ 30, 20, 0 ], + "translation": [ 0, -3.25, 0], + "scale":[ 0.5325, 0.5325, 0.5325] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 0], + "scale":[ 0.25, 0.25, 0.25] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 16, 7], + "scale":[ 1.5, 1.5, 1.5 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_bed.json new file mode 100644 index 000000000..2f5d69799 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "builtin/entity", + "display": { + "thirdperson_righthand": { + "rotation": [ 30, 160, 0 ], + "translation": [ 0, 3, -2], + "scale":[ 0.23, 0.23, 0.23] + }, + "firstperson_righthand": { + "rotation": [ 30, 160, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [ 30, 160, 0 ], + "translation": [ 2, 3, 0], + "scale":[ 0.5325, 0.5325, 0.5325] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 2], + "scale":[ 0.25, 0.25, 0.25] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 10, -8], + "scale":[ 1,1,1 ] + }, + "fixed": { + "rotation": [ 270, 0, 0 ], + "translation": [ 0, 4, -2], + "scale":[ 0.5, 0.5, 0.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_music_disc.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_music_disc.json new file mode 100644 index 000000000..41268452c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_music_disc.json @@ -0,0 +1,10 @@ +{ + "parent": "item/generated", + "gui_light": "front", + "display": { + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -0.5, 0, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_shulker_box.json new file mode 100644 index 000000000..7bfe2e696 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_shulker_box.json @@ -0,0 +1,35 @@ +{ + "parent": "builtin/entity", + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.4, 0.4, 0.4 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_skull.json new file mode 100644 index 000000000..232416fc4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_skull.json @@ -0,0 +1,28 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/soul_sand" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 1, 1, 1 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 4, 0], + "scale":[ 1, 1, 1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 45, 45, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_spawn_egg.json new file mode 100644 index 000000000..4ae4b4c28 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_spawn_egg.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/spawn_egg", + "layer1": "item/spawn_egg_overlay" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/terracotta.json new file mode 100644 index 000000000..c443c8902 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tide_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tide_armor_trim_smithing_template.json new file mode 100644 index 000000000..f3c544053 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tide_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tide_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tinted_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tinted_glass.json new file mode 100644 index 000000000..18f610b87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tinted_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tinted_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tipped_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tipped_arrow.json new file mode 100644 index 000000000..578defec7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tipped_arrow.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/tipped_arrow_head", + "layer1": "item/tipped_arrow_base" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt.json new file mode 100644 index 000000000..688d3f954 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tnt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt_minecart.json new file mode 100644 index 000000000..c3c326048 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tnt_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tooting_goat_horn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tooting_goat_horn.json new file mode 100644 index 000000000..c412562eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tooting_goat_horn.json @@ -0,0 +1,26 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/goat_horn" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, -125, 0 ], + "translation": [ -1, 2, 2 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 55, 0 ], + "translation": [ -1, 2, 2 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -55, -5 ], + "translation": [ -1, -2.5, -7.5 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 115, 5 ], + "translation": [ 0 , -2.5, -7.5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torch.json new file mode 100644 index 000000000..a734b43bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower.json new file mode 100644 index 000000000..bac7a8253 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/torchflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower_seeds.json new file mode 100644 index 000000000..6637aa8cb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/torchflower_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/totem_of_undying.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/totem_of_undying.json new file mode 100644 index 000000000..abefc0572 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/totem_of_undying.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/totem_of_undying" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trader_llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trader_llama_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trader_llama_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trapped_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trapped_chest.json new file mode 100644 index 000000000..c74357148 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trapped_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "item/chest" +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_key.json new file mode 100644 index 000000000..0ff9e82f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_key.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_spawner.json new file mode 100644 index 000000000..22e70fe93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/trial_spawner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident.json new file mode 100644 index 000000000..f129b55e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/trident" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_in_hand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_in_hand.json new file mode 100644 index 000000000..6685dcca5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_in_hand.json @@ -0,0 +1,52 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "item/trident" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 60, 0 ], + "translation": [ 11, 17, -2 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 60, 0 ], + "translation": [ 3, 17, 12 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ -3, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 13, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -2, 4, -5], + "scale":[ 0.5, 0.5, 0.5] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + }, + "overrides": [ + { + "predicate": { + "throwing": 1 + }, + "model": "item/trident_throwing" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_throwing.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_throwing.json new file mode 100644 index 000000000..fb8e96a3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_throwing.json @@ -0,0 +1,44 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "item/trident" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 180 ], + "translation": [ 8, -17, 9 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, 180 ], + "translation": [ 8, -17, -7 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ -3, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 13, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -2, 4, -5], + "scale":[ 0.5, 0.5, 0.5] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tripwire_hook.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tripwire_hook.json new file mode 100644 index 000000000..b4a83abd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tripwire_hook.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tripwire_hook" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish.json new file mode 100644 index 000000000..d8e9ebc63 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tropical_fish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_bucket.json new file mode 100644 index 000000000..2ea21229b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tropical_fish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral.json new file mode 100644 index 000000000..dc0358e15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_block.json new file mode 100644 index 000000000..14e2d5761 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tube_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_fan.json new file mode 100644 index 000000000..76c880f73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff.json new file mode 100644 index 000000000..187958d90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_slab.json new file mode 100644 index 000000000..b793fc27c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_stairs.json new file mode 100644 index 000000000..d5156694f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_wall.json new file mode 100644 index 000000000..bfb8d8b5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_bricks.json new file mode 100644 index 000000000..d13c6e5a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_slab.json new file mode 100644 index 000000000..5f0374307 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_stairs.json new file mode 100644 index 000000000..eacc1e5e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_wall.json new file mode 100644 index 000000000..91a87f521 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_egg.json new file mode 100644 index 000000000..bbc29d4a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet.json new file mode 100644 index 000000000..e61aa3c8d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/turtle_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/turtle_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/turtle_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/turtle_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/turtle_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/turtle_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/turtle_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/turtle_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/turtle_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/turtle_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/turtle_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_amethyst_trim.json new file mode 100644 index 000000000..b957586d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_copper_trim.json new file mode 100644 index 000000000..dcbbfcfe5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_diamond_trim.json new file mode 100644 index 000000000..759556164 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_emerald_trim.json new file mode 100644 index 000000000..15cca0893 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_gold_trim.json new file mode 100644 index 000000000..d7b0c824b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_iron_trim.json new file mode 100644 index 000000000..2f4cbc6fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_lapis_trim.json new file mode 100644 index 000000000..95d3bc725 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_netherite_trim.json new file mode 100644 index 000000000..7c16fa614 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_quartz_trim.json new file mode 100644 index 000000000..6bcfbb694 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_redstone_trim.json new file mode 100644 index 000000000..4c694cbb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_scute.json new file mode 100644 index 000000000..64af43c32 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_scute.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/twisting_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/twisting_vines.json new file mode 100644 index 000000000..fe4d57c09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/twisting_vines.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/twisting_vines_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vault.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vault.json new file mode 100644 index 000000000..848fa3097 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vault.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/vault" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/verdant_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/verdant_froglight.json new file mode 100644 index 000000000..6b9f7d214 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/verdant_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/verdant_froglight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_armor_trim_smithing_template.json new file mode 100644 index 000000000..93ec389ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/vex_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/villager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/villager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vindicator_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vindicator_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vindicator_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vine.json new file mode 100644 index 000000000..c1eaec402 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vine.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/vine" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wandering_trader_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wandering_trader_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wandering_trader_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ward_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ward_armor_trim_smithing_template.json new file mode 100644 index 000000000..b8be109ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ward_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ward_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warden_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warden_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warden_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_button.json new file mode 100644 index 000000000..182a0ac61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_door.json new file mode 100644 index 000000000..5bc37290d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/warped_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence.json new file mode 100644 index 000000000..d45dd46dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence_gate.json new file mode 100644 index 000000000..1f521bc73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus.json new file mode 100644 index 000000000..eecb3bfdc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/warped_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus_on_a_stick.json new file mode 100644 index 000000000..562fe25cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "minecraft:item/warped_fungus_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hanging_sign.json new file mode 100644 index 000000000..fe9180a77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/warped_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hyphae.json new file mode 100644 index 000000000..6cc4c5a4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_nylium.json new file mode 100644 index 000000000..20309492a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_nylium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_nylium" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_planks.json new file mode 100644 index 000000000..92cfb4ca6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_pressure_plate.json new file mode 100644 index 000000000..58d9b4438 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_roots.json new file mode 100644 index 000000000..d44aa5776 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_roots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/warped_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_sign.json new file mode 100644 index 000000000..82db6f279 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/warped_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_slab.json new file mode 100644 index 000000000..ce7153c40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stairs.json new file mode 100644 index 000000000..08260fdd6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stem.json new file mode 100644 index 000000000..0bab3df69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_trapdoor.json new file mode 100644 index 000000000..c716c4684 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_wart_block.json new file mode 100644 index 000000000..754439abc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_wart_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_wart_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/water_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/water_bucket.json new file mode 100644 index 000000000..af17e57d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/water_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/water_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_chiseled_copper.json new file mode 100644 index 000000000..b88e810ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_block.json new file mode 100644 index 000000000..7bc2c0184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_bulb.json new file mode 100644 index 000000000..08e49a530 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_door.json new file mode 100644 index 000000000..4466e7a34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_grate.json new file mode 100644 index 000000000..f4cff5139 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_trapdoor.json new file mode 100644 index 000000000..87df71b2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper.json new file mode 100644 index 000000000..ce1ec597d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_slab.json new file mode 100644 index 000000000..b6b05101c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_stairs.json new file mode 100644 index 000000000..7376f52cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_chiseled_copper.json new file mode 100644 index 000000000..11278b6ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper.json new file mode 100644 index 000000000..5881fd7b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_bulb.json new file mode 100644 index 000000000..efd8e9d99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/exposed_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_door.json new file mode 100644 index 000000000..7e3a70453 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/exposed_copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_grate.json new file mode 100644 index 000000000..b7a3c78e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_trapdoor.json new file mode 100644 index 000000000..e3f5e9add --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/exposed_copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper.json new file mode 100644 index 000000000..b5c7d8f01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_slab.json new file mode 100644 index 000000000..29ce47239 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_stairs.json new file mode 100644 index 000000000..24bdd2851 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_chiseled_copper.json new file mode 100644 index 000000000..720204270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper.json new file mode 100644 index 000000000..63a0dabe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_bulb.json new file mode 100644 index 000000000..59b8fb7b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/oxidized_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_door.json new file mode 100644 index 000000000..313143e13 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/oxidized_copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_grate.json new file mode 100644 index 000000000..e2521c38e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_trapdoor.json new file mode 100644 index 000000000..9d3a8bee8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/oxidized_copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper.json new file mode 100644 index 000000000..36dfa030a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_slab.json new file mode 100644 index 000000000..a3d022426 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..fd8af1aab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_chiseled_copper.json new file mode 100644 index 000000000..c27086d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper.json new file mode 100644 index 000000000..743af49ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_bulb.json new file mode 100644 index 000000000..6e29d2919 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/weathered_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_door.json new file mode 100644 index 000000000..409c8efa3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/weathered_copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_grate.json new file mode 100644 index 000000000..17430d640 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_trapdoor.json new file mode 100644 index 000000000..7c3335de5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/weathered_copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper.json new file mode 100644 index 000000000..e49a231b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_slab.json new file mode 100644 index 000000000..acda09e0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_stairs.json new file mode 100644 index 000000000..01ce59724 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wayfinder_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wayfinder_armor_trim_smithing_template.json new file mode 100644 index 000000000..0d31b00cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wayfinder_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wayfinder_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_chiseled_copper.json new file mode 100644 index 000000000..c27086d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper.json new file mode 100644 index 000000000..743af49ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_bulb.json new file mode 100644 index 000000000..276559f80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_door.json new file mode 100644 index 000000000..91c28c7bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/weathered_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_grate.json new file mode 100644 index 000000000..17430d640 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_trapdoor.json new file mode 100644 index 000000000..7b067302c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper.json new file mode 100644 index 000000000..e49a231b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_slab.json new file mode 100644 index 000000000..acda09e0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_stairs.json new file mode 100644 index 000000000..01ce59724 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weeping_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weeping_vines.json new file mode 100644 index 000000000..834b71c51 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weeping_vines.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/weeping_vines_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wet_sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wet_sponge.json new file mode 100644 index 000000000..d662daaeb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wet_sponge.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/wet_sponge" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat.json new file mode 100644 index 000000000..f77a8c8f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wheat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat_seeds.json new file mode 100644 index 000000000..8fd9068f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wheat_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bed.json new file mode 100644 index 000000000..93d81aff0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/white_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle.json new file mode 100644 index 000000000..6efd8ccb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/white_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_back.json new file mode 100644 index 000000000..6692dda4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/white_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_front.json new file mode 100644 index 000000000..ca14ae3b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/white_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_candle.json new file mode 100644 index 000000000..d13392c4e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/white_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_carpet.json new file mode 100644 index 000000000..8ef6f034c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete.json new file mode 100644 index 000000000..16475ed43 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete_powder.json new file mode 100644 index 000000000..c001b3839 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_dye.json new file mode 100644 index 000000000..68b02c07c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/white_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_glazed_terracotta.json new file mode 100644 index 000000000..55881dbcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_shulker_box.json new file mode 100644 index 000000000..6fd0156e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/white_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass.json new file mode 100644 index 000000000..28c61d954 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass_pane.json new file mode 100644 index 000000000..dbe66a16a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/white_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_terracotta.json new file mode 100644 index 000000000..973fa9667 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_tulip.json new file mode 100644 index 000000000..f19409060 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/white_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_wool.json new file mode 100644 index 000000000..5908f3401 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wild_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wild_armor_trim_smithing_template.json new file mode 100644 index 000000000..52c438c78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wild_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wild_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wind_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wind_charge.json new file mode 100644 index 000000000..821c34ebb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wind_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wind_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/witch_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/witch_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/witch_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_rose.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_rose.json new file mode 100644 index 000000000..9579e7c48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_rose.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/wither_rose" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_skull.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_skull.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_armor.json new file mode 100644 index 000000000..b08d08290 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_armor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wolf_armor", + "layer1": "minecraft:item/wolf_armor_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_axe.json new file mode 100644 index 000000000..e08423dbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_hoe.json new file mode 100644 index 000000000..a925c76b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_pickaxe.json new file mode 100644 index 000000000..5b9bbab7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_shovel.json new file mode 100644 index 000000000..7c4d82876 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_sword.json new file mode 100644 index 000000000..4024a58a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/writable_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/writable_book.json new file mode 100644 index 000000000..9398becac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/writable_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/writable_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/written_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/written_book.json new file mode 100644 index 000000000..45a096029 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/written_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/written_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bed.json new file mode 100644 index 000000000..cc67ceffa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/yellow_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle.json new file mode 100644 index 000000000..c685714df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/yellow_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_back.json new file mode 100644 index 000000000..9f598be77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/yellow_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_front.json new file mode 100644 index 000000000..9c3f41e13 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/yellow_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_candle.json new file mode 100644 index 000000000..8f2e07288 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/yellow_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_carpet.json new file mode 100644 index 000000000..c3b3710e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete.json new file mode 100644 index 000000000..ed8ebe4c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete_powder.json new file mode 100644 index 000000000..38bac8bf6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_dye.json new file mode 100644 index 000000000..14d6bb6a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/yellow_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_glazed_terracotta.json new file mode 100644 index 000000000..4d8199842 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_shulker_box.json new file mode 100644 index 000000000..318a620e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/yellow_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass.json new file mode 100644 index 000000000..e102e2d5b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass_pane.json new file mode 100644 index 000000000..e17c28a21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/yellow_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_terracotta.json new file mode 100644 index 000000000..50dfb7ea7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_wool.json new file mode 100644 index 000000000..e0de4bb81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zoglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zoglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_horse_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_horse_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_villager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_villager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombified_piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombified_piglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombified_piglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_boat.json new file mode 100644 index 000000000..40c386d3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_button.json new file mode 100644 index 000000000..a3dcd423c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_chest_boat.json new file mode 100644 index 000000000..671be37c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_door.json new file mode 100644 index 000000000..43b8d7c6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence.json new file mode 100644 index 000000000..c9d21e600 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence_gate.json new file mode 100644 index 000000000..59094a4ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_hanging_sign.json new file mode 100644 index 000000000..1c4ec4e65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_leaves.json new file mode 100644 index 000000000..bbbab39ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_log.json new file mode 100644 index 000000000..d377ce70d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_planks.json new file mode 100644 index 000000000..017452be8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_pressure_plate.json new file mode 100644 index 000000000..bf4e9fdcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sapling.json new file mode 100644 index 000000000..ec95e0f59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sign.json new file mode 100644 index 000000000..6b572ed38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_slab.json new file mode 100644 index 000000000..05c1a0ba5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_stairs.json new file mode 100644 index 000000000..69e95274c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_trapdoor.json new file mode 100644 index 000000000..29314826c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_wood.json new file mode 100644 index 000000000..8368b4cea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/activator_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/activator_rail.json new file mode 100644 index 000000000..855d961a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/activator_rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/activator_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/air.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/air.json new file mode 100644 index 000000000..f0727913c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/air.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/air" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allay_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allay_spawn_egg.json new file mode 100644 index 000000000..ce06c0df4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allay_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -16721153 + }, + { + "type": "minecraft:constant", + "value": -16732673 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allium.json new file mode 100644 index 000000000..3ba9a1a7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/allium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_block.json new file mode 100644 index 000000000..5a655def4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/amethyst_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_cluster.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_cluster.json new file mode 100644 index 000000000..c8bb8bea0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_cluster.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/amethyst_cluster" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_shard.json new file mode 100644 index 000000000..47232b2bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/amethyst_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ancient_debris.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ancient_debris.json new file mode 100644 index 000000000..f3e196500 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ancient_debris.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/ancient_debris" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite.json new file mode 100644 index 000000000..3f68917ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_slab.json new file mode 100644 index 000000000..66a9a022b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_stairs.json new file mode 100644 index 000000000..fb742015a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_wall.json new file mode 100644 index 000000000..c95364641 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/angler_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/angler_pottery_sherd.json new file mode 100644 index 000000000..61083360b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/angler_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/angler_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/anvil.json new file mode 100644 index 000000000..8dcd36b0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/anvil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/apple.json new file mode 100644 index 000000000..775daabba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/apple.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/archer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/archer_pottery_sherd.json new file mode 100644 index 000000000..575adb29c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/archer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/archer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_scute.json new file mode 100644 index 000000000..90f7a5304 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_scute.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/armadillo_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_spawn_egg.json new file mode 100644 index 000000000..202c8f547 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -5410451 + }, + { + "type": "minecraft:constant", + "value": -8239032 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armor_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armor_stand.json new file mode 100644 index 000000000..43398b3e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armor_stand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/armor_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arms_up_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arms_up_pottery_sherd.json new file mode 100644 index 000000000..45ae4d926 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arms_up_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/arms_up_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arrow.json new file mode 100644 index 000000000..5915e01ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_bucket.json new file mode 100644 index 000000000..1fe9963c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/axolotl_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_spawn_egg.json new file mode 100644 index 000000000..4153e5bc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -278045 + }, + { + "type": "minecraft:constant", + "value": -5886604 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea.json new file mode 100644 index 000000000..5c538e74f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/azalea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea_leaves.json new file mode 100644 index 000000000..107c301f4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/azalea_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azure_bluet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azure_bluet.json new file mode 100644 index 000000000..11b192af6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azure_bluet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/azure_bluet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/baked_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/baked_potato.json new file mode 100644 index 000000000..3553c526c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/baked_potato.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/baked_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo.json new file mode 100644 index 000000000..30d6b5590 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_block.json new file mode 100644 index 000000000..8dc88463a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_button.json new file mode 100644 index 000000000..57d5c8126 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_chest_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_chest_raft.json new file mode 100644 index 000000000..a7b219b2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_chest_raft.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_chest_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_door.json new file mode 100644 index 000000000..8728a4db7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence.json new file mode 100644 index 000000000..9e8424db8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence_gate.json new file mode 100644 index 000000000..8db169324 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_hanging_sign.json new file mode 100644 index 000000000..7e6b5d512 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic.json new file mode 100644 index 000000000..49b0ddaed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_mosaic" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_slab.json new file mode 100644 index 000000000..d475b36ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_mosaic_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_stairs.json new file mode 100644 index 000000000..e59cde5cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_mosaic_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_planks.json new file mode 100644 index 000000000..a73c8d159 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_pressure_plate.json new file mode 100644 index 000000000..490046fd2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_raft.json new file mode 100644 index 000000000..9e224bcad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_raft.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_sign.json new file mode 100644 index 000000000..c916c6a7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_slab.json new file mode 100644 index 000000000..496f820b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_stairs.json new file mode 100644 index 000000000..65326e0ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_trapdoor.json new file mode 100644 index 000000000..0855c71f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrel.json new file mode 100644 index 000000000..8f362a2f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/barrel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrier.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrier.json new file mode 100644 index 000000000..75cc3b337 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrier.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/barrier" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/basalt.json new file mode 100644 index 000000000..33a70621f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/basalt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/basalt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bat_spawn_egg.json new file mode 100644 index 000000000..c7f1a5669 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bat_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11780560 + }, + { + "type": "minecraft:constant", + "value": -15790321 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beacon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beacon.json new file mode 100644 index 000000000..814878e5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beacon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/beacon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bedrock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bedrock.json new file mode 100644 index 000000000..89f068fe7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bedrock.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bedrock" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_nest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_nest.json new file mode 100644 index 000000000..cb918fe0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_nest.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:select", + "block_state_property": "honey_level", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bee_nest_honey" + }, + "when": "5" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:block/bee_nest_empty" + }, + "property": "minecraft:block_state" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_spawn_egg.json new file mode 100644 index 000000000..0cf00f925 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1195197 + }, + { + "type": "minecraft:constant", + "value": -12377061 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beef.json new file mode 100644 index 000000000..d1bf5b046 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beef.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beehive.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beehive.json new file mode 100644 index 000000000..279dc4b8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beehive.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:select", + "block_state_property": "honey_level", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:block/beehive_honey" + }, + "when": "5" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:block/beehive_empty" + }, + "property": "minecraft:block_state" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot.json new file mode 100644 index 000000000..fc7949949 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beetroot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_seeds.json new file mode 100644 index 000000000..e2742c167 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beetroot_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_soup.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_soup.json new file mode 100644 index 000000000..ebbea11d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_soup.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beetroot_soup" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bell.json new file mode 100644 index 000000000..15fece84e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bell.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/big_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/big_dripleaf.json new file mode 100644 index 000000000..aa47d6198 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/big_dripleaf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/big_dripleaf" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_boat.json new file mode 100644 index 000000000..261a254df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_button.json new file mode 100644 index 000000000..3eaece396 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_chest_boat.json new file mode 100644 index 000000000..37eaf2fe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_door.json new file mode 100644 index 000000000..bfc2721b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence.json new file mode 100644 index 000000000..8963c9d29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence_gate.json new file mode 100644 index 000000000..923244ff1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_hanging_sign.json new file mode 100644 index 000000000..fd062e231 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_leaves.json new file mode 100644 index 000000000..f06b0a4ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -8345771 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_log.json new file mode 100644 index 000000000..f4bf68832 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_planks.json new file mode 100644 index 000000000..7dab521e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_pressure_plate.json new file mode 100644 index 000000000..708ec1bcb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sapling.json new file mode 100644 index 000000000..b4cfced3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sign.json new file mode 100644 index 000000000..a160ed646 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_slab.json new file mode 100644 index 000000000..b4cb850ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_stairs.json new file mode 100644 index 000000000..c5e8e4429 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_trapdoor.json new file mode 100644 index 000000000..db2d3a91e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_wood.json new file mode 100644 index 000000000..f1f5d1ea8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_banner.json new file mode 100644 index 000000000..62bbb531e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "black" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bed.json new file mode 100644 index 000000000..04d7e3561 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/black_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:black" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bundle.json new file mode 100644 index 000000000..066707b5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_candle.json new file mode 100644 index 000000000..9c28b4440 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/black_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_carpet.json new file mode 100644 index 000000000..c80c9be56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete.json new file mode 100644 index 000000000..88adfa331 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete_powder.json new file mode 100644 index 000000000..0af5716a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_dye.json new file mode 100644 index 000000000..a5851c21d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/black_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_glazed_terracotta.json new file mode 100644 index 000000000..02d6d5e50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_shulker_box.json new file mode 100644 index 000000000..46fa3e1f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/black_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_black" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass.json new file mode 100644 index 000000000..a87c5feaa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass_pane.json new file mode 100644 index 000000000..f37e68005 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/black_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_terracotta.json new file mode 100644 index 000000000..0b8b26b79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_wool.json new file mode 100644 index 000000000..178340d47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone.json new file mode 100644 index 000000000..142bcb059 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_slab.json new file mode 100644 index 000000000..130a89057 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_stairs.json new file mode 100644 index 000000000..85d2c1aa1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_wall.json new file mode 100644 index 000000000..9d569e06f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blade_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blade_pottery_sherd.json new file mode 100644 index 000000000..4d1933846 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blade_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blade_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blast_furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blast_furnace.json new file mode 100644 index 000000000..b28606354 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blast_furnace.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blast_furnace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_powder.json new file mode 100644 index 000000000..812d76c01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blaze_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_rod.json new file mode 100644 index 000000000..b2db009a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blaze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_spawn_egg.json new file mode 100644 index 000000000..ba1d31f6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -609791 + }, + { + "type": "minecraft:constant", + "value": -1922 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_banner.json new file mode 100644 index 000000000..d985ba59a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bed.json new file mode 100644 index 000000000..73a9afb51 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/blue_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bundle.json new file mode 100644 index 000000000..57437107a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_candle.json new file mode 100644 index 000000000..5cfe77a55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_carpet.json new file mode 100644 index 000000000..1a620a576 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete.json new file mode 100644 index 000000000..cc0b5b9dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete_powder.json new file mode 100644 index 000000000..3b981e85e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_dye.json new file mode 100644 index 000000000..381b71e98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_glazed_terracotta.json new file mode 100644 index 000000000..5cf3c1c91 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_ice.json new file mode 100644 index 000000000..7f2160ded --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_ice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_ice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_orchid.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_orchid.json new file mode 100644 index 000000000..f76d09633 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_orchid.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_orchid" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_shulker_box.json new file mode 100644 index 000000000..299c77253 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/blue_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass.json new file mode 100644 index 000000000..c343d93ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass_pane.json new file mode 100644 index 000000000..941daad69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_terracotta.json new file mode 100644 index 000000000..db5cdb28e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_wool.json new file mode 100644 index 000000000..171f1db04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bogged_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bogged_spawn_egg.json new file mode 100644 index 000000000..944206c47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bogged_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7693198 + }, + { + "type": "minecraft:constant", + "value": -13546213 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bolt_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bolt_armor_trim_smithing_template.json new file mode 100644 index 000000000..9745ca12e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bolt_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bolt_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone.json new file mode 100644 index 000000000..fea2360cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_block.json new file mode 100644 index 000000000..b949a94e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bone_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_meal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_meal.json new file mode 100644 index 000000000..7b1eb0641 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_meal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bone_meal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/book.json new file mode 100644 index 000000000..c36707130 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bookshelf.json new file mode 100644 index 000000000..18c77821d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bookshelf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bookshelf" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bordure_indented_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bordure_indented_banner_pattern.json new file mode 100644 index 000000000..fb2684f67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bordure_indented_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bordure_indented_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bow.json new file mode 100644 index 000000000..fa7071ce5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bowl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bowl.json new file mode 100644 index 000000000..99459cf66 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bowl.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bowl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral.json new file mode 100644 index 000000000..fa8e2eb6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_block.json new file mode 100644 index 000000000..ab2ce2127 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brain_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_fan.json new file mode 100644 index 000000000..2851549f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bread.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bread.json new file mode 100644 index 000000000..a90e33b52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bread.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bread" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_rod.json new file mode 100644 index 000000000..ef08b38a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/breeze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_spawn_egg.json new file mode 100644 index 000000000..a3ea35289 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -5270305 + }, + { + "type": "minecraft:constant", + "value": -7248161 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewer_pottery_sherd.json new file mode 100644 index 000000000..0bd69ad47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brewer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewing_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewing_stand.json new file mode 100644 index 000000000..823cf558d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewing_stand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brewing_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick.json new file mode 100644 index 000000000..7e6be5152 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_slab.json new file mode 100644 index 000000000..6afe9425e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_stairs.json new file mode 100644 index 000000000..782ee48d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_wall.json new file mode 100644 index 000000000..7acc8f3e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bricks.json new file mode 100644 index 000000000..45bb895ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_banner.json new file mode 100644 index 000000000..21b2d0bfc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "brown" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bed.json new file mode 100644 index 000000000..42492f517 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/brown_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:brown" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bundle.json new file mode 100644 index 000000000..deb8d4ebd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_candle.json new file mode 100644 index 000000000..d7d461486 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_carpet.json new file mode 100644 index 000000000..d32721af4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete.json new file mode 100644 index 000000000..9e045cf4e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete_powder.json new file mode 100644 index 000000000..90f379579 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_dye.json new file mode 100644 index 000000000..4d6d06180 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_glazed_terracotta.json new file mode 100644 index 000000000..cca7ba048 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom.json new file mode 100644 index 000000000..6a960e06a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom_block.json new file mode 100644 index 000000000..7c2d92c67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_mushroom_block_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_shulker_box.json new file mode 100644 index 000000000..a2be2cc43 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/brown_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_brown" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass.json new file mode 100644 index 000000000..f59814e67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass_pane.json new file mode 100644 index 000000000..43c1d708f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_terracotta.json new file mode 100644 index 000000000..fee80a482 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_wool.json new file mode 100644 index 000000000..5e4b51ac4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brush.json new file mode 100644 index 000000000..a4abc74ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brush.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brush_brushing_0" + }, + "threshold": 0.25 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brush_brushing_1" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brush_brushing_2" + }, + "threshold": 0.75 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/brush" + }, + "period": 10.0, + "property": "minecraft:use_cycle", + "scale": 0.1 + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral.json new file mode 100644 index 000000000..49349d69f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_block.json new file mode 100644 index 000000000..c400e05fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bubble_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_fan.json new file mode 100644 index 000000000..893c6efe2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bucket.json new file mode 100644 index 000000000..f8209d332 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/budding_amethyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/budding_amethyst.json new file mode 100644 index 000000000..407a4799e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/budding_amethyst.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/budding_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bundle.json new file mode 100644 index 000000000..dfeec3e91 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/burn_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/burn_pottery_sherd.json new file mode 100644 index 000000000..3c39cfc76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/burn_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/burn_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cactus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cactus.json new file mode 100644 index 000000000..2b48cc4fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cactus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cactus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cake.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cake.json new file mode 100644 index 000000000..9488638c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cake.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cake" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calcite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calcite.json new file mode 100644 index 000000000..ac9e7ea25 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calcite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/calcite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calibrated_sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calibrated_sculk_sensor.json new file mode 100644 index 000000000..dfe5e99bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calibrated_sculk_sensor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/calibrated_sculk_sensor_inactive" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/camel_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/camel_spawn_egg.json new file mode 100644 index 000000000..20b375c94 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/camel_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -212119 + }, + { + "type": "minecraft:constant", + "value": -3435721 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/campfire.json new file mode 100644 index 000000000..9732767ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/campfire.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/candle.json new file mode 100644 index 000000000..5fc19d0fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot.json new file mode 100644 index 000000000..dc4518072 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot_on_a_stick.json new file mode 100644 index 000000000..a4105477a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/carrot_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cartography_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cartography_table.json new file mode 100644 index 000000000..7b67cc843 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cartography_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cartography_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carved_pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carved_pumpkin.json new file mode 100644 index 000000000..433ef242c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carved_pumpkin.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/carved_pumpkin" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cat_spawn_egg.json new file mode 100644 index 000000000..4a2c56532 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cat_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1062770 + }, + { + "type": "minecraft:constant", + "value": -6983082 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cauldron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cauldron.json new file mode 100644 index 000000000..2d4a84c9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cauldron.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cauldron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cave_spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cave_spider_spawn_egg.json new file mode 100644 index 000000000..3577909ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cave_spider_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15973810 + }, + { + "type": "minecraft:constant", + "value": -5763570 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain.json new file mode 100644 index 000000000..a8abebe6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chain" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain_command_block.json new file mode 100644 index 000000000..068829ed9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain_command_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chain_command_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_boots.json new file mode 100644 index 000000000..991ffb60a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_chestplate.json new file mode 100644 index 000000000..6f9019861 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_helmet.json new file mode 100644 index 000000000..7f88b1a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_leggings.json new file mode 100644 index 000000000..7baa08494 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/charcoal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/charcoal.json new file mode 100644 index 000000000..7e2650ad1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/charcoal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/charcoal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_boat.json new file mode 100644 index 000000000..97018953a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_button.json new file mode 100644 index 000000000..51ac6149f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_chest_boat.json new file mode 100644 index 000000000..b40831e0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_door.json new file mode 100644 index 000000000..214c05e67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence.json new file mode 100644 index 000000000..d96d0654c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence_gate.json new file mode 100644 index 000000000..90201f4ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_hanging_sign.json new file mode 100644 index 000000000..5088fec86 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_leaves.json new file mode 100644 index 000000000..dac17a9cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_log.json new file mode 100644 index 000000000..a0a2dfb89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_planks.json new file mode 100644 index 000000000..e1b9f3646 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_pressure_plate.json new file mode 100644 index 000000000..de6054bfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sapling.json new file mode 100644 index 000000000..7943de2b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sign.json new file mode 100644 index 000000000..a43d71ada --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_slab.json new file mode 100644 index 000000000..91dcbb80c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_stairs.json new file mode 100644 index 000000000..e7f74ae1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_trapdoor.json new file mode 100644 index 000000000..4b09f105e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_wood.json new file mode 100644 index 000000000..f23d6a629 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest.json new file mode 100644 index 000000000..5e4ef78c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest.json @@ -0,0 +1,32 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:special", + "base": "minecraft:item/chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:christmas" + } + }, + "when": [ + "12-24", + "12-25", + "12-26" + ] + } + ], + "fallback": { + "type": "minecraft:special", + "base": "minecraft:item/chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:normal" + } + }, + "pattern": "MM-dd", + "property": "minecraft:local_time" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest_minecart.json new file mode 100644 index 000000000..3711836ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chest_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken.json new file mode 100644 index 000000000..908f6d531 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken_spawn_egg.json new file mode 100644 index 000000000..2f3596c27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6184543 + }, + { + "type": "minecraft:constant", + "value": -65536 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chipped_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chipped_anvil.json new file mode 100644 index 000000000..868455686 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chipped_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chipped_anvil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_bookshelf.json new file mode 100644 index 000000000..9ba95e03c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_bookshelf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_bookshelf_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_copper.json new file mode 100644 index 000000000..99d4996d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_deepslate.json new file mode 100644 index 000000000..116f921f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_nether_bricks.json new file mode 100644 index 000000000..95709a06c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_polished_blackstone.json new file mode 100644 index 000000000..1d9b8c735 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_polished_blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_polished_blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_quartz_block.json new file mode 100644 index 000000000..508004a59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_quartz_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_quartz_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_red_sandstone.json new file mode 100644 index 000000000..cb5409ac9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_resin_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_resin_bricks.json new file mode 100644 index 000000000..26416f11c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_resin_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_resin_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_sandstone.json new file mode 100644 index 000000000..c893eed63 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_stone_bricks.json new file mode 100644 index 000000000..0001e6708 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff.json new file mode 100644 index 000000000..85401994a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_tuff" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff_bricks.json new file mode 100644 index 000000000..94632a0f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_tuff_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_flower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_flower.json new file mode 100644 index 000000000..a33bde47d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_flower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chorus_flower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_fruit.json new file mode 100644 index 000000000..65ad83c5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_plant.json new file mode 100644 index 000000000..21a15f44a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_plant.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chorus_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay.json new file mode 100644 index 000000000..bacfc9378 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/clay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay_ball.json new file mode 100644 index 000000000..e8f64c098 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay_ball.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clay_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clock.json new file mode 100644 index 000000000..0d6f44d8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clock.json @@ -0,0 +1,937 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_01" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_02" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_03" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_04" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_05" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_06" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_07" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_08" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_09" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_10" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_11" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_12" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_13" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_14" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_15" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_16" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_17" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_18" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_19" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_20" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_21" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_22" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_23" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_24" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_25" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_26" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_27" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_28" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_29" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_30" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_31" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_32" + }, + "threshold": 31.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_33" + }, + "threshold": 32.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_34" + }, + "threshold": 33.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_35" + }, + "threshold": 34.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_36" + }, + "threshold": 35.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_37" + }, + "threshold": 36.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_38" + }, + "threshold": 37.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_39" + }, + "threshold": 38.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_40" + }, + "threshold": 39.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_41" + }, + "threshold": 40.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_42" + }, + "threshold": 41.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_43" + }, + "threshold": 42.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_44" + }, + "threshold": 43.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_45" + }, + "threshold": 44.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_46" + }, + "threshold": 45.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_47" + }, + "threshold": 46.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_48" + }, + "threshold": 47.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_49" + }, + "threshold": 48.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_50" + }, + "threshold": 49.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_51" + }, + "threshold": 50.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_52" + }, + "threshold": 51.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_53" + }, + "threshold": 52.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_54" + }, + "threshold": 53.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_55" + }, + "threshold": 54.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_56" + }, + "threshold": 55.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_57" + }, + "threshold": 56.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_58" + }, + "threshold": 57.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_59" + }, + "threshold": 58.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_60" + }, + "threshold": 59.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_61" + }, + "threshold": 60.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_62" + }, + "threshold": 61.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_63" + }, + "threshold": 62.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 63.5 + } + ], + "property": "minecraft:time", + "scale": 64.0, + "source": "daytime" + }, + "when": "minecraft:overworld" + } + ], + "fallback": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_01" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_02" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_03" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_04" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_05" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_06" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_07" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_08" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_09" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_10" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_11" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_12" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_13" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_14" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_15" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_16" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_17" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_18" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_19" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_20" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_21" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_22" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_23" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_24" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_25" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_26" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_27" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_28" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_29" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_30" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_31" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_32" + }, + "threshold": 31.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_33" + }, + "threshold": 32.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_34" + }, + "threshold": 33.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_35" + }, + "threshold": 34.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_36" + }, + "threshold": 35.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_37" + }, + "threshold": 36.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_38" + }, + "threshold": 37.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_39" + }, + "threshold": 38.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_40" + }, + "threshold": 39.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_41" + }, + "threshold": 40.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_42" + }, + "threshold": 41.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_43" + }, + "threshold": 42.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_44" + }, + "threshold": 43.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_45" + }, + "threshold": 44.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_46" + }, + "threshold": 45.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_47" + }, + "threshold": 46.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_48" + }, + "threshold": 47.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_49" + }, + "threshold": 48.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_50" + }, + "threshold": 49.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_51" + }, + "threshold": 50.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_52" + }, + "threshold": 51.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_53" + }, + "threshold": 52.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_54" + }, + "threshold": 53.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_55" + }, + "threshold": 54.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_56" + }, + "threshold": 55.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_57" + }, + "threshold": 56.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_58" + }, + "threshold": 57.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_59" + }, + "threshold": 58.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_60" + }, + "threshold": 59.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_61" + }, + "threshold": 60.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_62" + }, + "threshold": 61.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_63" + }, + "threshold": 62.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 63.5 + } + ], + "property": "minecraft:time", + "scale": 64.0, + "source": "random" + }, + "property": "minecraft:context_dimension" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/closed_eyeblossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/closed_eyeblossom.json new file mode 100644 index 000000000..136145b5c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/closed_eyeblossom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/closed_eyeblossom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal.json new file mode 100644 index 000000000..0566981fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/coal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_block.json new file mode 100644 index 000000000..f970b5e87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/coal_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_ore.json new file mode 100644 index 000000000..fe51726ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/coal_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coarse_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coarse_dirt.json new file mode 100644 index 000000000..03a9d9845 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coarse_dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/coarse_dirt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coast_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coast_armor_trim_smithing_template.json new file mode 100644 index 000000000..9e34212cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coast_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/coast_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate.json new file mode 100644 index 000000000..ff8306379 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_slab.json new file mode 100644 index 000000000..c3ac1ae1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_stairs.json new file mode 100644 index 000000000..3ee9e6fdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_wall.json new file mode 100644 index 000000000..97c02a347 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone.json new file mode 100644 index 000000000..3bee3d364 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_slab.json new file mode 100644 index 000000000..36c47e67d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_stairs.json new file mode 100644 index 000000000..44b025616 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_wall.json new file mode 100644 index 000000000..edc14d448 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobweb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobweb.json new file mode 100644 index 000000000..ce2319b78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobweb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cobweb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cocoa_beans.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cocoa_beans.json new file mode 100644 index 000000000..a3c054a4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cocoa_beans.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cocoa_beans" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod.json new file mode 100644 index 000000000..3f0aac7af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_bucket.json new file mode 100644 index 000000000..967b87f18 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cod_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_spawn_egg.json new file mode 100644 index 000000000..f556e0ef1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4085910 + }, + { + "type": "minecraft:constant", + "value": -1719157 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block.json new file mode 100644 index 000000000..7e5c23d2d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/command_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block_minecart.json new file mode 100644 index 000000000..2ce1c002d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/command_block_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/comparator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/comparator.json new file mode 100644 index 000000000..cc2d4f1fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/comparator.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/comparator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/compass.json new file mode 100644 index 000000000..96043c807 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/compass.json @@ -0,0 +1,733 @@ +{ + "model": { + "type": "minecraft:condition", + "component": "minecraft:lodestone_tracker", + "on_false": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "spawn" + }, + "when": "minecraft:overworld" + } + ], + "fallback": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "none" + }, + "property": "minecraft:context_dimension" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "lodestone" + }, + "property": "minecraft:has_component" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/composter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/composter.json new file mode 100644 index 000000000..875bef79a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/composter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/composter" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/conduit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/conduit.json new file mode 100644 index 000000000..d5c87e900 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/conduit.json @@ -0,0 +1,9 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/conduit", + "model": { + "type": "minecraft:conduit" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_beef.json new file mode 100644 index 000000000..cc5cb0215 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_beef.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_chicken.json new file mode 100644 index 000000000..3020db999 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_chicken.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_cod.json new file mode 100644 index 000000000..4797e5788 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_cod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_cod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_mutton.json new file mode 100644 index 000000000..3171e1c22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_mutton.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_porkchop.json new file mode 100644 index 000000000..57146f2e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_porkchop.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_rabbit.json new file mode 100644 index 000000000..1284ba18e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_rabbit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_salmon.json new file mode 100644 index 000000000..7a6c01056 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_salmon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cookie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cookie.json new file mode 100644 index 000000000..de14c9c80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cookie.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cookie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_block.json new file mode 100644 index 000000000..5060ed21a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_bulb.json new file mode 100644 index 000000000..feafbf2c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_door.json new file mode 100644 index 000000000..6bc75ee4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_grate.json new file mode 100644 index 000000000..7d9789bce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ingot.json new file mode 100644 index 000000000..e96004782 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/copper_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ore.json new file mode 100644 index 000000000..1e6e607a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_trapdoor.json new file mode 100644 index 000000000..03981dc9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cornflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cornflower.json new file mode 100644 index 000000000..d2574a752 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cornflower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cornflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cow_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cow_spawn_egg.json new file mode 100644 index 000000000..b0e9ab088 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cow_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -12306906 + }, + { + "type": "minecraft:constant", + "value": -6184543 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_bricks.json new file mode 100644 index 000000000..65f9968cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_deepslate_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_tiles.json new file mode 100644 index 000000000..6776f026f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_tiles.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_deepslate_tiles" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_nether_bricks.json new file mode 100644 index 000000000..17b2f4a21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_polished_blackstone_bricks.json new file mode 100644 index 000000000..c62bb99cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_polished_blackstone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_polished_blackstone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_stone_bricks.json new file mode 100644 index 000000000..0d27cdde0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafter.json new file mode 100644 index 000000000..946645919 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crafter" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafting_table.json new file mode 100644 index 000000000..4b3440108 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafting_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crafting_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_heart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_heart.json new file mode 100644 index 000000000..9948ea1c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_heart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/creaking_heart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_spawn_egg.json new file mode 100644 index 000000000..66355bea9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10526881 + }, + { + "type": "minecraft:constant", + "value": -231406 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_banner_pattern.json new file mode 100644 index 000000000..27a4d07e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/creeper_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_head.json new file mode 100644 index 000000000..f6f751723 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "creeper" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_spawn_egg.json new file mode 100644 index 000000000..b46f7a58c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15882485 + }, + { + "type": "minecraft:constant", + "value": -16777216 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_button.json new file mode 100644 index 000000000..2cdecbd06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_door.json new file mode 100644 index 000000000..1240cf332 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence.json new file mode 100644 index 000000000..812852a24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence_gate.json new file mode 100644 index 000000000..88baf9086 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fungus.json new file mode 100644 index 000000000..b6a089cc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fungus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hanging_sign.json new file mode 100644 index 000000000..04e82b760 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hyphae.json new file mode 100644 index 000000000..7f024ebf2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_nylium.json new file mode 100644 index 000000000..75856f32a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_nylium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_nylium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_planks.json new file mode 100644 index 000000000..e56ca28b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_pressure_plate.json new file mode 100644 index 000000000..ca86d5950 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_roots.json new file mode 100644 index 000000000..80a592a71 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_sign.json new file mode 100644 index 000000000..3d72a4816 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_slab.json new file mode 100644 index 000000000..816e9385e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stairs.json new file mode 100644 index 000000000..205a62f9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stem.json new file mode 100644 index 000000000..4658241ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_trapdoor.json new file mode 100644 index 000000000..c11a4fd81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crossbow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crossbow.json new file mode 100644 index 000000000..3fd76bea6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crossbow.json @@ -0,0 +1,54 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_arrow" + }, + "when": "arrow" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_firework" + }, + "when": "rocket" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow" + }, + "property": "minecraft:charge_type" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_1" + }, + "threshold": 0.58 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_2" + }, + "threshold": 1.0 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_0" + }, + "property": "minecraft:crossbow/pull" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crying_obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crying_obsidian.json new file mode 100644 index 000000000..146f8de50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crying_obsidian.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crying_obsidian" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper.json new file mode 100644 index 000000000..69a734c6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_slab.json new file mode 100644 index 000000000..1f8c61975 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_stairs.json new file mode 100644 index 000000000..d63128c1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone.json new file mode 100644 index 000000000..ea4701a34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone_slab.json new file mode 100644 index 000000000..fc25924e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_red_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone.json new file mode 100644 index 000000000..2f1fe0cad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone_slab.json new file mode 100644 index 000000000..bcfef093d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_banner.json new file mode 100644 index 000000000..d7c7b2ce4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "cyan" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bed.json new file mode 100644 index 000000000..cde65b26c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/cyan_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:cyan" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bundle.json new file mode 100644 index 000000000..47e027450 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_candle.json new file mode 100644 index 000000000..129135ed4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_carpet.json new file mode 100644 index 000000000..3bf293b85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete.json new file mode 100644 index 000000000..61b934e07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete_powder.json new file mode 100644 index 000000000..884f433c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_dye.json new file mode 100644 index 000000000..d7e89cb52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_glazed_terracotta.json new file mode 100644 index 000000000..a748751d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_shulker_box.json new file mode 100644 index 000000000..7f58255e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/cyan_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_cyan" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass.json new file mode 100644 index 000000000..c9ef053ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass_pane.json new file mode 100644 index 000000000..b1ea0bd46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_terracotta.json new file mode 100644 index 000000000..f93b202d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_wool.json new file mode 100644 index 000000000..f9ef9a366 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/damaged_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/damaged_anvil.json new file mode 100644 index 000000000..afd397f7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/damaged_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/damaged_anvil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dandelion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dandelion.json new file mode 100644 index 000000000..382f6e83c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dandelion.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dandelion" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/danger_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/danger_pottery_sherd.json new file mode 100644 index 000000000..b18e7728d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/danger_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/danger_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_boat.json new file mode 100644 index 000000000..1952ebc3f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_button.json new file mode 100644 index 000000000..3164e1b14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_chest_boat.json new file mode 100644 index 000000000..36fe0c084 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_door.json new file mode 100644 index 000000000..91274e3e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence.json new file mode 100644 index 000000000..b84fa9384 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence_gate.json new file mode 100644 index 000000000..890a14c35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_hanging_sign.json new file mode 100644 index 000000000..d0ec9e729 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_leaves.json new file mode 100644 index 000000000..361a25da5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_log.json new file mode 100644 index 000000000..3cbf4ecdb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_planks.json new file mode 100644 index 000000000..acd7c7548 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_pressure_plate.json new file mode 100644 index 000000000..1deb44857 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sapling.json new file mode 100644 index 000000000..3e9a56994 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sign.json new file mode 100644 index 000000000..5f48fb976 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_slab.json new file mode 100644 index 000000000..f1ecf6324 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_stairs.json new file mode 100644 index 000000000..97fd5d60a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_trapdoor.json new file mode 100644 index 000000000..0c69766d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_wood.json new file mode 100644 index 000000000..7d4be143c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine.json new file mode 100644 index 000000000..dbba47193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_prismarine" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_slab.json new file mode 100644 index 000000000..ee4f6a9e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_prismarine_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_stairs.json new file mode 100644 index 000000000..1812a3a18 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_prismarine_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/daylight_detector.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/daylight_detector.json new file mode 100644 index 000000000..fc5cdd096 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/daylight_detector.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/daylight_detector" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral.json new file mode 100644 index 000000000..b1993918b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_block.json new file mode 100644 index 000000000..18a18322b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_brain_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_fan.json new file mode 100644 index 000000000..797dee12c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral.json new file mode 100644 index 000000000..1bed424d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_block.json new file mode 100644 index 000000000..df88e21cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_bubble_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_fan.json new file mode 100644 index 000000000..ce5bb921f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bush.json new file mode 100644 index 000000000..32b706c4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bush.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_bush" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral.json new file mode 100644 index 000000000..97d7a23db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_block.json new file mode 100644 index 000000000..6a4dc6c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_fire_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_fan.json new file mode 100644 index 000000000..3fccaf45a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral.json new file mode 100644 index 000000000..cbd3d5b47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_block.json new file mode 100644 index 000000000..b3ddffcfb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_horn_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_fan.json new file mode 100644 index 000000000..9a918b171 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral.json new file mode 100644 index 000000000..22b39b2cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_block.json new file mode 100644 index 000000000..07d1be184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_tube_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_fan.json new file mode 100644 index 000000000..a5e9f8ef2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/debug_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/debug_stick.json new file mode 100644 index 000000000..de806dede --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/debug_stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/debug_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/decorated_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/decorated_pot.json new file mode 100644 index 000000000..24c90d56a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/decorated_pot.json @@ -0,0 +1,9 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/decorated_pot", + "model": { + "type": "minecraft:decorated_pot" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate.json new file mode 100644 index 000000000..77255c70c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_slab.json new file mode 100644 index 000000000..bbc99bad2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_stairs.json new file mode 100644 index 000000000..96502eaf5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_wall.json new file mode 100644 index 000000000..738c6fe1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_bricks.json new file mode 100644 index 000000000..fbd9457a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_coal_ore.json new file mode 100644 index 000000000..1f90c2541 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_coal_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_coal_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_copper_ore.json new file mode 100644 index 000000000..3f26206e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_copper_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_copper_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_diamond_ore.json new file mode 100644 index 000000000..848916bf5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_diamond_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_diamond_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_emerald_ore.json new file mode 100644 index 000000000..aea0b2973 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_emerald_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_emerald_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_gold_ore.json new file mode 100644 index 000000000..c9f3f73b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_gold_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_gold_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_iron_ore.json new file mode 100644 index 000000000..0a9817bef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_iron_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_iron_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_lapis_ore.json new file mode 100644 index 000000000..d70b96607 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_lapis_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_lapis_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_redstone_ore.json new file mode 100644 index 000000000..630e4e933 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_redstone_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_redstone_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_slab.json new file mode 100644 index 000000000..8a2479805 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tile_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_stairs.json new file mode 100644 index 000000000..dbd7c39f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tile_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_wall.json new file mode 100644 index 000000000..e1b441524 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tile_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tiles.json new file mode 100644 index 000000000..b2bd01fa2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tiles.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tiles" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/detector_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/detector_rail.json new file mode 100644 index 000000000..0f427f97d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/detector_rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/detector_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond.json new file mode 100644 index 000000000..02943ce17 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_axe.json new file mode 100644 index 000000000..977851810 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_block.json new file mode 100644 index 000000000..05528085b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diamond_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_boots.json new file mode 100644 index 000000000..6e9f7f195 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_chestplate.json new file mode 100644 index 000000000..792fcdc85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_helmet.json new file mode 100644 index 000000000..e972bdca9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_hoe.json new file mode 100644 index 000000000..e870e0233 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_horse_armor.json new file mode 100644 index 000000000..0cb3d2efe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_leggings.json new file mode 100644 index 000000000..b56966d3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_ore.json new file mode 100644 index 000000000..21cfe182a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diamond_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_pickaxe.json new file mode 100644 index 000000000..bb25d0e69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_shovel.json new file mode 100644 index 000000000..8a66cef5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_sword.json new file mode 100644 index 000000000..feaff1754 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite.json new file mode 100644 index 000000000..c46df5c36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_slab.json new file mode 100644 index 000000000..2970c9d87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_stairs.json new file mode 100644 index 000000000..35afcd780 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_wall.json new file mode 100644 index 000000000..e6f625f87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt.json new file mode 100644 index 000000000..2a743f35c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dirt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt_path.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt_path.json new file mode 100644 index 000000000..5acab8917 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt_path.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dirt_path" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/disc_fragment_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/disc_fragment_5.json new file mode 100644 index 000000000..bd88e9b05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/disc_fragment_5.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/disc_fragment_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dispenser.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dispenser.json new file mode 100644 index 000000000..3976f3461 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dispenser.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dispenser" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dolphin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dolphin_spawn_egg.json new file mode 100644 index 000000000..84cf6744d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dolphin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -14533811 + }, + { + "type": "minecraft:constant", + "value": -394759 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/donkey_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/donkey_spawn_egg.json new file mode 100644 index 000000000..77847f052 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/donkey_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11320007 + }, + { + "type": "minecraft:constant", + "value": -7965338 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_breath.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_breath.json new file mode 100644 index 000000000..781929042 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_breath.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dragon_breath" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_egg.json new file mode 100644 index 000000000..694567c09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dragon_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_head.json new file mode 100644 index 000000000..71017923e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/dragon_head", + "model": { + "type": "minecraft:head", + "kind": "dragon" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp.json new file mode 100644 index 000000000..497ffaac7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dried_kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp_block.json new file mode 100644 index 000000000..6f9f27b8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dried_kelp_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dripstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dripstone_block.json new file mode 100644 index 000000000..de199adae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dripstone_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dripstone_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dropper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dropper.json new file mode 100644 index 000000000..0e5ba841f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dropper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dropper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/drowned_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/drowned_spawn_egg.json new file mode 100644 index 000000000..9733efa9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/drowned_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7343657 + }, + { + "type": "minecraft:constant", + "value": -8807323 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dune_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dune_armor_trim_smithing_template.json new file mode 100644 index 000000000..b59a172b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dune_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dune_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/echo_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/echo_shard.json new file mode 100644 index 000000000..c1f986f23 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/echo_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/echo_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/egg.json new file mode 100644 index 000000000..39c588275 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elder_guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elder_guardian_spawn_egg.json new file mode 100644 index 000000000..09fa97f4f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elder_guardian_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3224390 + }, + { + "type": "minecraft:constant", + "value": -9144685 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elytra.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elytra.json new file mode 100644 index 000000000..2ec75b20c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elytra.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/elytra" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/elytra_broken" + }, + "property": "minecraft:broken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald.json new file mode 100644 index 000000000..1bb686430 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_block.json new file mode 100644 index 000000000..1cdd248ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/emerald_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_ore.json new file mode 100644 index 000000000..fee596cc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/emerald_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_book.json new file mode 100644 index 000000000..d040f8bb6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/enchanted_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_golden_apple.json new file mode 100644 index 000000000..824327a4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_golden_apple.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/enchanted_golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanting_table.json new file mode 100644 index 000000000..6cfff24f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanting_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/enchanting_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_crystal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_crystal.json new file mode 100644 index 000000000..871b593cb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/end_crystal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_portal_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_portal_frame.json new file mode 100644 index 000000000..764c8d353 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_portal_frame.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_portal_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_rod.json new file mode 100644 index 000000000..f7d7c6347 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone.json new file mode 100644 index 000000000..86ea9e802 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_slab.json new file mode 100644 index 000000000..5e7dc44b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_stairs.json new file mode 100644 index 000000000..4de71c7c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_wall.json new file mode 100644 index 000000000..479e30114 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_bricks.json new file mode 100644 index 000000000..d66988536 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_chest.json new file mode 100644 index 000000000..54793a77e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_chest.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/ender_chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:ender" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_dragon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_dragon_spawn_egg.json new file mode 100644 index 000000000..cde65d582 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_dragon_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -14935012 + }, + { + "type": "minecraft:constant", + "value": -2065926 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_eye.json new file mode 100644 index 000000000..cfa768b76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_eye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ender_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_pearl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_pearl.json new file mode 100644 index 000000000..b7bfc1508 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_pearl.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ender_pearl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enderman_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enderman_spawn_egg.json new file mode 100644 index 000000000..26d3e235f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enderman_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15329770 + }, + { + "type": "minecraft:constant", + "value": -16777216 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/endermite_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/endermite_spawn_egg.json new file mode 100644 index 000000000..dded41e0c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/endermite_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15329770 + }, + { + "type": "minecraft:constant", + "value": -9539986 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/evoker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/evoker_spawn_egg.json new file mode 100644 index 000000000..a4efa1576 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/evoker_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6972517 + }, + { + "type": "minecraft:constant", + "value": -14803942 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/experience_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/experience_bottle.json new file mode 100644 index 000000000..08f831b3b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/experience_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/experience_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/explorer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/explorer_pottery_sherd.json new file mode 100644 index 000000000..fdae35328 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/explorer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/explorer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_chiseled_copper.json new file mode 100644 index 000000000..22657b6a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper.json new file mode 100644 index 000000000..632da6748 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_bulb.json new file mode 100644 index 000000000..d54e63062 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_door.json new file mode 100644 index 000000000..0ca6e2ca8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/exposed_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_grate.json new file mode 100644 index 000000000..07c561b46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_trapdoor.json new file mode 100644 index 000000000..260b680ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper.json new file mode 100644 index 000000000..35932366f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_slab.json new file mode 100644 index 000000000..818f88602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_stairs.json new file mode 100644 index 000000000..54f5c1f06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/eye_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/eye_armor_trim_smithing_template.json new file mode 100644 index 000000000..1c5d86eae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/eye_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/eye_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/farmland.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/farmland.json new file mode 100644 index 000000000..394f6a5a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/farmland.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/farmland" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/feather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/feather.json new file mode 100644 index 000000000..809e75b90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/feather.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/feather" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fermented_spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fermented_spider_eye.json new file mode 100644 index 000000000..5bce62ffb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fermented_spider_eye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fermented_spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fern.json new file mode 100644 index 000000000..fc6e75168 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fern.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fern", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/field_masoned_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/field_masoned_banner_pattern.json new file mode 100644 index 000000000..c6fd6ad8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/field_masoned_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/field_masoned_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/filled_map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/filled_map.json new file mode 100644 index 000000000..9152f37cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/filled_map.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/filled_map", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:map_color", + "default": 4603950 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_charge.json new file mode 100644 index 000000000..8326bf8d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_charge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fire_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral.json new file mode 100644 index 000000000..835c481f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_block.json new file mode 100644 index 000000000..027c9f9c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/fire_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_fan.json new file mode 100644 index 000000000..5746686fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_rocket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_rocket.json new file mode 100644 index 000000000..98341aa0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_rocket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/firework_rocket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_star.json new file mode 100644 index 000000000..deec259f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_star.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/firework_star", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:firework", + "default": -7697782 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fishing_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fishing_rod.json new file mode 100644 index 000000000..e22968886 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fletching_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fletching_table.json new file mode 100644 index 000000000..f92820f73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fletching_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/fletching_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint.json new file mode 100644 index 000000000..a1741a1ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flint" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint_and_steel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint_and_steel.json new file mode 100644 index 000000000..279808b9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint_and_steel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flint_and_steel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_armor_trim_smithing_template.json new file mode 100644 index 000000000..cf915b314 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flow_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_banner_pattern.json new file mode 100644 index 000000000..bd51343af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flow_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_pottery_sherd.json new file mode 100644 index 000000000..2c4cd8102 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flow_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_banner_pattern.json new file mode 100644 index 000000000..000a7be87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flower_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_pot.json new file mode 100644 index 000000000..619a80d37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_pot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flower_pot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea.json new file mode 100644 index 000000000..778616a96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/flowering_azalea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea_leaves.json new file mode 100644 index 000000000..35fe16d99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/flowering_azalea_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fox_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fox_spawn_egg.json new file mode 100644 index 000000000..cc448ddde --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fox_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2771297 + }, + { + "type": "minecraft:constant", + "value": -3380960 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/friend_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/friend_pottery_sherd.json new file mode 100644 index 000000000..a5aef4bdc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/friend_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/friend_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frog_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frog_spawn_egg.json new file mode 100644 index 000000000..a29291675 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frog_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3115964 + }, + { + "type": "minecraft:constant", + "value": -14468 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frogspawn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frogspawn.json new file mode 100644 index 000000000..c78393f55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frogspawn.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/frogspawn" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace.json new file mode 100644 index 000000000..6449afc3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/furnace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace_minecart.json new file mode 100644 index 000000000..26139fe1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/furnace_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_spawn_egg.json new file mode 100644 index 000000000..683f9d0c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -394759 + }, + { + "type": "minecraft:constant", + "value": -4408132 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_tear.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_tear.json new file mode 100644 index 000000000..fabdd2d84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_tear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ghast_tear" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gilded_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gilded_blackstone.json new file mode 100644 index 000000000..0ccb924d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gilded_blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gilded_blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass.json new file mode 100644 index 000000000..85664175d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_bottle.json new file mode 100644 index 000000000..04f3032eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glass_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_pane.json new file mode 100644 index 000000000..9639bbc65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glistering_melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glistering_melon_slice.json new file mode 100644 index 000000000..843758321 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glistering_melon_slice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glistering_melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/globe_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/globe_banner_pattern.json new file mode 100644 index 000000000..48bb79dbe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/globe_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/globe_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_berries.json new file mode 100644 index 000000000..01214a8b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_berries.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_ink_sac.json new file mode 100644 index 000000000..f4b136c79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_ink_sac.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_item_frame.json new file mode 100644 index 000000000..1f30da645 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_item_frame.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_lichen.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_lichen.json new file mode 100644 index 000000000..d89ad87b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_lichen.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_lichen" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_squid_spawn_egg.json new file mode 100644 index 000000000..be4810418 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_squid_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -16165290 + }, + { + "type": "minecraft:constant", + "value": -7999044 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone.json new file mode 100644 index 000000000..5fde95210 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/glowstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone_dust.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone_dust.json new file mode 100644 index 000000000..41e727715 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone_dust.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glowstone_dust" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_horn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_horn.json new file mode 100644 index 000000000..d2db83824 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_horn.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/goat_horn" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/tooting_goat_horn" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_spawn_egg.json new file mode 100644 index 000000000..75471773c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -5925764 + }, + { + "type": "minecraft:constant", + "value": -11187906 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_block.json new file mode 100644 index 000000000..a03cc3643 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gold_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ingot.json new file mode 100644 index 000000000..b9d3fdd7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gold_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_nugget.json new file mode 100644 index 000000000..f88f872e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gold_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ore.json new file mode 100644 index 000000000..d2c6805b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gold_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_apple.json new file mode 100644 index 000000000..1cab81edb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_apple.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_axe.json new file mode 100644 index 000000000..899c0e74a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_boots.json new file mode 100644 index 000000000..245b3420e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_carrot.json new file mode 100644 index 000000000..b6f042872 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_carrot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_chestplate.json new file mode 100644 index 000000000..7478fd9a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_helmet.json new file mode 100644 index 000000000..2c999700f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_hoe.json new file mode 100644 index 000000000..9efc7f14f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_horse_armor.json new file mode 100644 index 000000000..31f2e4586 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_leggings.json new file mode 100644 index 000000000..59eba297f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_pickaxe.json new file mode 100644 index 000000000..87fcc70c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_shovel.json new file mode 100644 index 000000000..88425bcd7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_sword.json new file mode 100644 index 000000000..2f2de3b6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite.json new file mode 100644 index 000000000..2ca226ebd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_slab.json new file mode 100644 index 000000000..fe961ead1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_stairs.json new file mode 100644 index 000000000..0ce2b72ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_wall.json new file mode 100644 index 000000000..e6c7d512b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grass_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grass_block.json new file mode 100644 index 000000000..78f1969c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grass_block.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/grass_block", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gravel.json new file mode 100644 index 000000000..2026e5445 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gravel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gravel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_banner.json new file mode 100644 index 000000000..8949b04ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bed.json new file mode 100644 index 000000000..79e938173 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/gray_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bundle.json new file mode 100644 index 000000000..631b36637 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_candle.json new file mode 100644 index 000000000..343de6d50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_carpet.json new file mode 100644 index 000000000..640d832b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete.json new file mode 100644 index 000000000..5c85b853a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete_powder.json new file mode 100644 index 000000000..2db1dc072 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_dye.json new file mode 100644 index 000000000..979ccdb56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_glazed_terracotta.json new file mode 100644 index 000000000..30de14b8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_shulker_box.json new file mode 100644 index 000000000..50b2e1f6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/gray_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass.json new file mode 100644 index 000000000..a96dd88e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass_pane.json new file mode 100644 index 000000000..6443b917e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gray_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_terracotta.json new file mode 100644 index 000000000..b0e977fb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_wool.json new file mode 100644 index 000000000..34a97462a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_banner.json new file mode 100644 index 000000000..22e57d532 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "green" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bed.json new file mode 100644 index 000000000..7658b76c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/green_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:green" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bundle.json new file mode 100644 index 000000000..59bf89dc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_candle.json new file mode 100644 index 000000000..6a9b8254c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/green_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_carpet.json new file mode 100644 index 000000000..c1483ea33 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete.json new file mode 100644 index 000000000..c8a3f219d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete_powder.json new file mode 100644 index 000000000..28a51e628 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_dye.json new file mode 100644 index 000000000..54496b266 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/green_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_glazed_terracotta.json new file mode 100644 index 000000000..fe562296a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_shulker_box.json new file mode 100644 index 000000000..96edd07a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/green_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_green" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass.json new file mode 100644 index 000000000..dfe0c272a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass_pane.json new file mode 100644 index 000000000..c1fe5ba16 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/green_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_terracotta.json new file mode 100644 index 000000000..b86f81064 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_wool.json new file mode 100644 index 000000000..b4ce7e988 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grindstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grindstone.json new file mode 100644 index 000000000..4c5f45b68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grindstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/grindstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guardian_spawn_egg.json new file mode 100644 index 000000000..55e053e12 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guardian_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10845582 + }, + { + "type": "minecraft:constant", + "value": -950992 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gunpowder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gunpowder.json new file mode 100644 index 000000000..5db05cef2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gunpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gunpowder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_banner_pattern.json new file mode 100644 index 000000000..d4e3fe1e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/guster_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_pottery_sherd.json new file mode 100644 index 000000000..8de8ad0fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/guster_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hanging_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hanging_roots.json new file mode 100644 index 000000000..0c5ef0eb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hanging_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/hanging_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hay_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hay_block.json new file mode 100644 index 000000000..da9a175d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hay_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/hay_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_of_the_sea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_of_the_sea.json new file mode 100644 index 000000000..37bab6c87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_of_the_sea.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/heart_of_the_sea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_pottery_sherd.json new file mode 100644 index 000000000..9c0dc00d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/heart_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heartbreak_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heartbreak_pottery_sherd.json new file mode 100644 index 000000000..14b4f6296 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heartbreak_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/heartbreak_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_core.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_core.json new file mode 100644 index 000000000..ea03fa095 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_core.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/heavy_core" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_weighted_pressure_plate.json new file mode 100644 index 000000000..0cc82a64a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_weighted_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/heavy_weighted_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hoglin_spawn_egg.json new file mode 100644 index 000000000..fe7980f46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hoglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3772843 + }, + { + "type": "minecraft:constant", + "value": -10525596 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_block.json new file mode 100644 index 000000000..1e6e3c2fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/honey_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_bottle.json new file mode 100644 index 000000000..20f6301c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/honey_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb.json new file mode 100644 index 000000000..35526a0a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/honeycomb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb_block.json new file mode 100644 index 000000000..e082e65ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/honeycomb_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper.json new file mode 100644 index 000000000..ff8ebdf9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/hopper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper_minecart.json new file mode 100644 index 000000000..b88edb127 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/hopper_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral.json new file mode 100644 index 000000000..715b359f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_block.json new file mode 100644 index 000000000..6b986f24a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/horn_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_fan.json new file mode 100644 index 000000000..121898de7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horse_spawn_egg.json new file mode 100644 index 000000000..89084d092 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horse_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4153731 + }, + { + "type": "minecraft:constant", + "value": -1121024 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/host_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/host_armor_trim_smithing_template.json new file mode 100644 index 000000000..ab6fb59f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/host_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/host_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/howl_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/howl_pottery_sherd.json new file mode 100644 index 000000000..9f6bba7e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/howl_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/howl_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/husk_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/husk_spawn_egg.json new file mode 100644 index 000000000..84aa544bb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/husk_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -8818591 + }, + { + "type": "minecraft:constant", + "value": -1651564 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ice.json new file mode 100644 index 000000000..b8991e788 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/ice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_chiseled_stone_bricks.json new file mode 100644 index 000000000..0001e6708 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_chiseled_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cobblestone.json new file mode 100644 index 000000000..3bee3d364 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cobblestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cracked_stone_bricks.json new file mode 100644 index 000000000..0d27cdde0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cracked_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_deepslate.json new file mode 100644 index 000000000..77255c70c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_mossy_stone_bricks.json new file mode 100644 index 000000000..431c66314 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_mossy_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone.json new file mode 100644 index 000000000..f5c9f2a0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone_bricks.json new file mode 100644 index 000000000..a61dd731d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ink_sac.json new file mode 100644 index 000000000..2cfcafe9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ink_sac.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_axe.json new file mode 100644 index 000000000..3cd80d733 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_bars.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_bars.json new file mode 100644 index 000000000..9a06cea97 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_bars" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_block.json new file mode 100644 index 000000000..36d73e913 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/iron_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_boots.json new file mode 100644 index 000000000..feb3a4568 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_chestplate.json new file mode 100644 index 000000000..98230f972 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_door.json new file mode 100644 index 000000000..39748231f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_golem_spawn_egg.json new file mode 100644 index 000000000..f333d3e6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_golem_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2372158 + }, + { + "type": "minecraft:constant", + "value": -9133262 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_helmet.json new file mode 100644 index 000000000..719098af4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_hoe.json new file mode 100644 index 000000000..fdc1b4606 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_horse_armor.json new file mode 100644 index 000000000..051f1602f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ingot.json new file mode 100644 index 000000000..bb2f3925f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_leggings.json new file mode 100644 index 000000000..83b7369c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_nugget.json new file mode 100644 index 000000000..4ec573eea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ore.json new file mode 100644 index 000000000..44d467e3f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/iron_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_pickaxe.json new file mode 100644 index 000000000..5a3f0d1b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_shovel.json new file mode 100644 index 000000000..3ff9689a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_sword.json new file mode 100644 index 000000000..1bf4bb7df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_trapdoor.json new file mode 100644 index 000000000..b3de8ef59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/iron_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/item_frame.json new file mode 100644 index 000000000..b115f49f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/item_frame.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jack_o_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jack_o_lantern.json new file mode 100644 index 000000000..0a1e97b40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jack_o_lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jack_o_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jigsaw.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jigsaw.json new file mode 100644 index 000000000..29fc70593 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jigsaw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jigsaw" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jukebox.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jukebox.json new file mode 100644 index 000000000..1e9a265b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jukebox.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jukebox" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_boat.json new file mode 100644 index 000000000..2c6c1771b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_button.json new file mode 100644 index 000000000..2085f50ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_chest_boat.json new file mode 100644 index 000000000..8dec2a7a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_door.json new file mode 100644 index 000000000..28f69bb9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence.json new file mode 100644 index 000000000..91b461cfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence_gate.json new file mode 100644 index 000000000..a6a07e9e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_hanging_sign.json new file mode 100644 index 000000000..bffa44c27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_leaves.json new file mode 100644 index 000000000..8454101d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_log.json new file mode 100644 index 000000000..8298b45ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_planks.json new file mode 100644 index 000000000..3b34aeba0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_pressure_plate.json new file mode 100644 index 000000000..114523418 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sapling.json new file mode 100644 index 000000000..1daef334f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sign.json new file mode 100644 index 000000000..8821883c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_slab.json new file mode 100644 index 000000000..4bc7cfa3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_stairs.json new file mode 100644 index 000000000..b12a606ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_trapdoor.json new file mode 100644 index 000000000..20a14ec79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_wood.json new file mode 100644 index 000000000..4d79d4eb7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/kelp.json new file mode 100644 index 000000000..f7a11c1b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/kelp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/knowledge_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/knowledge_book.json new file mode 100644 index 000000000..87e46889b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/knowledge_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/knowledge_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ladder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ladder.json new file mode 100644 index 000000000..d65cb1d37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ladder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ladder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lantern.json new file mode 100644 index 000000000..05c3c2715 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_block.json new file mode 100644 index 000000000..a7e9736b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lapis_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_lazuli.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_lazuli.json new file mode 100644 index 000000000..06707433c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_lazuli.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lapis_lazuli" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_ore.json new file mode 100644 index 000000000..4bff6f79b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lapis_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_amethyst_bud.json new file mode 100644 index 000000000..6e2059240 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_amethyst_bud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/large_amethyst_bud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_fern.json new file mode 100644 index 000000000..6f600341a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_fern.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/large_fern", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lava_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lava_bucket.json new file mode 100644 index 000000000..5d7f2ff5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lava_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lava_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lead.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lead.json new file mode 100644 index 000000000..92105d2cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lead.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lead" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather.json new file mode 100644 index 000000000..7e0715b62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_boots.json new file mode 100644 index 000000000..856efcaf6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_boots.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_chestplate.json new file mode 100644 index 000000000..178794777 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_chestplate.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_helmet.json new file mode 100644 index 000000000..feecbc7ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_helmet.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_horse_armor.json new file mode 100644 index 000000000..fff10050b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_horse_armor.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_horse_armor", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_leggings.json new file mode 100644 index 000000000..aea8bce84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_leggings.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lectern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lectern.json new file mode 100644 index 000000000..12099c3c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lectern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lectern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lever.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lever.json new file mode 100644 index 000000000..102071200 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lever" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light.json new file mode 100644 index 000000000..01c6f2065 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light.json @@ -0,0 +1,125 @@ +{ + "model": { + "type": "minecraft:select", + "block_state_property": "level", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_00" + }, + "when": "0" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_01" + }, + "when": "1" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_02" + }, + "when": "2" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_03" + }, + "when": "3" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_04" + }, + "when": "4" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_05" + }, + "when": "5" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_06" + }, + "when": "6" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_07" + }, + "when": "7" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_08" + }, + "when": "8" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_09" + }, + "when": "9" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_10" + }, + "when": "10" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_11" + }, + "when": "11" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_12" + }, + "when": "12" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_13" + }, + "when": "13" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_14" + }, + "when": "14" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_15" + }, + "when": "15" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/light" + }, + "property": "minecraft:block_state" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_banner.json new file mode 100644 index 000000000..6b64861d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "light_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bed.json new file mode 100644 index 000000000..f899f0f6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_blue_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:light_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bundle.json new file mode 100644 index 000000000..a0c87bd55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_candle.json new file mode 100644 index 000000000..4e8cf64c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_carpet.json new file mode 100644 index 000000000..0027a2fe5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete.json new file mode 100644 index 000000000..96f58785f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete_powder.json new file mode 100644 index 000000000..2ac541e7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_dye.json new file mode 100644 index 000000000..527ad68ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_glazed_terracotta.json new file mode 100644 index 000000000..1e34edfb7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_shulker_box.json new file mode 100644 index 000000000..13e5b1201 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_blue_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_light_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass.json new file mode 100644 index 000000000..84a8a87cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass_pane.json new file mode 100644 index 000000000..4d8f49179 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_terracotta.json new file mode 100644 index 000000000..cf18f080c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_wool.json new file mode 100644 index 000000000..d4dc15c78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_banner.json new file mode 100644 index 000000000..cec38b001 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "light_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bed.json new file mode 100644 index 000000000..1b2b5fb1b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_gray_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:light_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bundle.json new file mode 100644 index 000000000..3377fe603 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_candle.json new file mode 100644 index 000000000..324e9b039 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_carpet.json new file mode 100644 index 000000000..a905889df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete.json new file mode 100644 index 000000000..52b4e682a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete_powder.json new file mode 100644 index 000000000..45a334cf3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_dye.json new file mode 100644 index 000000000..3d85aebda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_glazed_terracotta.json new file mode 100644 index 000000000..24cd3e3fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_shulker_box.json new file mode 100644 index 000000000..7b2890e77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_gray_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_light_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass.json new file mode 100644 index 000000000..f89b0d6c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass_pane.json new file mode 100644 index 000000000..7ffb8319b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_terracotta.json new file mode 100644 index 000000000..302d50eee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_wool.json new file mode 100644 index 000000000..ce28c352c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_weighted_pressure_plate.json new file mode 100644 index 000000000..f9fc01305 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_weighted_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_weighted_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lightning_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lightning_rod.json new file mode 100644 index 000000000..318d6e169 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lightning_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lightning_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lilac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lilac.json new file mode 100644 index 000000000..9dba13cd4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lilac.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lilac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_of_the_valley.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_of_the_valley.json new file mode 100644 index 000000000..11152cacc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_of_the_valley.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lily_of_the_valley" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_pad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_pad.json new file mode 100644 index 000000000..0952ad294 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_pad.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lily_pad", + "tints": [ + { + "type": "minecraft:constant", + "value": -9321636 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_banner.json new file mode 100644 index 000000000..7a370b2f4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "lime" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bed.json new file mode 100644 index 000000000..b81ee17bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/lime_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:lime" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bundle.json new file mode 100644 index 000000000..3789b99dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_candle.json new file mode 100644 index 000000000..edd5748ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lime_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_carpet.json new file mode 100644 index 000000000..3dc877eb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete.json new file mode 100644 index 000000000..832edacbd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete_powder.json new file mode 100644 index 000000000..f6e39ed51 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_dye.json new file mode 100644 index 000000000..cda6a9029 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lime_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_glazed_terracotta.json new file mode 100644 index 000000000..897348b81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_shulker_box.json new file mode 100644 index 000000000..2849f5e8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/lime_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_lime" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass.json new file mode 100644 index 000000000..c9d1ae30c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass_pane.json new file mode 100644 index 000000000..24fb9e2b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lime_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_terracotta.json new file mode 100644 index 000000000..d08631acc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_wool.json new file mode 100644 index 000000000..8e4918443 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lingering_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lingering_potion.json new file mode 100644 index 000000000..ec8257303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lingering_potion.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lingering_potion", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/llama_spawn_egg.json new file mode 100644 index 000000000..2ed781896 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/llama_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4153731 + }, + { + "type": "minecraft:constant", + "value": -6725824 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lodestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lodestone.json new file mode 100644 index 000000000..2ac84d41c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lodestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lodestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/loom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/loom.json new file mode 100644 index 000000000..a83efb19d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/loom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/loom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mace.json new file mode 100644 index 000000000..85d3c0fff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mace.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_banner.json new file mode 100644 index 000000000..102dce88f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "magenta" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bed.json new file mode 100644 index 000000000..1110f7794 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/magenta_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:magenta" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bundle.json new file mode 100644 index 000000000..bb122f286 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_candle.json new file mode 100644 index 000000000..a21f1835a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_carpet.json new file mode 100644 index 000000000..a4a5a70c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete.json new file mode 100644 index 000000000..af52449fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete_powder.json new file mode 100644 index 000000000..c1e31d1c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_dye.json new file mode 100644 index 000000000..452fe73e6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_glazed_terracotta.json new file mode 100644 index 000000000..b6bbeda4e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_shulker_box.json new file mode 100644 index 000000000..32adfdd9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/magenta_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_magenta" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass.json new file mode 100644 index 000000000..99403a70f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass_pane.json new file mode 100644 index 000000000..a75bc227d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_terracotta.json new file mode 100644 index 000000000..c81a0ac3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_wool.json new file mode 100644 index 000000000..e6069e309 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_block.json new file mode 100644 index 000000000..5f1fffb1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magma_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cream.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cream.json new file mode 100644 index 000000000..9cd205e6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cream.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magma_cream" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cube_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cube_spawn_egg.json new file mode 100644 index 000000000..6dfefdaaf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cube_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13369344 + }, + { + "type": "minecraft:constant", + "value": -197632 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_boat.json new file mode 100644 index 000000000..5a7e4ec04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_button.json new file mode 100644 index 000000000..e94f44372 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_chest_boat.json new file mode 100644 index 000000000..d4dfef22a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_door.json new file mode 100644 index 000000000..17a08b7b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence.json new file mode 100644 index 000000000..6ae1e8701 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence_gate.json new file mode 100644 index 000000000..8ddd81081 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_hanging_sign.json new file mode 100644 index 000000000..5d142a0c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_leaves.json new file mode 100644 index 000000000..3314939b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -7158200 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_log.json new file mode 100644 index 000000000..1c472d673 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_planks.json new file mode 100644 index 000000000..32ac80c9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_pressure_plate.json new file mode 100644 index 000000000..df4bef887 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_propagule.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_propagule.json new file mode 100644 index 000000000..3e671460a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_propagule.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_propagule" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_roots.json new file mode 100644 index 000000000..c36991de0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_sign.json new file mode 100644 index 000000000..4a0b0dabd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_slab.json new file mode 100644 index 000000000..41bd62590 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_stairs.json new file mode 100644 index 000000000..568063fb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_trapdoor.json new file mode 100644 index 000000000..d771ef8fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_wood.json new file mode 100644 index 000000000..34fa8bd84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/map.json new file mode 100644 index 000000000..c10f8ae90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/map.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/map" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/medium_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/medium_amethyst_bud.json new file mode 100644 index 000000000..c5b278950 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/medium_amethyst_bud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/medium_amethyst_bud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon.json new file mode 100644 index 000000000..b3d5859e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/melon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_seeds.json new file mode 100644 index 000000000..b9c5cac89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/melon_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_slice.json new file mode 100644 index 000000000..4753610a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_slice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/milk_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/milk_bucket.json new file mode 100644 index 000000000..36d245a7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/milk_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/milk_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/minecart.json new file mode 100644 index 000000000..20ea7d59f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/miner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/miner_pottery_sherd.json new file mode 100644 index 000000000..fcf06d747 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/miner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/miner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mojang_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mojang_banner_pattern.json new file mode 100644 index 000000000..9ad39b72b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mojang_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mojang_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mooshroom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mooshroom_spawn_egg.json new file mode 100644 index 000000000..a8d3720a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mooshroom_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6287600 + }, + { + "type": "minecraft:constant", + "value": -4737097 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_block.json new file mode 100644 index 000000000..f9be97767 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/moss_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_carpet.json new file mode 100644 index 000000000..85b607077 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/moss_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone.json new file mode 100644 index 000000000..5aa1d87e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_slab.json new file mode 100644 index 000000000..88f15952a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_stairs.json new file mode 100644 index 000000000..3d2ef3c7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_wall.json new file mode 100644 index 000000000..7bfeb08ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_slab.json new file mode 100644 index 000000000..f61124270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_stairs.json new file mode 100644 index 000000000..9096a3cff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_wall.json new file mode 100644 index 000000000..130e597df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_bricks.json new file mode 100644 index 000000000..431c66314 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mourner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mourner_pottery_sherd.json new file mode 100644 index 000000000..e576fdb7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mourner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mourner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud.json new file mode 100644 index 000000000..2ae0c692e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_slab.json new file mode 100644 index 000000000..bdd56fd60 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_stairs.json new file mode 100644 index 000000000..09bb42cb1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_wall.json new file mode 100644 index 000000000..9ec3a54ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_bricks.json new file mode 100644 index 000000000..47c0ec67f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/muddy_mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/muddy_mangrove_roots.json new file mode 100644 index 000000000..72ee9ad21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/muddy_mangrove_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/muddy_mangrove_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mule_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mule_spawn_egg.json new file mode 100644 index 000000000..6890dcb27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mule_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15007232 + }, + { + "type": "minecraft:constant", + "value": -11455715 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stem.json new file mode 100644 index 000000000..14ee4df05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mushroom_stem_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stew.json new file mode 100644 index 000000000..7d6fd975d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stew.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mushroom_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_11.json new file mode 100644 index 000000000..8bf248c70 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_11.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_13.json new file mode 100644 index 000000000..36859fea3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_13.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_5.json new file mode 100644 index 000000000..2d31f5951 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_5.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_blocks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_blocks.json new file mode 100644 index 000000000..1a8def790 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_blocks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_blocks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_cat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_cat.json new file mode 100644 index 000000000..a4b3d52a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_cat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_cat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_chirp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_chirp.json new file mode 100644 index 000000000..2b5f4c057 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_chirp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_chirp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator.json new file mode 100644 index 000000000..de47392e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_creator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator_music_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator_music_box.json new file mode 100644 index 000000000..e754f5e6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator_music_box.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_creator_music_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_far.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_far.json new file mode 100644 index 000000000..e5048148b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_far.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_far" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mall.json new file mode 100644 index 000000000..7958c0e50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_mall" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mellohi.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mellohi.json new file mode 100644 index 000000000..bfa887565 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mellohi.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_mellohi" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_otherside.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_otherside.json new file mode 100644 index 000000000..3f07b4a5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_otherside.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_otherside" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_pigstep.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_pigstep.json new file mode 100644 index 000000000..9610fb687 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_pigstep.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_pigstep" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_precipice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_precipice.json new file mode 100644 index 000000000..ce782edaf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_precipice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_precipice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_relic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_relic.json new file mode 100644 index 000000000..8d951d722 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_relic.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_relic" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_stal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_stal.json new file mode 100644 index 000000000..a8fe9b01b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_stal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_stal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_strad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_strad.json new file mode 100644 index 000000000..f33b7491a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_strad.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_strad" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_wait.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_wait.json new file mode 100644 index 000000000..b50eb8e87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_wait.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_wait" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_ward.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_ward.json new file mode 100644 index 000000000..166692f42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_ward.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_ward" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mutton.json new file mode 100644 index 000000000..5977fce09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mutton.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mycelium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mycelium.json new file mode 100644 index 000000000..02add88a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mycelium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mycelium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/name_tag.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/name_tag.json new file mode 100644 index 000000000..2f2e54ab7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/name_tag.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/name_tag" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nautilus_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nautilus_shell.json new file mode 100644 index 000000000..9fd2b3333 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nautilus_shell.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nautilus_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick.json new file mode 100644 index 000000000..84e311d46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_fence.json new file mode 100644 index 000000000..11d21cf99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_slab.json new file mode 100644 index 000000000..def834b62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_stairs.json new file mode 100644 index 000000000..0fcd602ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_wall.json new file mode 100644 index 000000000..0ca47fc6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_bricks.json new file mode 100644 index 000000000..04d911a98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_gold_ore.json new file mode 100644 index 000000000..30857376a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_gold_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_gold_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_quartz_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_quartz_ore.json new file mode 100644 index 000000000..d7d0101d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_quartz_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_quartz_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_sprouts.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_sprouts.json new file mode 100644 index 000000000..ce1ff8efa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_sprouts.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_sprouts" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_star.json new file mode 100644 index 000000000..4539152fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_star.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_star" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart.json new file mode 100644 index 000000000..b33c624d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_wart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart_block.json new file mode 100644 index 000000000..a56620633 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_wart_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_axe.json new file mode 100644 index 000000000..02f455656 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_block.json new file mode 100644 index 000000000..e7e8de379 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/netherite_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_boots.json new file mode 100644 index 000000000..8a7a7adc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_chestplate.json new file mode 100644 index 000000000..b338ed228 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_helmet.json new file mode 100644 index 000000000..317699f2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_hoe.json new file mode 100644 index 000000000..67625e1a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_ingot.json new file mode 100644 index 000000000..3fa2583b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_leggings.json new file mode 100644 index 000000000..61de5f894 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_pickaxe.json new file mode 100644 index 000000000..a5fc75c0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_scrap.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_scrap.json new file mode 100644 index 000000000..0f0b6410d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_scrap.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_scrap" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_shovel.json new file mode 100644 index 000000000..9fd5ed4c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_sword.json new file mode 100644 index 000000000..2cf94a276 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_upgrade_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_upgrade_smithing_template.json new file mode 100644 index 000000000..62915512b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_upgrade_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherrack.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherrack.json new file mode 100644 index 000000000..b2062681f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherrack.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/netherrack" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/note_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/note_block.json new file mode 100644 index 000000000..4b539c046 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/note_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/note_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_boat.json new file mode 100644 index 000000000..f43e94b11 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_button.json new file mode 100644 index 000000000..d45985900 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_chest_boat.json new file mode 100644 index 000000000..26b1d7f82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_door.json new file mode 100644 index 000000000..0e80b32d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence.json new file mode 100644 index 000000000..4f5d32e21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence_gate.json new file mode 100644 index 000000000..dc6c743df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_hanging_sign.json new file mode 100644 index 000000000..a19906d1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_leaves.json new file mode 100644 index 000000000..dde032961 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_log.json new file mode 100644 index 000000000..81bfdf5c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_planks.json new file mode 100644 index 000000000..d04c2f600 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_pressure_plate.json new file mode 100644 index 000000000..c7b3844a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sapling.json new file mode 100644 index 000000000..5362761a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sign.json new file mode 100644 index 000000000..85ed9a5a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_slab.json new file mode 100644 index 000000000..86d648fc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_stairs.json new file mode 100644 index 000000000..4246d24da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_trapdoor.json new file mode 100644 index 000000000..f6d7d787e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_wood.json new file mode 100644 index 000000000..973108be0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/observer.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/observer.json new file mode 100644 index 000000000..3d0d40767 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/observer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/observer" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/obsidian.json new file mode 100644 index 000000000..e51b6722c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/obsidian.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/obsidian" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ocelot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ocelot_spawn_egg.json new file mode 100644 index 000000000..333616e3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ocelot_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1057155 + }, + { + "type": "minecraft:constant", + "value": -11123660 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ochre_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ochre_froglight.json new file mode 100644 index 000000000..5bec1c6dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ochre_froglight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/ochre_froglight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_bottle.json new file mode 100644 index 000000000..1d68412d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ominous_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_trial_key.json new file mode 100644 index 000000000..fe0ceb49b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_trial_key.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ominous_trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/open_eyeblossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/open_eyeblossom.json new file mode 100644 index 000000000..17bad6929 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/open_eyeblossom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/open_eyeblossom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_banner.json new file mode 100644 index 000000000..6e7f7e63d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "orange" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bed.json new file mode 100644 index 000000000..a1891083c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/orange_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:orange" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bundle.json new file mode 100644 index 000000000..5aaf68bf8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_candle.json new file mode 100644 index 000000000..adbc212e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_carpet.json new file mode 100644 index 000000000..50aefc691 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete.json new file mode 100644 index 000000000..1fb70fdb6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete_powder.json new file mode 100644 index 000000000..7e6c2804d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_dye.json new file mode 100644 index 000000000..1e86b0165 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_glazed_terracotta.json new file mode 100644 index 000000000..4bd4509ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_shulker_box.json new file mode 100644 index 000000000..1a0b6939a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/orange_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_orange" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass.json new file mode 100644 index 000000000..12e8dabb0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass_pane.json new file mode 100644 index 000000000..9764dfcd6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_terracotta.json new file mode 100644 index 000000000..5d3bdc715 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_tulip.json new file mode 100644 index 000000000..eef0a7964 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_wool.json new file mode 100644 index 000000000..46ad8f666 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxeye_daisy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxeye_daisy.json new file mode 100644 index 000000000..f0d528422 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxeye_daisy.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oxeye_daisy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_chiseled_copper.json new file mode 100644 index 000000000..78b7eae05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper.json new file mode 100644 index 000000000..c58b7f62d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_bulb.json new file mode 100644 index 000000000..aeab2c8ce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_door.json new file mode 100644 index 000000000..b5cc84d31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oxidized_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_grate.json new file mode 100644 index 000000000..90d2a4833 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_trapdoor.json new file mode 100644 index 000000000..245f08ef9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper.json new file mode 100644 index 000000000..ec0748d35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_slab.json new file mode 100644 index 000000000..3e15eec78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..7fd0b7f0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_ice.json new file mode 100644 index 000000000..46c3748d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_ice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/packed_ice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_mud.json new file mode 100644 index 000000000..a54ca54de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_mud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/packed_mud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/painting.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/painting.json new file mode 100644 index 000000000..dd9e2a156 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/painting.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/painting" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_hanging_moss.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_hanging_moss.json new file mode 100644 index 000000000..265249e0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_hanging_moss.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_hanging_moss" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_block.json new file mode 100644 index 000000000..752172924 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_moss_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_carpet.json new file mode 100644 index 000000000..bfa7af73d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_moss_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_boat.json new file mode 100644 index 000000000..0d44dbde3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_button.json new file mode 100644 index 000000000..e72d35685 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_chest_boat.json new file mode 100644 index 000000000..66d0994fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_door.json new file mode 100644 index 000000000..4d15f541d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence.json new file mode 100644 index 000000000..43eede127 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence_gate.json new file mode 100644 index 000000000..0747be1fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_hanging_sign.json new file mode 100644 index 000000000..73fc04416 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_leaves.json new file mode 100644 index 000000000..af0326dc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_log.json new file mode 100644 index 000000000..41dcbcd0e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_planks.json new file mode 100644 index 000000000..d1312cd98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_pressure_plate.json new file mode 100644 index 000000000..091b2c66d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sapling.json new file mode 100644 index 000000000..5005f057a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sign.json new file mode 100644 index 000000000..25efa70d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_slab.json new file mode 100644 index 000000000..99c908d1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_stairs.json new file mode 100644 index 000000000..b35ebc852 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_trapdoor.json new file mode 100644 index 000000000..8a0e54368 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_wood.json new file mode 100644 index 000000000..a9ec9c6a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/panda_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/panda_spawn_egg.json new file mode 100644 index 000000000..e3c983d73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/panda_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1579033 + }, + { + "type": "minecraft:constant", + "value": -15000798 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/paper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/paper.json new file mode 100644 index 000000000..981714c02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/paper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/paper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/parrot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/parrot_spawn_egg.json new file mode 100644 index 000000000..f633eea9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/parrot_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15882485 + }, + { + "type": "minecraft:constant", + "value": -65536 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pearlescent_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pearlescent_froglight.json new file mode 100644 index 000000000..679130d89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pearlescent_froglight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pearlescent_froglight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/peony.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/peony.json new file mode 100644 index 000000000..12cab6903 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/peony.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/peony" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/petrified_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/petrified_oak_slab.json new file mode 100644 index 000000000..40d996616 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/petrified_oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/petrified_oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_membrane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_membrane.json new file mode 100644 index 000000000..ff4a666fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_membrane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/phantom_membrane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_spawn_egg.json new file mode 100644 index 000000000..9ad747b67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -12365430 + }, + { + "type": "minecraft:constant", + "value": -7799040 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pig_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pig_spawn_egg.json new file mode 100644 index 000000000..d1139e70e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pig_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1006174 + }, + { + "type": "minecraft:constant", + "value": -2399393 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_banner_pattern.json new file mode 100644 index 000000000..b532de2ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/piglin_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_brute_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_brute_spawn_egg.json new file mode 100644 index 000000000..68c2002eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_brute_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10933744 + }, + { + "type": "minecraft:constant", + "value": -396380 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_head.json new file mode 100644 index 000000000..e0f69892e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "piglin" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_spawn_egg.json new file mode 100644 index 000000000..f4976251c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6725824 + }, + { + "type": "minecraft:constant", + "value": -396380 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pillager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pillager_spawn_egg.json new file mode 100644 index 000000000..0f961d282 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pillager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11325642 + }, + { + "type": "minecraft:constant", + "value": -6972517 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_banner.json new file mode 100644 index 000000000..a86bb3325 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "pink" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bed.json new file mode 100644 index 000000000..2e686eb69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/pink_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:pink" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bundle.json new file mode 100644 index 000000000..327eb44c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_candle.json new file mode 100644 index 000000000..d94ae4628 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_carpet.json new file mode 100644 index 000000000..5080cbf2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete.json new file mode 100644 index 000000000..8d09e8dbc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete_powder.json new file mode 100644 index 000000000..2b4730814 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_dye.json new file mode 100644 index 000000000..5c5bb43d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_glazed_terracotta.json new file mode 100644 index 000000000..435ed0aaf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_petals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_petals.json new file mode 100644 index 000000000..3eb460ea6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_petals.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_petals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_shulker_box.json new file mode 100644 index 000000000..a1d380426 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/pink_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_pink" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass.json new file mode 100644 index 000000000..2c8db80fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass_pane.json new file mode 100644 index 000000000..34b3082e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_terracotta.json new file mode 100644 index 000000000..23d6a9fd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_tulip.json new file mode 100644 index 000000000..ebea48cf1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_wool.json new file mode 100644 index 000000000..32027ca64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piston.json new file mode 100644 index 000000000..b52126f9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piston.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/piston_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_plant.json new file mode 100644 index 000000000..2fc0921f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_plant.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pitcher_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_pod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_pod.json new file mode 100644 index 000000000..01c2af4b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_pod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pitcher_pod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/player_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/player_head.json new file mode 100644 index 000000000..2d522d2ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/player_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "player" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/plenty_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/plenty_pottery_sherd.json new file mode 100644 index 000000000..8517799f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/plenty_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/plenty_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/podzol.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/podzol.json new file mode 100644 index 000000000..8055b1ee3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/podzol.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/podzol" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pointed_dripstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pointed_dripstone.json new file mode 100644 index 000000000..3570a9998 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pointed_dripstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pointed_dripstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poisonous_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poisonous_potato.json new file mode 100644 index 000000000..8132ca0c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poisonous_potato.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/poisonous_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polar_bear_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polar_bear_spawn_egg.json new file mode 100644 index 000000000..8beaa452d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polar_bear_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1118498 + }, + { + "type": "minecraft:constant", + "value": -2763059 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite.json new file mode 100644 index 000000000..a1cafdbb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_andesite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_slab.json new file mode 100644 index 000000000..cf1fc3840 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_andesite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_stairs.json new file mode 100644 index 000000000..af67153b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_andesite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_basalt.json new file mode 100644 index 000000000..2640ce6c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_basalt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_basalt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone.json new file mode 100644 index 000000000..181c2944d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_slab.json new file mode 100644 index 000000000..98d721208 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_stairs.json new file mode 100644 index 000000000..0d2a1ae3f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_wall.json new file mode 100644 index 000000000..d37c3291d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_bricks.json new file mode 100644 index 000000000..6eb6188be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_button.json new file mode 100644 index 000000000..c9aefed77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_pressure_plate.json new file mode 100644 index 000000000..a74aded7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_slab.json new file mode 100644 index 000000000..2c0d2c3f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_stairs.json new file mode 100644 index 000000000..710e56025 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_wall.json new file mode 100644 index 000000000..73a08c4a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate.json new file mode 100644 index 000000000..3568e7e34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_slab.json new file mode 100644 index 000000000..9ea8f6a8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_stairs.json new file mode 100644 index 000000000..15406e1ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_wall.json new file mode 100644 index 000000000..db3a3db63 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite.json new file mode 100644 index 000000000..4e5510602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_diorite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_slab.json new file mode 100644 index 000000000..165571e52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_diorite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_stairs.json new file mode 100644 index 000000000..d01da0011 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_diorite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite.json new file mode 100644 index 000000000..f563a5815 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_granite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_slab.json new file mode 100644 index 000000000..cf284e3cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_granite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_stairs.json new file mode 100644 index 000000000..faf07419b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_granite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff.json new file mode 100644 index 000000000..3561f965d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_slab.json new file mode 100644 index 000000000..777eb8f35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_stairs.json new file mode 100644 index 000000000..ed2f5ef88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_wall.json new file mode 100644 index 000000000..b0ea8fe2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/popped_chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/popped_chorus_fruit.json new file mode 100644 index 000000000..d8b0732f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/popped_chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/popped_chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poppy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poppy.json new file mode 100644 index 000000000..19cc1bc57 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poppy.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/poppy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/porkchop.json new file mode 100644 index 000000000..f820d9ec5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/porkchop.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potato.json new file mode 100644 index 000000000..6926e16bb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potato.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potion.json new file mode 100644 index 000000000..3f0b2e341 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potion.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/potion", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powder_snow_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powder_snow_bucket.json new file mode 100644 index 000000000..c7560238b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powder_snow_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/powder_snow_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powered_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powered_rail.json new file mode 100644 index 000000000..ae1ae8a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powered_rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/powered_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine.json new file mode 100644 index 000000000..8b8df6289 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_slab.json new file mode 100644 index 000000000..4cfe1b8ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_stairs.json new file mode 100644 index 000000000..cc00e6186 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_bricks.json new file mode 100644 index 000000000..ea827dc7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_crystals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_crystals.json new file mode 100644 index 000000000..65b82683e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_crystals.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/prismarine_crystals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_shard.json new file mode 100644 index 000000000..62e7ca534 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/prismarine_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_slab.json new file mode 100644 index 000000000..43acaf5a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_stairs.json new file mode 100644 index 000000000..251ebd31c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_wall.json new file mode 100644 index 000000000..2a8e95eca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prize_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prize_pottery_sherd.json new file mode 100644 index 000000000..8caaa5586 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prize_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/prize_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish.json new file mode 100644 index 000000000..c509473e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pufferfish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_bucket.json new file mode 100644 index 000000000..a347a0279 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pufferfish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_spawn_egg.json new file mode 100644 index 000000000..bd4861273 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -609791 + }, + { + "type": "minecraft:constant", + "value": -13122574 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin.json new file mode 100644 index 000000000..0faeffcb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pumpkin" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_pie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_pie.json new file mode 100644 index 000000000..82d1d8d45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_pie.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pumpkin_pie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_seeds.json new file mode 100644 index 000000000..27eb2b18f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pumpkin_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_banner.json new file mode 100644 index 000000000..a632445d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "purple" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bed.json new file mode 100644 index 000000000..ce125e53f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/purple_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:purple" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bundle.json new file mode 100644 index 000000000..f7f9d18e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_candle.json new file mode 100644 index 000000000..c7e507f7c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/purple_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_carpet.json new file mode 100644 index 000000000..3f09aedcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete.json new file mode 100644 index 000000000..09e02e78f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete_powder.json new file mode 100644 index 000000000..ba6108736 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_dye.json new file mode 100644 index 000000000..4e714a5d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/purple_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_glazed_terracotta.json new file mode 100644 index 000000000..8d4c892a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_shulker_box.json new file mode 100644 index 000000000..3123f271c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/purple_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_purple" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass.json new file mode 100644 index 000000000..9ee1a1a80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass_pane.json new file mode 100644 index 000000000..8c0ca721e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/purple_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_terracotta.json new file mode 100644 index 000000000..b8f12da09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_wool.json new file mode 100644 index 000000000..10a06042e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_block.json new file mode 100644 index 000000000..869e90fdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_pillar.json new file mode 100644 index 000000000..1403ba779 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_pillar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_pillar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_slab.json new file mode 100644 index 000000000..d8cfeb97e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_stairs.json new file mode 100644 index 000000000..4e408c25c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz.json new file mode 100644 index 000000000..bb72ef579 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_block.json new file mode 100644 index 000000000..f14834d0c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_bricks.json new file mode 100644 index 000000000..5b00e1702 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_pillar.json new file mode 100644 index 000000000..7c760921e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_pillar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_pillar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_slab.json new file mode 100644 index 000000000..5d889db04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_stairs.json new file mode 100644 index 000000000..355f101eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit.json new file mode 100644 index 000000000..a65a35837 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_foot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_foot.json new file mode 100644 index 000000000..65a4362ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_foot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit_foot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_hide.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_hide.json new file mode 100644 index 000000000..b125735ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_hide.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit_hide" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_spawn_egg.json new file mode 100644 index 000000000..499cf291b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6725824 + }, + { + "type": "minecraft:constant", + "value": -9222095 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_stew.json new file mode 100644 index 000000000..3d01e38ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_stew.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rail.json new file mode 100644 index 000000000..79de80b32 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raiser_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raiser_armor_trim_smithing_template.json new file mode 100644 index 000000000..9b78cc73c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raiser_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raiser_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ravager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ravager_spawn_egg.json new file mode 100644 index 000000000..caa7b1c8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ravager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9079696 + }, + { + "type": "minecraft:constant", + "value": -10792887 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper.json new file mode 100644 index 000000000..1acac00af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raw_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper_block.json new file mode 100644 index 000000000..74e4268c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/raw_copper_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold.json new file mode 100644 index 000000000..c409fb4b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raw_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold_block.json new file mode 100644 index 000000000..8636565f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/raw_gold_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron.json new file mode 100644 index 000000000..0b5b2178b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raw_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron_block.json new file mode 100644 index 000000000..368a35a79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/raw_iron_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/recovery_compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/recovery_compass.json new file mode 100644 index 000000000..676d03665 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/recovery_compass.json @@ -0,0 +1,241 @@ +{ + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "recovery" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_banner.json new file mode 100644 index 000000000..80cdff09c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "red" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bed.json new file mode 100644 index 000000000..9b772b375 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/red_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:red" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bundle.json new file mode 100644 index 000000000..811afd561 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_candle.json new file mode 100644 index 000000000..31e3952bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_carpet.json new file mode 100644 index 000000000..c58019dbb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete.json new file mode 100644 index 000000000..756a4cea5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete_powder.json new file mode 100644 index 000000000..2f2b48855 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_dye.json new file mode 100644 index 000000000..2acc27620 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_glazed_terracotta.json new file mode 100644 index 000000000..b2ca92200 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom.json new file mode 100644 index 000000000..ede149295 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom_block.json new file mode 100644 index 000000000..d7b804564 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_mushroom_block_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_slab.json new file mode 100644 index 000000000..084cc145b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_stairs.json new file mode 100644 index 000000000..4d655dbf5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_wall.json new file mode 100644 index 000000000..d5a4313a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_bricks.json new file mode 100644 index 000000000..4bc5ad7de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sand.json new file mode 100644 index 000000000..18a6982df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone.json new file mode 100644 index 000000000..99efe2f39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_slab.json new file mode 100644 index 000000000..3ab55118c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_stairs.json new file mode 100644 index 000000000..f26d3ed89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_wall.json new file mode 100644 index 000000000..52cb9c270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_shulker_box.json new file mode 100644 index 000000000..41278f48b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/red_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_red" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass.json new file mode 100644 index 000000000..8b567b7a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass_pane.json new file mode 100644 index 000000000..d65611ec1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_terracotta.json new file mode 100644 index 000000000..4b9940927 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_tulip.json new file mode 100644 index 000000000..dc62d0b83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_wool.json new file mode 100644 index 000000000..310df92d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone.json new file mode 100644 index 000000000..d09f3de6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_block.json new file mode 100644 index 000000000..20d75a80d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/redstone_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_lamp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_lamp.json new file mode 100644 index 000000000..4edf1ab0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_lamp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/redstone_lamp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_ore.json new file mode 100644 index 000000000..a6a5f3e39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/redstone_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_torch.json new file mode 100644 index 000000000..45deab455 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_torch.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/redstone_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/reinforced_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/reinforced_deepslate.json new file mode 100644 index 000000000..7e8fd3ec5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/reinforced_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/reinforced_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeater.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeater.json new file mode 100644 index 000000000..b0446ebe9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeater.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/repeater" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeating_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeating_command_block.json new file mode 100644 index 000000000..404579414 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeating_command_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/repeating_command_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_block.json new file mode 100644 index 000000000..d50dedec3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick.json new file mode 100644 index 000000000..3443227b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/resin_brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_slab.json new file mode 100644 index 000000000..e45cebb36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_stairs.json new file mode 100644 index 000000000..2ea91f798 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_wall.json new file mode 100644 index 000000000..36d28477e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_bricks.json new file mode 100644 index 000000000..659164ae0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_clump.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_clump.json new file mode 100644 index 000000000..566ea5239 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/resin_clump" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/respawn_anchor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/respawn_anchor.json new file mode 100644 index 000000000..4d9f0c72b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/respawn_anchor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/respawn_anchor_0" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rib_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rib_armor_trim_smithing_template.json new file mode 100644 index 000000000..94267177d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rib_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rib_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rooted_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rooted_dirt.json new file mode 100644 index 000000000..c881387e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rooted_dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/rooted_dirt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rose_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rose_bush.json new file mode 100644 index 000000000..2f7fcbb65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rose_bush.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rose_bush" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rotten_flesh.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rotten_flesh.json new file mode 100644 index 000000000..a589c2afc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rotten_flesh.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rotten_flesh" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/saddle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/saddle.json new file mode 100644 index 000000000..7fd03e7ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/saddle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/saddle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon.json new file mode 100644 index 000000000..ad1ff9621 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_bucket.json new file mode 100644 index 000000000..b5c3af3d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/salmon_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_spawn_egg.json new file mode 100644 index 000000000..bd0fd4bb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6287600 + }, + { + "type": "minecraft:constant", + "value": -15825804 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sand.json new file mode 100644 index 000000000..0d053d91d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone.json new file mode 100644 index 000000000..a8071c3d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_slab.json new file mode 100644 index 000000000..63249734e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_stairs.json new file mode 100644 index 000000000..d3bd4df77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_wall.json new file mode 100644 index 000000000..4c63f461a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scaffolding.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scaffolding.json new file mode 100644 index 000000000..c3692b7ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scaffolding.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/scaffolding_stable" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scrape_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scrape_pottery_sherd.json new file mode 100644 index 000000000..020a80ec4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scrape_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/scrape_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk.json new file mode 100644 index 000000000..73211e5f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_catalyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_catalyst.json new file mode 100644 index 000000000..fd27d7843 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_catalyst.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk_catalyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_sensor.json new file mode 100644 index 000000000..7ffe1c992 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_sensor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk_sensor_inactive" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_shrieker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_shrieker.json new file mode 100644 index 000000000..5c4166a29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_shrieker.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk_shrieker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_vein.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_vein.json new file mode 100644 index 000000000..468d5a93a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_vein.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sculk_vein" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_lantern.json new file mode 100644 index 000000000..33663f597 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sea_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_pickle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_pickle.json new file mode 100644 index 000000000..46e93249f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_pickle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sea_pickle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/seagrass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/seagrass.json new file mode 100644 index 000000000..39d338bc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/seagrass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/seagrass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sentry_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sentry_armor_trim_smithing_template.json new file mode 100644 index 000000000..1c3fd1154 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sentry_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sentry_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shaper_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shaper_armor_trim_smithing_template.json new file mode 100644 index 000000000..1d7a21224 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shaper_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shaper_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheaf_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheaf_pottery_sherd.json new file mode 100644 index 000000000..25308a86a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheaf_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sheaf_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shears.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shears.json new file mode 100644 index 000000000..10f58ec82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shears" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheep_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheep_spawn_egg.json new file mode 100644 index 000000000..609bbd43d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheep_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1579033 + }, + { + "type": "minecraft:constant", + "value": -19019 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shelter_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shelter_pottery_sherd.json new file mode 100644 index 000000000..392707eb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shelter_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shelter_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shield.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shield.json new file mode 100644 index 000000000..f6bc4b3e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shield.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:special", + "base": "minecraft:item/shield", + "model": { + "type": "minecraft:shield" + } + }, + "on_true": { + "type": "minecraft:special", + "base": "minecraft:item/shield_blocking", + "model": { + "type": "minecraft:shield" + } + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/short_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/short_grass.json new file mode 100644 index 000000000..d218bc011 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/short_grass.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/short_grass", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shroomlight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shroomlight.json new file mode 100644 index 000000000..2cbf73b0e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shroomlight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/shroomlight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_box.json new file mode 100644 index 000000000..b688cdb37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_shell.json new file mode 100644 index 000000000..fbb0597f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_shell.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shulker_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_spawn_egg.json new file mode 100644 index 000000000..d7ff35fc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7051372 + }, + { + "type": "minecraft:constant", + "value": -11716526 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silence_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silence_armor_trim_smithing_template.json new file mode 100644 index 000000000..c19819d97 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silence_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/silence_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silverfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silverfish_spawn_egg.json new file mode 100644 index 000000000..8f28286f9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silverfish_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9539986 + }, + { + "type": "minecraft:constant", + "value": -13619152 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_horse_spawn_egg.json new file mode 100644 index 000000000..48c07e137 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_horse_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9934769 + }, + { + "type": "minecraft:constant", + "value": -1710632 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_skull.json new file mode 100644 index 000000000..68cf144ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_skull.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "skeleton" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_spawn_egg.json new file mode 100644 index 000000000..e6f776df7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4079167 + }, + { + "type": "minecraft:constant", + "value": -11974327 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_banner_pattern.json new file mode 100644 index 000000000..9bee46be0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/skull_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_pottery_sherd.json new file mode 100644 index 000000000..22a43641b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/skull_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_ball.json new file mode 100644 index 000000000..799ca93af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_ball.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/slime_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_block.json new file mode 100644 index 000000000..b066f9faf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/slime_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_spawn_egg.json new file mode 100644 index 000000000..a6d20b211 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11427778 + }, + { + "type": "minecraft:constant", + "value": -8470674 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_amethyst_bud.json new file mode 100644 index 000000000..8d8a72b9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_amethyst_bud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/small_amethyst_bud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_dripleaf.json new file mode 100644 index 000000000..e95125a12 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_dripleaf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/small_dripleaf" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smithing_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smithing_table.json new file mode 100644 index 000000000..4e3e7f1f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smithing_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smithing_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smoker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smoker.json new file mode 100644 index 000000000..2d0f5cdcb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smoker.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smoker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_basalt.json new file mode 100644 index 000000000..7700ef6ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_basalt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_basalt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz.json new file mode 100644 index 000000000..cac9ae924 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_slab.json new file mode 100644 index 000000000..ec9645011 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_quartz_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_stairs.json new file mode 100644 index 000000000..ab1bf7303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_quartz_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone.json new file mode 100644 index 000000000..7f06dab46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_slab.json new file mode 100644 index 000000000..292247fa6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_red_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_stairs.json new file mode 100644 index 000000000..048905e01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_red_sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone.json new file mode 100644 index 000000000..8fca13622 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_slab.json new file mode 100644 index 000000000..23348d0df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_stairs.json new file mode 100644 index 000000000..9222c1549 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone.json new file mode 100644 index 000000000..5b3ef2dd3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone_slab.json new file mode 100644 index 000000000..fd1c9d9c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_stone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_egg.json new file mode 100644 index 000000000..675288c07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sniffer_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_spawn_egg.json new file mode 100644 index 000000000..2930eba92 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7922167 + }, + { + "type": "minecraft:constant", + "value": -14308496 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snort_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snort_pottery_sherd.json new file mode 100644 index 000000000..91e2e548c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snort_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/snort_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snout_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snout_armor_trim_smithing_template.json new file mode 100644 index 000000000..37b25e534 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snout_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/snout_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow.json new file mode 100644 index 000000000..532c74442 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/snow_height2" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_block.json new file mode 100644 index 000000000..b2bb073bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/snow_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_golem_spawn_egg.json new file mode 100644 index 000000000..cdf6accdd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_golem_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2493710 + }, + { + "type": "minecraft:constant", + "value": -8280924 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snowball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snowball.json new file mode 100644 index 000000000..d33a77a4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snowball.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/snowball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_campfire.json new file mode 100644 index 000000000..e6bc30427 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_campfire.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/soul_campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_lantern.json new file mode 100644 index 000000000..5798a9a93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/soul_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_sand.json new file mode 100644 index 000000000..8101cb3c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/soul_sand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_soil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_soil.json new file mode 100644 index 000000000..2345c55ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_soil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/soul_soil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_torch.json new file mode 100644 index 000000000..530bfc4fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_torch.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/soul_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spawner.json new file mode 100644 index 000000000..6064177a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spawner.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spawner" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spectral_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spectral_arrow.json new file mode 100644 index 000000000..92b39e7e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spectral_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spectral_arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_eye.json new file mode 100644 index 000000000..2e5832c27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_eye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_spawn_egg.json new file mode 100644 index 000000000..2ea93aa46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13357785 + }, + { + "type": "minecraft:constant", + "value": -5763570 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spire_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spire_armor_trim_smithing_template.json new file mode 100644 index 000000000..c0ced75d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spire_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spire_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/splash_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/splash_potion.json new file mode 100644 index 000000000..7fa6e714d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/splash_potion.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/splash_potion", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sponge.json new file mode 100644 index 000000000..c60720eec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sponge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sponge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spore_blossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spore_blossom.json new file mode 100644 index 000000000..7e9cc6e76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spore_blossom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spore_blossom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_boat.json new file mode 100644 index 000000000..59d057265 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_button.json new file mode 100644 index 000000000..dd3c78eb0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_chest_boat.json new file mode 100644 index 000000000..89dbfdeb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_door.json new file mode 100644 index 000000000..dda164c24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence.json new file mode 100644 index 000000000..22837ca46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence_gate.json new file mode 100644 index 000000000..539e3b6bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_hanging_sign.json new file mode 100644 index 000000000..a2ccee41e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_leaves.json new file mode 100644 index 000000000..48be842cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -10380959 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_log.json new file mode 100644 index 000000000..f106ea3cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_planks.json new file mode 100644 index 000000000..bda83bc8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_pressure_plate.json new file mode 100644 index 000000000..2a85b4fe0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sapling.json new file mode 100644 index 000000000..ad926af2d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sign.json new file mode 100644 index 000000000..e4c5355c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_slab.json new file mode 100644 index 000000000..1f398c162 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_stairs.json new file mode 100644 index 000000000..7282b434e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_trapdoor.json new file mode 100644 index 000000000..1aed97732 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_wood.json new file mode 100644 index 000000000..c7f5f46f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spyglass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spyglass.json new file mode 100644 index 000000000..91bbd8485 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spyglass.json @@ -0,0 +1,23 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spyglass" + }, + "when": [ + "gui", + "ground", + "fixed" + ] + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/spyglass_in_hand" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/squid_spawn_egg.json new file mode 100644 index 000000000..ad34e5908 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/squid_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -14533811 + }, + { + "type": "minecraft:constant", + "value": -9402215 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stick.json new file mode 100644 index 000000000..d2e5fd07e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sticky_piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sticky_piston.json new file mode 100644 index 000000000..7d62c70d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sticky_piston.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sticky_piston_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone.json new file mode 100644 index 000000000..f5c9f2a0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_axe.json new file mode 100644 index 000000000..439896b14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_slab.json new file mode 100644 index 000000000..470cba9e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_stairs.json new file mode 100644 index 000000000..a80ee9645 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_wall.json new file mode 100644 index 000000000..1690e1d7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_bricks.json new file mode 100644 index 000000000..a61dd731d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_button.json new file mode 100644 index 000000000..fe492729d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_hoe.json new file mode 100644 index 000000000..c9aa4f301 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pickaxe.json new file mode 100644 index 000000000..43c464967 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pressure_plate.json new file mode 100644 index 000000000..eed8e4d58 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_shovel.json new file mode 100644 index 000000000..83c3f305e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_slab.json new file mode 100644 index 000000000..277a59287 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_stairs.json new file mode 100644 index 000000000..16adbff01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_sword.json new file mode 100644 index 000000000..7213642ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stonecutter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stonecutter.json new file mode 100644 index 000000000..cd72ad0e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stonecutter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stonecutter" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stray_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stray_spawn_egg.json new file mode 100644 index 000000000..af04df236 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stray_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10389897 + }, + { + "type": "minecraft:constant", + "value": -2233622 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/strider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/strider_spawn_egg.json new file mode 100644 index 000000000..807fdf823 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/strider_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6540234 + }, + { + "type": "minecraft:constant", + "value": -11712179 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/string.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/string.json new file mode 100644 index 000000000..8f748c80f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/string.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/string" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_log.json new file mode 100644 index 000000000..6c34eef11 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_acacia_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_wood.json new file mode 100644 index 000000000..34e2ee6dd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_acacia_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_bamboo_block.json new file mode 100644 index 000000000..4cabea36f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_bamboo_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_bamboo_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_log.json new file mode 100644 index 000000000..c99a9a8ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_birch_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_wood.json new file mode 100644 index 000000000..80f86c85f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_birch_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_log.json new file mode 100644 index 000000000..47cde5ccc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_cherry_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_wood.json new file mode 100644 index 000000000..daefe8eee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_cherry_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_hyphae.json new file mode 100644 index 000000000..5cf344efd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_crimson_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_stem.json new file mode 100644 index 000000000..96e913a1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_crimson_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_log.json new file mode 100644 index 000000000..b84166629 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_dark_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_wood.json new file mode 100644 index 000000000..f673458ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_dark_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_log.json new file mode 100644 index 000000000..1e1a81bcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_jungle_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_wood.json new file mode 100644 index 000000000..79a560935 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_jungle_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_log.json new file mode 100644 index 000000000..ad55c4071 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_wood.json new file mode 100644 index 000000000..a9316c1a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_mangrove_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_log.json new file mode 100644 index 000000000..9f4bf5847 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_wood.json new file mode 100644 index 000000000..7ad322144 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_log.json new file mode 100644 index 000000000..0446e2813 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_pale_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_wood.json new file mode 100644 index 000000000..109ad1aca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_pale_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_log.json new file mode 100644 index 000000000..cdd2f2928 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_spruce_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_wood.json new file mode 100644 index 000000000..28cf5b63d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_spruce_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_hyphae.json new file mode 100644 index 000000000..4e814822d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_warped_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_stem.json new file mode 100644 index 000000000..e3bbcec35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_warped_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_block.json new file mode 100644 index 000000000..bf984362f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/structure_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_void.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_void.json new file mode 100644 index 000000000..806791166 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_void.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/structure_void" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar.json new file mode 100644 index 000000000..8a2ac1f02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sugar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar_cane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar_cane.json new file mode 100644 index 000000000..fcffd263b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar_cane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sugar_cane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sunflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sunflower.json new file mode 100644 index 000000000..db77a8cb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sunflower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sunflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_gravel.json new file mode 100644 index 000000000..a2ae98d8b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_gravel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/suspicious_gravel_0" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_sand.json new file mode 100644 index 000000000..d1e5b53ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/suspicious_sand_0" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_stew.json new file mode 100644 index 000000000..39814c701 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_stew.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/suspicious_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sweet_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sweet_berries.json new file mode 100644 index 000000000..abce325f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sweet_berries.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sweet_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_bucket.json new file mode 100644 index 000000000..6a3f1f5c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tadpole_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_spawn_egg.json new file mode 100644 index 000000000..1a2306bfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9612483 + }, + { + "type": "minecraft:constant", + "value": -15332864 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tall_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tall_grass.json new file mode 100644 index 000000000..8e524c317 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tall_grass.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tall_grass", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/target.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/target.json new file mode 100644 index 000000000..06200fd8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/target.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/target" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/terracotta.json new file mode 100644 index 000000000..690ee8153 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tide_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tide_armor_trim_smithing_template.json new file mode 100644 index 000000000..a4578f21b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tide_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tide_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tinted_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tinted_glass.json new file mode 100644 index 000000000..9a56958c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tinted_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tinted_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tipped_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tipped_arrow.json new file mode 100644 index 000000000..77ba8aa89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tipped_arrow.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tipped_arrow", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt.json new file mode 100644 index 000000000..ed41988a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tnt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt_minecart.json new file mode 100644 index 000000000..f390cb9bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tnt_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torch.json new file mode 100644 index 000000000..44a5efb9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torch.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower.json new file mode 100644 index 000000000..aeb1619c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/torchflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower_seeds.json new file mode 100644 index 000000000..d8ad414e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/torchflower_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/totem_of_undying.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/totem_of_undying.json new file mode 100644 index 000000000..e1844f63a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/totem_of_undying.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/totem_of_undying" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trader_llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trader_llama_spawn_egg.json new file mode 100644 index 000000000..717eda548 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trader_llama_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1399760 + }, + { + "type": "minecraft:constant", + "value": -12229994 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trapped_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trapped_chest.json new file mode 100644 index 000000000..bac5cdb57 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trapped_chest.json @@ -0,0 +1,32 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:special", + "base": "minecraft:item/trapped_chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:christmas" + } + }, + "when": [ + "12-24", + "12-25", + "12-26" + ] + } + ], + "fallback": { + "type": "minecraft:special", + "base": "minecraft:item/trapped_chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:trapped" + } + }, + "pattern": "MM-dd", + "property": "minecraft:local_time" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_key.json new file mode 100644 index 000000000..3a34cbaf4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_key.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_spawner.json new file mode 100644 index 000000000..809b44605 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_spawner.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/trial_spawner" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trident.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trident.json new file mode 100644 index 000000000..9f6c47801 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trident.json @@ -0,0 +1,37 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/trident" + }, + "when": [ + "gui", + "ground", + "fixed" + ] + } + ], + "fallback": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:special", + "base": "minecraft:item/trident_in_hand", + "model": { + "type": "minecraft:trident" + } + }, + "on_true": { + "type": "minecraft:special", + "base": "minecraft:item/trident_throwing", + "model": { + "type": "minecraft:trident" + } + }, + "property": "minecraft:using_item" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tripwire_hook.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tripwire_hook.json new file mode 100644 index 000000000..f9bf5abd9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tripwire_hook.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tripwire_hook" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish.json new file mode 100644 index 000000000..26f2f487a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tropical_fish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_bucket.json new file mode 100644 index 000000000..2db713646 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tropical_fish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_spawn_egg.json new file mode 100644 index 000000000..f0966e936 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1087211 + }, + { + "type": "minecraft:constant", + "value": -1553 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral.json new file mode 100644 index 000000000..931087805 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_block.json new file mode 100644 index 000000000..790d51d29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tube_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_fan.json new file mode 100644 index 000000000..6159f2630 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff.json new file mode 100644 index 000000000..610c254a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_slab.json new file mode 100644 index 000000000..0cdb4823b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_stairs.json new file mode 100644 index 000000000..378136c35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_wall.json new file mode 100644 index 000000000..7ce468095 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_bricks.json new file mode 100644 index 000000000..2d4f32e64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_slab.json new file mode 100644 index 000000000..abd0a96ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_stairs.json new file mode 100644 index 000000000..7011809e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_wall.json new file mode 100644 index 000000000..886b4bcbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_egg.json new file mode 100644 index 000000000..fc91fe7d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_helmet.json new file mode 100644 index 000000000..5fa761e95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_scute.json new file mode 100644 index 000000000..9c2501507 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_scute.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_spawn_egg.json new file mode 100644 index 000000000..1f072089b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1579033 + }, + { + "type": "minecraft:constant", + "value": -16732241 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/twisting_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/twisting_vines.json new file mode 100644 index 000000000..53aa26dde --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/twisting_vines.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/twisting_vines" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vault.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vault.json new file mode 100644 index 000000000..822f3d249 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vault.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/vault" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/verdant_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/verdant_froglight.json new file mode 100644 index 000000000..78844215c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/verdant_froglight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/verdant_froglight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_armor_trim_smithing_template.json new file mode 100644 index 000000000..59c22037c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/vex_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_spawn_egg.json new file mode 100644 index 000000000..4a941b7d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -8744796 + }, + { + "type": "minecraft:constant", + "value": -1511951 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/villager_spawn_egg.json new file mode 100644 index 000000000..c8b680aa7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/villager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11125709 + }, + { + "type": "minecraft:constant", + "value": -4355214 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vindicator_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vindicator_spawn_egg.json new file mode 100644 index 000000000..f60cf9d95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vindicator_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6972517 + }, + { + "type": "minecraft:constant", + "value": -14197151 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vine.json new file mode 100644 index 000000000..e13000c14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vine.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/vine", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wandering_trader_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wandering_trader_spawn_egg.json new file mode 100644 index 000000000..0e6d1b5fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wandering_trader_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -12229994 + }, + { + "type": "minecraft:constant", + "value": -1399760 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ward_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ward_armor_trim_smithing_template.json new file mode 100644 index 000000000..c329bccc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ward_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ward_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warden_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warden_spawn_egg.json new file mode 100644 index 000000000..c51f0f271 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warden_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15776183 + }, + { + "type": "minecraft:constant", + "value": -12986656 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_button.json new file mode 100644 index 000000000..aa659e22d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_door.json new file mode 100644 index 000000000..dbeece427 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence.json new file mode 100644 index 000000000..815eacdb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence_gate.json new file mode 100644 index 000000000..e572057d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus.json new file mode 100644 index 000000000..085c1e25b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus_on_a_stick.json new file mode 100644 index 000000000..678bf6260 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_fungus_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hanging_sign.json new file mode 100644 index 000000000..f823655b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hyphae.json new file mode 100644 index 000000000..cb3ab3d20 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_nylium.json new file mode 100644 index 000000000..a96277878 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_nylium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_nylium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_planks.json new file mode 100644 index 000000000..25e02f2fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_pressure_plate.json new file mode 100644 index 000000000..13d620762 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_roots.json new file mode 100644 index 000000000..f9e0e5d0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_sign.json new file mode 100644 index 000000000..c8a6a9522 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_slab.json new file mode 100644 index 000000000..bcde31a96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stairs.json new file mode 100644 index 000000000..9d6eff56f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stem.json new file mode 100644 index 000000000..6766888db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_trapdoor.json new file mode 100644 index 000000000..f3a05d243 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_wart_block.json new file mode 100644 index 000000000..cd1c64082 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_wart_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_wart_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/water_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/water_bucket.json new file mode 100644 index 000000000..0a6169595 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/water_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/water_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_chiseled_copper.json new file mode 100644 index 000000000..99d4996d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_block.json new file mode 100644 index 000000000..5060ed21a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_bulb.json new file mode 100644 index 000000000..feafbf2c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_door.json new file mode 100644 index 000000000..6bc75ee4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_grate.json new file mode 100644 index 000000000..7d9789bce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_trapdoor.json new file mode 100644 index 000000000..03981dc9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper.json new file mode 100644 index 000000000..69a734c6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_slab.json new file mode 100644 index 000000000..1f8c61975 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_stairs.json new file mode 100644 index 000000000..d63128c1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_chiseled_copper.json new file mode 100644 index 000000000..22657b6a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper.json new file mode 100644 index 000000000..632da6748 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_bulb.json new file mode 100644 index 000000000..d54e63062 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_door.json new file mode 100644 index 000000000..0ca6e2ca8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/exposed_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_grate.json new file mode 100644 index 000000000..07c561b46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_trapdoor.json new file mode 100644 index 000000000..260b680ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper.json new file mode 100644 index 000000000..35932366f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_slab.json new file mode 100644 index 000000000..818f88602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_stairs.json new file mode 100644 index 000000000..54f5c1f06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_chiseled_copper.json new file mode 100644 index 000000000..78b7eae05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper.json new file mode 100644 index 000000000..c58b7f62d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_bulb.json new file mode 100644 index 000000000..aeab2c8ce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_door.json new file mode 100644 index 000000000..b5cc84d31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oxidized_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_grate.json new file mode 100644 index 000000000..90d2a4833 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_trapdoor.json new file mode 100644 index 000000000..245f08ef9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper.json new file mode 100644 index 000000000..ec0748d35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_slab.json new file mode 100644 index 000000000..3e15eec78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..7fd0b7f0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_chiseled_copper.json new file mode 100644 index 000000000..f046852be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper.json new file mode 100644 index 000000000..75710bc9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_bulb.json new file mode 100644 index 000000000..5866e1d36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_door.json new file mode 100644 index 000000000..4ec7f82f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/weathered_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_grate.json new file mode 100644 index 000000000..c23ee2247 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_trapdoor.json new file mode 100644 index 000000000..d09a144f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper.json new file mode 100644 index 000000000..15a90ec84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_slab.json new file mode 100644 index 000000000..0084def1c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_stairs.json new file mode 100644 index 000000000..2050ef4d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wayfinder_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wayfinder_armor_trim_smithing_template.json new file mode 100644 index 000000000..cd3ba959e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wayfinder_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wayfinder_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_chiseled_copper.json new file mode 100644 index 000000000..f046852be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper.json new file mode 100644 index 000000000..75710bc9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_bulb.json new file mode 100644 index 000000000..5866e1d36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_door.json new file mode 100644 index 000000000..4ec7f82f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/weathered_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_grate.json new file mode 100644 index 000000000..c23ee2247 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_trapdoor.json new file mode 100644 index 000000000..d09a144f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper.json new file mode 100644 index 000000000..15a90ec84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_slab.json new file mode 100644 index 000000000..0084def1c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_stairs.json new file mode 100644 index 000000000..2050ef4d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weeping_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weeping_vines.json new file mode 100644 index 000000000..3f169a7a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weeping_vines.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/weeping_vines" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wet_sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wet_sponge.json new file mode 100644 index 000000000..7e33cdd24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wet_sponge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/wet_sponge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat.json new file mode 100644 index 000000000..f4fb4b7b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wheat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat_seeds.json new file mode 100644 index 000000000..8ae464744 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wheat_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_banner.json new file mode 100644 index 000000000..f87b23e99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "white" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bed.json new file mode 100644 index 000000000..7e3aa0062 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/white_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:white" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bundle.json new file mode 100644 index 000000000..05c547aff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_candle.json new file mode 100644 index 000000000..6d60a581e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_carpet.json new file mode 100644 index 000000000..d56e7f94a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete.json new file mode 100644 index 000000000..822c0565d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete_powder.json new file mode 100644 index 000000000..56e5f7630 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_dye.json new file mode 100644 index 000000000..2684014af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_glazed_terracotta.json new file mode 100644 index 000000000..5cb0220c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_shulker_box.json new file mode 100644 index 000000000..3e4d8e80b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/white_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_white" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass.json new file mode 100644 index 000000000..ae78ae28a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass_pane.json new file mode 100644 index 000000000..72f6e6064 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_terracotta.json new file mode 100644 index 000000000..af76a0785 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_tulip.json new file mode 100644 index 000000000..d56307a2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_wool.json new file mode 100644 index 000000000..709d4843b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wild_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wild_armor_trim_smithing_template.json new file mode 100644 index 000000000..37b2bf40c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wild_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wild_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wind_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wind_charge.json new file mode 100644 index 000000000..b9f3a0631 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wind_charge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wind_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/witch_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/witch_spawn_egg.json new file mode 100644 index 000000000..cf62f2ba7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/witch_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13369344 + }, + { + "type": "minecraft:constant", + "value": -11427778 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_rose.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_rose.json new file mode 100644 index 000000000..558c37f75 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_rose.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wither_rose" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_skull.json new file mode 100644 index 000000000..67302cdab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_skull.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "wither_skeleton" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_spawn_egg.json new file mode 100644 index 000000000..b59dd39d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15461356 + }, + { + "type": "minecraft:constant", + "value": -12104371 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_spawn_egg.json new file mode 100644 index 000000000..c4081fb5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15461356 + }, + { + "type": "minecraft:constant", + "value": -11701600 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_armor.json new file mode 100644 index 000000000..443cc9533 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_armor.json @@ -0,0 +1,25 @@ +{ + "model": { + "type": "minecraft:condition", + "component": "minecraft:dyed_color", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/wolf_armor" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/wolf_armor_dyed", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:dye", + "default": 0 + } + ] + }, + "property": "minecraft:has_component" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_spawn_egg.json new file mode 100644 index 000000000..665280786 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2632749 + }, + { + "type": "minecraft:constant", + "value": -3231850 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_axe.json new file mode 100644 index 000000000..1794004d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_hoe.json new file mode 100644 index 000000000..33fa0070a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_pickaxe.json new file mode 100644 index 000000000..353c33e08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_shovel.json new file mode 100644 index 000000000..5fbb6c685 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_sword.json new file mode 100644 index 000000000..aacc2b943 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/writable_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/writable_book.json new file mode 100644 index 000000000..6cea1bd9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/writable_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/writable_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/written_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/written_book.json new file mode 100644 index 000000000..e49699a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/written_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/written_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_banner.json new file mode 100644 index 000000000..1acffce44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "yellow" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bed.json new file mode 100644 index 000000000..184bfe999 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/yellow_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:yellow" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bundle.json new file mode 100644 index 000000000..d37eca641 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_candle.json new file mode 100644 index 000000000..5ed2d61e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_carpet.json new file mode 100644 index 000000000..2f270df8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete.json new file mode 100644 index 000000000..c55b15f19 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete_powder.json new file mode 100644 index 000000000..839a491d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_dye.json new file mode 100644 index 000000000..a56a986b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_glazed_terracotta.json new file mode 100644 index 000000000..3da8eb40d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_shulker_box.json new file mode 100644 index 000000000..bd78cb729 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/yellow_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_yellow" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass.json new file mode 100644 index 000000000..e4f6432a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass_pane.json new file mode 100644 index 000000000..bf3c03375 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_terracotta.json new file mode 100644 index 000000000..411c0705a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_wool.json new file mode 100644 index 000000000..7e1fa9539 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zoglin_spawn_egg.json new file mode 100644 index 000000000..2c7633288 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zoglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3772843 + }, + { + "type": "minecraft:constant", + "value": -1644826 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_head.json new file mode 100644 index 000000000..f30d13bb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "zombie" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_horse_spawn_egg.json new file mode 100644 index 000000000..142a150eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_horse_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13544908 + }, + { + "type": "minecraft:constant", + "value": -6831484 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_spawn_egg.json new file mode 100644 index 000000000..eb8b35cbd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -16732241 + }, + { + "type": "minecraft:constant", + "value": -8807323 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_villager_spawn_egg.json new file mode 100644 index 000000000..f351c001f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_villager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11125709 + }, + { + "type": "minecraft:constant", + "value": -8807323 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombified_piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombified_piglin_spawn_egg.json new file mode 100644 index 000000000..9be3d478a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombified_piglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1404013 + }, + { + "type": "minecraft:constant", + "value": -11767511 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/mappings.yml b/bukkit-loader/src/main/resources/mappings.yml new file mode 100644 index 000000000..48f5687c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/mappings.yml @@ -0,0 +1,2020 @@ +######################################################################################################################################################################################################################## +# Mushroom Block +#minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +#minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +#minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +######################################################################################################################################################################################################################## +# Kelp +#minecraft:kelp[age=0]: minecraft:kelp[age=0]# +minecraft:kelp[age=1]: minecraft:kelp[age=0] +minecraft:kelp[age=2]: minecraft:kelp[age=0] +minecraft:kelp[age=3]: minecraft:kelp[age=0] +minecraft:kelp[age=4]: minecraft:kelp[age=0] +minecraft:kelp[age=5]: minecraft:kelp[age=0] +minecraft:kelp[age=6]: minecraft:kelp[age=0] +minecraft:kelp[age=7]: minecraft:kelp[age=0] +minecraft:kelp[age=8]: minecraft:kelp[age=0] +minecraft:kelp[age=9]: minecraft:kelp[age=0] +minecraft:kelp[age=10]: minecraft:kelp[age=0] +minecraft:kelp[age=11]: minecraft:kelp[age=0] +minecraft:kelp[age=12]: minecraft:kelp[age=0] +minecraft:kelp[age=13]: minecraft:kelp[age=0] +minecraft:kelp[age=14]: minecraft:kelp[age=0] +minecraft:kelp[age=15]: minecraft:kelp[age=0] +minecraft:kelp[age=16]: minecraft:kelp[age=0] +minecraft:kelp[age=17]: minecraft:kelp[age=0] +minecraft:kelp[age=18]: minecraft:kelp[age=0] +minecraft:kelp[age=19]: minecraft:kelp[age=0] +minecraft:kelp[age=20]: minecraft:kelp[age=0] +minecraft:kelp[age=21]: minecraft:kelp[age=0] +minecraft:kelp[age=22]: minecraft:kelp[age=0] +minecraft:kelp[age=23]: minecraft:kelp[age=0] +minecraft:kelp[age=24]: minecraft:kelp[age=0] +minecraft:kelp[age=25]: minecraft:kelp[age=0] +######################################################################################################################################################################################################################## +# Weeping Vines +#minecraft:weeping_vines[age=0]: minecraft:weeping_vines[age=0]# +minecraft:weeping_vines[age=1]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=2]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=3]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=4]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=5]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=6]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=7]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=8]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=9]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=10]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=11]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=12]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=13]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=14]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=15]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=16]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=17]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=18]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=19]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=20]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=21]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=22]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=23]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=24]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=25]: minecraft:weeping_vines[age=0] +######################################################################################################################################################################################################################## +# Twisting Vines +#minecraft:twisting_vines[age=0]: minecraft:twisting_vines[age=0]# +minecraft:twisting_vines[age=1]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=2]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=3]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=4]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=5]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=6]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=7]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=8]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=9]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=10]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=11]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=12]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=13]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=14]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=15]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=16]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=17]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=18]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=19]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=20]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=21]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=22]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=23]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=24]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=25]: minecraft:twisting_vines[age=0] +######################################################################################################################################################################################################################## +# Cave Vines +#minecraft:cave_vines[age=0,berries=false]: minecraft:cave_vines[age=0,berries=false]# +minecraft:cave_vines[age=1,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=2,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=3,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=4,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=5,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=6,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=7,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=8,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=9,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=10,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=11,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=12,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=13,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=14,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=15,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=16,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=17,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=18,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=19,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=20,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=21,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=22,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=23,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=24,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=25,berries=false]: minecraft:cave_vines[age=0,berries=false] +#minecraft:cave_vines[age=0,berries=true]: minecraft:cave_vines[age=0,berries=true]# +minecraft:cave_vines[age=1,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=2,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=3,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=4,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=5,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=6,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=7,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=8,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=9,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=10,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=11,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=12,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=13,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=14,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=15,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=16,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=17,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=18,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=19,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=20,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=21,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=22,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=23,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=24,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=25,berries=true]: minecraft:cave_vines[age=0,berries=true] +######################################################################################################################################################################################################################## +# SugarCane +#minecraft:sugar_cane[age=0]: minecraft:sugar_cane[age=0]# +minecraft:sugar_cane[age=1]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=2]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=3]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=4]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=5]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=6]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=7]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=8]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=9]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=10]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=11]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=12]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=13]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=14]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=15]: minecraft:sugar_cane[age=0] +######################################################################################################################################################################################################################## +# Leaves +minecraft:oak_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:oak_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:birch_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:birch_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:cherry_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:cherry_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true]# + +# You can enable this if you are running 1.21.4+ +#minecraft:pale_oak_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +##minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false]# +#minecraft:pale_oak_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +##minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true]# + +######################################################################################################################################################################################################################## +# Tripwire +#minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true]# +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +######################################################################################################################################################################################################################## +# Chorus Plant +#minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +######################################################################################################################################################################################################################## +# Note Block +#minecraft:note_block[instrument=harp,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false]# +#minecraft:note_block[instrument=harp,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false]# +#minecraft:note_block[instrument=harp,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false]# +#minecraft:note_block[instrument=harp,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false]# +#minecraft:note_block[instrument=harp,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false]# +#minecraft:note_block[instrument=harp,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false]# +#minecraft:note_block[instrument=harp,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false]# +#minecraft:note_block[instrument=harp,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false]# +#minecraft:note_block[instrument=harp,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false]# +#minecraft:note_block[instrument=harp,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false]# +#minecraft:note_block[instrument=harp,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false]# +#minecraft:note_block[instrument=harp,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false]# +#minecraft:note_block[instrument=harp,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false]# +#minecraft:note_block[instrument=harp,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false]# +#minecraft:note_block[instrument=harp,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false]# +#minecraft:note_block[instrument=harp,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false]# +#minecraft:note_block[instrument=harp,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false]# +#minecraft:note_block[instrument=harp,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false]# +#minecraft:note_block[instrument=harp,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false]# +#minecraft:note_block[instrument=harp,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false]# +#minecraft:note_block[instrument=harp,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false]# +#minecraft:note_block[instrument=harp,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false]# +#minecraft:note_block[instrument=harp,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false]# +#minecraft:note_block[instrument=harp,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false]# +#minecraft:note_block[instrument=harp,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false]# +#minecraft:note_block[instrument=harp,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true]# +#minecraft:note_block[instrument=harp,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true]# +#minecraft:note_block[instrument=harp,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true]# +#minecraft:note_block[instrument=harp,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true]# +#minecraft:note_block[instrument=harp,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true]# +#minecraft:note_block[instrument=harp,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true]# +#minecraft:note_block[instrument=harp,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true]# +#minecraft:note_block[instrument=harp,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true]# +#minecraft:note_block[instrument=harp,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true]# +#minecraft:note_block[instrument=harp,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true]# +#minecraft:note_block[instrument=harp,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true]# +#minecraft:note_block[instrument=harp,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true]# +#minecraft:note_block[instrument=harp,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true]# +#minecraft:note_block[instrument=harp,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true]3 +#minecraft:note_block[instrument=harp,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true]# +#minecraft:note_block[instrument=harp,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true]# +#minecraft:note_block[instrument=harp,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true]# +#minecraft:note_block[instrument=harp,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true]# +#minecraft:note_block[instrument=harp,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true]# +#minecraft:note_block[instrument=harp,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true]# +#minecraft:note_block[instrument=harp,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true]# +#minecraft:note_block[instrument=harp,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true]# +#minecraft:note_block[instrument=harp,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true]# +#minecraft:note_block[instrument=harp,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true]# +#minecraft:note_block[instrument=harp,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true]# +minecraft:note_block[instrument=hat,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=hat,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=hat,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=hat,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=hat,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=hat,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=hat,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=hat,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=hat,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=hat,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=hat,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=hat,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=hat,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=hat,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=hat,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=hat,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=hat,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=hat,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=hat,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=hat,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=hat,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=hat,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=hat,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=hat,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=hat,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=hat,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=hat,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=hat,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=hat,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=hat,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=hat,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=hat,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=hat,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=hat,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=hat,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=hat,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=hat,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=hat,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=hat,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=hat,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=hat,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=hat,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=hat,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=hat,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=hat,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=hat,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=hat,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=hat,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=hat,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=hat,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=basedrum,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=basedrum,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=basedrum,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=basedrum,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=basedrum,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=basedrum,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=basedrum,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=basedrum,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=basedrum,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=basedrum,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=basedrum,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=basedrum,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=basedrum,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=basedrum,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=basedrum,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=basedrum,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=basedrum,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=basedrum,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=basedrum,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=basedrum,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=basedrum,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=basedrum,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=basedrum,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=basedrum,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=basedrum,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=basedrum,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=basedrum,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=basedrum,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=basedrum,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=basedrum,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=basedrum,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=basedrum,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=basedrum,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=basedrum,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=basedrum,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=basedrum,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=basedrum,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=basedrum,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=basedrum,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=basedrum,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=basedrum,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=basedrum,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=basedrum,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=basedrum,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=basedrum,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=basedrum,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=basedrum,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=basedrum,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=basedrum,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=basedrum,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=snare,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=snare,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=snare,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=snare,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=snare,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=snare,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=snare,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=snare,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=snare,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=snare,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=snare,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=snare,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=snare,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=snare,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=snare,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=snare,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=snare,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=snare,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=snare,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=snare,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=snare,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=snare,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=snare,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=snare,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=snare,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=snare,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=snare,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=snare,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=snare,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=snare,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=snare,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=snare,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=snare,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=snare,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=snare,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=snare,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=snare,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=snare,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=snare,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=snare,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=snare,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=snare,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=snare,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=snare,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=snare,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=snare,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=snare,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=snare,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=snare,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=snare,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=bass,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=bass,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=bass,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=bass,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=bass,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=bass,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=bass,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=bass,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=bass,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=bass,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=bass,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=bass,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=bass,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=bass,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=bass,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=bass,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=bass,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=bass,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=bass,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=bass,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=bass,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=bass,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=bass,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=bass,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=bass,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=bass,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=bass,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=bass,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=bass,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=bass,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=bass,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=bass,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=bass,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=bass,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=bass,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=bass,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=bass,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=bass,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=bass,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=bass,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=bass,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=bass,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=bass,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=bass,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=bass,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=bass,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=bass,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=bass,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=bass,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=bass,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=flute,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=flute,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=flute,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=flute,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=flute,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=flute,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=flute,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=flute,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=flute,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=flute,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=flute,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=flute,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=flute,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=flute,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=flute,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=flute,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=flute,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=flute,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=flute,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=flute,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=flute,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=flute,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=flute,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=flute,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=flute,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=flute,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=flute,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=flute,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=flute,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=flute,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=flute,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=flute,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=flute,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=flute,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=flute,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=flute,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=flute,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=flute,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=flute,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=flute,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=flute,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=flute,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=flute,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=flute,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=flute,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=flute,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=flute,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=flute,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=flute,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=flute,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=bell,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=bell,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=bell,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=bell,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=bell,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=bell,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=bell,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=bell,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=bell,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=bell,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=bell,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=bell,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=bell,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=bell,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=bell,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=bell,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=bell,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=bell,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=bell,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=bell,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=bell,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=bell,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=bell,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=bell,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=bell,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=bell,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=bell,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=bell,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=bell,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=bell,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=bell,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=bell,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=bell,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=bell,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=bell,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=bell,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=bell,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=bell,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=bell,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=bell,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=bell,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=bell,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=bell,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=bell,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=bell,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=bell,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=bell,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=bell,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=bell,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=bell,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=guitar,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=guitar,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=guitar,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=guitar,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=guitar,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=guitar,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=guitar,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=guitar,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=guitar,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=guitar,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=guitar,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=guitar,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=guitar,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=guitar,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=guitar,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=guitar,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=guitar,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=guitar,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=guitar,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=guitar,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=guitar,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=guitar,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=guitar,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=guitar,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=guitar,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=guitar,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=guitar,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=guitar,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=guitar,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=guitar,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=guitar,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=guitar,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=guitar,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=guitar,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=guitar,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=guitar,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=guitar,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=guitar,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=guitar,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=guitar,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=guitar,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=guitar,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=guitar,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=guitar,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=guitar,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=guitar,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=guitar,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=guitar,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=guitar,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=guitar,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=chime,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=chime,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=chime,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=chime,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=chime,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=chime,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=chime,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=chime,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=chime,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=chime,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=chime,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=chime,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=chime,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=chime,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=chime,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=chime,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=chime,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=chime,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=chime,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=chime,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=chime,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=chime,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=chime,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=chime,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=chime,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=chime,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=chime,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=chime,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=chime,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=chime,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=chime,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=chime,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=chime,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=chime,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=chime,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=chime,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=chime,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=chime,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=chime,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=chime,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=chime,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=chime,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=chime,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=chime,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=chime,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=chime,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=chime,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=chime,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=chime,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=chime,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=xylophone,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=xylophone,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=xylophone,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=xylophone,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=xylophone,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=xylophone,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=xylophone,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=xylophone,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=xylophone,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=xylophone,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=xylophone,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=xylophone,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=xylophone,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=xylophone,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=xylophone,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=xylophone,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=xylophone,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=xylophone,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=xylophone,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=xylophone,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=xylophone,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=xylophone,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=xylophone,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=xylophone,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=xylophone,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=xylophone,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=xylophone,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=xylophone,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=xylophone,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=xylophone,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=xylophone,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=xylophone,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=xylophone,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=xylophone,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=xylophone,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=xylophone,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=xylophone,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=xylophone,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=xylophone,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=xylophone,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=xylophone,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=xylophone,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=xylophone,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=xylophone,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=xylophone,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=xylophone,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=xylophone,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=xylophone,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=xylophone,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=xylophone,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=cow_bell,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=cow_bell,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=cow_bell,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=cow_bell,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=cow_bell,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=cow_bell,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=cow_bell,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=cow_bell,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=cow_bell,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=cow_bell,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=cow_bell,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=cow_bell,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=cow_bell,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=cow_bell,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=cow_bell,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=cow_bell,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=cow_bell,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=cow_bell,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=cow_bell,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=cow_bell,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=cow_bell,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=cow_bell,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=cow_bell,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=cow_bell,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=cow_bell,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=cow_bell,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=cow_bell,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=cow_bell,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=cow_bell,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=cow_bell,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=cow_bell,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=cow_bell,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=cow_bell,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=cow_bell,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=cow_bell,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=cow_bell,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=cow_bell,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=cow_bell,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=cow_bell,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=cow_bell,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=cow_bell,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=cow_bell,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=cow_bell,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=cow_bell,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=cow_bell,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=cow_bell,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=cow_bell,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=cow_bell,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=cow_bell,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=cow_bell,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=didgeridoo,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=didgeridoo,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=didgeridoo,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=didgeridoo,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=didgeridoo,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=didgeridoo,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=didgeridoo,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=didgeridoo,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=didgeridoo,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=didgeridoo,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=didgeridoo,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=didgeridoo,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=didgeridoo,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=didgeridoo,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=didgeridoo,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=didgeridoo,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=didgeridoo,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=didgeridoo,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=didgeridoo,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=didgeridoo,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=didgeridoo,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=didgeridoo,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=didgeridoo,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=didgeridoo,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=didgeridoo,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=didgeridoo,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=didgeridoo,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=didgeridoo,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=didgeridoo,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=didgeridoo,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=didgeridoo,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=didgeridoo,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=didgeridoo,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=didgeridoo,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=didgeridoo,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=didgeridoo,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=didgeridoo,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=didgeridoo,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=didgeridoo,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=didgeridoo,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=didgeridoo,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=didgeridoo,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=didgeridoo,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=didgeridoo,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=didgeridoo,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=didgeridoo,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=didgeridoo,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=didgeridoo,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=didgeridoo,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=didgeridoo,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=bit,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=bit,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=bit,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=bit,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=bit,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=bit,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=bit,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=bit,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=bit,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=bit,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=bit,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=bit,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=bit,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=bit,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=bit,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=bit,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=bit,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=bit,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=bit,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=bit,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=bit,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=bit,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=bit,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=bit,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=bit,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=bit,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=bit,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=bit,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=bit,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=bit,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=bit,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=bit,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=bit,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=bit,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=bit,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=bit,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=bit,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=bit,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=bit,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=bit,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=bit,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=bit,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=bit,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=bit,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=bit,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=bit,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=bit,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=bit,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=bit,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=bit,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=banjo,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=banjo,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=banjo,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=banjo,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=banjo,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=banjo,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=banjo,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=banjo,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=banjo,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=banjo,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=banjo,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=banjo,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=banjo,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=banjo,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=banjo,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=banjo,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=banjo,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=banjo,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=banjo,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=banjo,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=banjo,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=banjo,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=banjo,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=banjo,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=banjo,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=banjo,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=banjo,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=banjo,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=banjo,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=banjo,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=banjo,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=banjo,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=banjo,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=banjo,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=banjo,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=banjo,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=banjo,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=banjo,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=banjo,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=banjo,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=banjo,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=banjo,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=banjo,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=banjo,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=banjo,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=banjo,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=banjo,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=banjo,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=banjo,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=banjo,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=pling,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=pling,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=pling,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=pling,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=pling,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=pling,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=pling,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=pling,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=pling,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=pling,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=pling,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=pling,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=pling,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=pling,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=pling,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=pling,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=pling,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=pling,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=pling,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=pling,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=pling,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=pling,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=pling,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=pling,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=pling,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=pling,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=pling,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=pling,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=pling,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=pling,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=pling,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=pling,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=pling,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=pling,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=pling,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=pling,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=pling,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=pling,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=pling,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=pling,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=pling,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=pling,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=pling,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=pling,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=pling,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=pling,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=pling,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=pling,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=pling,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=pling,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=zombie,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=zombie,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=zombie,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=zombie,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=zombie,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=zombie,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=zombie,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=zombie,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=zombie,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=zombie,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=zombie,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=zombie,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=zombie,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=zombie,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=zombie,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=zombie,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=zombie,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=zombie,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=zombie,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=zombie,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=zombie,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=zombie,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=zombie,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=zombie,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=zombie,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=zombie,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=zombie,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=zombie,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=zombie,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=zombie,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=zombie,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=zombie,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=zombie,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=zombie,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=zombie,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=zombie,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=zombie,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=zombie,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=zombie,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=zombie,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=zombie,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=zombie,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=zombie,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=zombie,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=zombie,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=zombie,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=zombie,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=zombie,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=zombie,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=zombie,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=skeleton,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=skeleton,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=skeleton,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=skeleton,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=skeleton,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=skeleton,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=skeleton,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=skeleton,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=skeleton,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=skeleton,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=skeleton,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=skeleton,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=skeleton,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=skeleton,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=skeleton,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=skeleton,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=skeleton,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=skeleton,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=skeleton,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=skeleton,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=skeleton,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=skeleton,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=skeleton,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=skeleton,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=skeleton,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=skeleton,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=skeleton,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=skeleton,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=skeleton,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=skeleton,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=skeleton,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=skeleton,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=skeleton,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=skeleton,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=skeleton,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=skeleton,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=skeleton,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=skeleton,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=skeleton,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=skeleton,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=skeleton,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=skeleton,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=skeleton,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=skeleton,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=skeleton,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=skeleton,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=skeleton,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=skeleton,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=skeleton,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=skeleton,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=creeper,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=creeper,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=creeper,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=creeper,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=creeper,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=creeper,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=creeper,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=creeper,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=creeper,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=creeper,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=creeper,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=creeper,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=creeper,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=creeper,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=creeper,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=creeper,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=creeper,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=creeper,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=creeper,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=creeper,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=creeper,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=creeper,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=creeper,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=creeper,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=creeper,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=creeper,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=creeper,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=creeper,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=creeper,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=creeper,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=creeper,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=creeper,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=creeper,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=creeper,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=creeper,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=creeper,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=creeper,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=creeper,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=creeper,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=creeper,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=creeper,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=creeper,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=creeper,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=creeper,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=creeper,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=creeper,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=creeper,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=creeper,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=creeper,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=creeper,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=dragon,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=dragon,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=dragon,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=dragon,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=dragon,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=dragon,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=dragon,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=dragon,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=dragon,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=dragon,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=dragon,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=dragon,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=dragon,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=dragon,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=dragon,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=dragon,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=dragon,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=dragon,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=dragon,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=dragon,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=dragon,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=dragon,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=dragon,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=dragon,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=dragon,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=dragon,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=dragon,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=dragon,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=dragon,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=dragon,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=dragon,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=dragon,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=dragon,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=dragon,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=dragon,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=dragon,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=dragon,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=dragon,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=dragon,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=dragon,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=dragon,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=dragon,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=dragon,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=dragon,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=dragon,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=dragon,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=dragon,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=dragon,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=dragon,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=dragon,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=piglin,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=piglin,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=piglin,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=piglin,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=piglin,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=piglin,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=piglin,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=piglin,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=piglin,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=piglin,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=piglin,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=piglin,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=piglin,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=piglin,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=piglin,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=piglin,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=piglin,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=piglin,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=piglin,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=piglin,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=piglin,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=piglin,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=piglin,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=piglin,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=piglin,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=piglin,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=piglin,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=piglin,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=piglin,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=piglin,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=piglin,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=piglin,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=piglin,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=piglin,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=piglin,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=piglin,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=piglin,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=piglin,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=piglin,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=piglin,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=piglin,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=piglin,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=piglin,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=piglin,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=piglin,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=piglin,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=piglin,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=piglin,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=piglin,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=piglin,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=custom_head,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=custom_head,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=custom_head,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=custom_head,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=custom_head,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=custom_head,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=custom_head,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=custom_head,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=custom_head,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=custom_head,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=custom_head,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=custom_head,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=custom_head,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=custom_head,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=custom_head,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=custom_head,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=custom_head,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=custom_head,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=custom_head,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=custom_head,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=custom_head,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=custom_head,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=custom_head,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=custom_head,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=custom_head,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=custom_head,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=custom_head,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=custom_head,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=custom_head,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=custom_head,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=custom_head,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=custom_head,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=custom_head,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=custom_head,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=custom_head,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=custom_head,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=custom_head,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=custom_head,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=custom_head,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=custom_head,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=custom_head,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=custom_head,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=custom_head,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=custom_head,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=custom_head,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=custom_head,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=custom_head,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=custom_head,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=custom_head,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=custom_head,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml b/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml new file mode 100644 index 000000000..a96cf2b0c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml @@ -0,0 +1,64 @@ +items: + default:fairy_flower: + material: paper + custom-model-data: 3000 + data: + display-name: "Fairy Flower" + model: + type: "minecraft:model" + path: "minecraft:item/custom/fairy_flower" + generation: + parent: "minecraft:item/generated" + textures: + "layer0": "minecraft:item/custom/fairy_flower" + behavior: + type: block_item + block: default:fairy_flower +blocks: + default:fairy_flower: + settings: + template: block_settings:surface_decoration + overrides: + item: default:fairy_flower + sounds: + break: minecraft:block.grass.break + step: minecraft:block.grass.step + place: minecraft:block.grass.place + hit: minecraft:block.grass.hit + fall: minecraft:block.grass.fall + behavior: + type: bush_block + loot: + template: loot_table:normal + arguments: + item: default:fairy_flower + state: + id: 0 + state: tripwire:0 + models: + - path: "minecraft:block/custom/fairy_flower_1" + weight: 100 + - path: "minecraft:block/custom/fairy_flower_2" + weight: 5 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_2" + - path: "minecraft:block/custom/fairy_flower_3" + weight: 5 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_3" + - path: "minecraft:block/custom/fairy_flower_4" + weight: 5 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_4" + - path: "minecraft:block/custom/fairy_flower_5" + weight: 1 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_5" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/furnitures.yml b/bukkit-loader/src/main/resources/resources/default/configuration/furnitures.yml new file mode 100644 index 000000000..0d011eb44 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/furnitures.yml @@ -0,0 +1,119 @@ +items: + default:bench: + material: paper + custom-model-data: 2000 + data: + display-name: "Bench" + model: + type: "minecraft:model" + path: "minecraft:item/custom/bench" + behavior: + type: furniture_item + sounds: + break: minecraft:block.bamboo_wood.break + place: minecraft:block.bamboo_wood.place + placement: + ground: + rules: + # ANY / FOUR / EIGHT / SIXTEEN / NORTH / EAST / WEST / SOUTH + rotation: EIGHT + # ANY / CENTER / HALF / QUARTER / CORNER + alignment: CENTER + elements: + - item: default:bench + display-transform: NONE + billboard: FIXED + position: 0.5,0,0 + translation: 0,0.5,0 + hitboxes: + - position: 0,0,0 + width: 1 + height: 1 + interactive: true + seats: + - 0,0,-0.1 0 + - position: 1,0,0 + width: 1 + height: 1 + interactive: true + seats: + - 1,0,-0.1 0 + loot: + template: loot_table:normal + arguments: + item: default:bench + default:table_lamp: + material: paper + custom-model-data: 2001 + data: + display-name: "Table Lamp" + model: + type: "minecraft:model" + path: "minecraft:item/custom/table_lamp" + behavior: + type: furniture_item + sounds: + break: minecraft:block.lantern.break + place: minecraft:block.lantern.place + placement: + ground: + rules: + rotation: ANY + alignment: QUARTER + elements: + - item: default:table_lamp + display-transform: NONE + billboard: FIXED + translation: 0,0.5,0 + rotation: -90 + hitboxes: + - position: 0,0,0 + width: 0.7 + height: 0.1 + interactive: true + - position: 0,0.1,0.1 + width: 0.1 + height: 0.6 + interactive: true + - position: 0,0.6,-0.15 + width: 0.4 + height: 0.4 + interactive: true + loot: + template: loot_table:normal + arguments: + item: default:table_lamp + default:wooden_chair: + material: paper + custom-model-data: 2002 + data: + display-name: "Wooden Chair" + model: + type: "minecraft:model" + path: "minecraft:item/custom/wooden_chair" + behavior: + type: furniture_item + sounds: + break: minecraft:block.bamboo_wood.break + place: minecraft:block.bamboo_wood.place + placement: + ground: + rules: + rotation: ANY + alignment: ANY + elements: + - item: default:wooden_chair + display-transform: NONE + billboard: FIXED + translation: 0,0.5,0 + hitboxes: + - position: 0,0,0 + width: 0.7 + height: 1.2 + interactive: true + seats: + - 0,0,-0.1 0 + loot: + template: loot_table:normal + arguments: + item: default:wooden_chair \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml b/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml new file mode 100644 index 000000000..d54812865 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml @@ -0,0 +1,9 @@ +images: + default:icons: + height: 10 + ascent: 9 + font: minecraft:icons + file: minecraft:font/image/icons.png + chars: + - '\ub000\ub001' + - '\ub002\ub003' \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/items.yml b/bukkit-loader/src/main/resources/resources/default/configuration/items.yml new file mode 100644 index 000000000..06c9a5553 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/items.yml @@ -0,0 +1,25 @@ +items: + default:beginner_rod: + material: fishing_rod + custom-model-data: 1000 + data: + display-name: "Beginner Rod" + lore: + - "This is the description" + model: + type: "minecraft:condition" + property: "minecraft:fishing_rod/cast" + on-false: + type: "minecraft:model" + path: "minecraft:item/custom/beginner_rod" + generation: + parent: "minecraft:item/fishing_rod" + textures: + "layer0": "minecraft:item/custom/beginner_rod" + on-true: + type: "minecraft:model" + path: "minecraft:item/custom/beginner_rod_cast" + generation: + parent: "minecraft:item/fishing_rod" + textures: + "layer0": "minecraft:item/custom/beginner_rod_cast" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml b/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml new file mode 100644 index 000000000..5181129ab --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml @@ -0,0 +1,79 @@ +items: + default:topaz_ore: + material: paper + custom-model-data: 1010 + data: + display-name: "Topaz Ore" + model: + type: "minecraft:model" + path: "minecraft:item/custom/topaz_ore" + generation: + parent: "minecraft:block/custom/topaz_ore" + behavior: + type: block_item + block: default:topaz_ore + default:deepslate_topaz_ore: + material: paper + custom-model-data: 1011 + data: + display-name: "Deepslate Topaz Ore" + model: + type: "minecraft:model" + path: "minecraft:item/custom/deepslate_topaz_ore" + generation: + parent: "minecraft:block/custom/deepslate_topaz_ore" + behavior: + type: block_item + block: default:deepslate_topaz_ore + default:topaz: + material: paper + custom-model-data: 1012 + data: + display-name: "Topaz" + model: + type: "minecraft:model" + path: "minecraft:item/custom/topaz" + generation: + parent: "minecraft:item/generated" + textures: + "layer0": "minecraft:item/custom/topaz" + +blocks: + default:topaz_ore: + loot: + template: loot_table:ore + arguments: + ore_drop: default:topaz + ore_block: default:deepslate_topaz_ore + settings: + template: block_settings:ore + overrides: + item: default:topaz_ore + state: + id: 13 + state: note_block:13 + model: + path: "minecraft:block/custom/topaz_ore" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/topaz_ore" + default:deepslate_topaz_ore: + loot: + template: loot_table:ore + arguments: + ore_drop: default:topaz + ore_block: default:deepslate_topaz_ore + settings: + template: block_settings:deepslate_ore + overrides: + item: default:deepslate_topaz_ore + state: + id: 14 + state: note_block:14 + model: + path: "minecraft:block/custom/deepslate_topaz_ore" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/deepslate_topaz_ore" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml b/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml new file mode 100644 index 000000000..ba0a4824a --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml @@ -0,0 +1,269 @@ +blocks: + default:palm_leaves: + behavior: + type: leaves_block + loot: + template: loot_table:leaves + arguments: + leaves: default:palm_leaves + sapling: default:palm_sapling + settings: + template: block_settings:leaves + overrides: + item: default:palm_leaves + states: + template: states:leaves + arguments: + default_state: oak_leaves[distance=1,persistent=false,waterlogged=false] + waterlogged_state: oak_leaves[distance=1,persistent=false,waterlogged=true] + model_path: "minecraft:block/custom/palm_leaves" + texture_path: "minecraft:block/custom/palm_leaves" + internal_id: + type: self_increase_int + from: 0 + to: 27 + default:palm_log: + loot: + template: loot_table:normal + arguments: + item: default:palm_log + settings: + template: block_settings:log + overrides: + item: default:palm_log + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/palm_log_top + texture_side_path: minecraft:block/custom/palm_log + model_vertical_path: minecraft:block/custom/palm_log + model_horizontal_path: minecraft:block/custom/palm_log_horizontal + vanilla_id: + type: self_increase_int + from: 0 + to: 2 + internal_id: + type: self_increase_int + from: 0 + to: 2 + default:stripped_palm_log: + loot: + template: loot_table:normal + arguments: + item: default:palm_log + settings: + template: block_settings:log + overrides: + item: default:palm_log + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/stripped_palm_log_top + texture_side_path: minecraft:block/custom/stripped_palm_log + model_vertical_path: minecraft:block/custom/stripped_palm_log + model_horizontal_path: minecraft:block/custom/stripped_palm_log_horizontal + vanilla_id: + type: self_increase_int + from: 3 + to: 5 + internal_id: + type: self_increase_int + from: 3 + to: 5 + default:palm_wood: + loot: + template: loot_table:normal + arguments: + item: default:palm_wood + settings: + template: block_settings:log + overrides: + item: default:palm_wood + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/palm_log + texture_side_path: minecraft:block/custom/palm_log + model_vertical_path: minecraft:block/custom/palm_wood + model_horizontal_path: minecraft:block/custom/palm_wood_horizontal + vanilla_id: + type: self_increase_int + from: 6 + to: 8 + internal_id: + type: self_increase_int + from: 6 + to: 8 + default:stripped_palm_wood: + loot: + template: loot_table:normal + arguments: + item: default:palm_wood + settings: + template: block_settings:log + overrides: + item: default:palm_wood + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/stripped_palm_log + texture_side_path: minecraft:block/custom/stripped_palm_log + model_vertical_path: minecraft:block/custom/stripped_palm_wood + model_horizontal_path: minecraft:block/custom/stripped_palm_wood_horizontal + vanilla_id: + type: self_increase_int + from: 9 + to: 11 + internal_id: + type: self_increase_int + from: 9 + to: 11 + default:palm_planks: + settings: + template: block_settings:planks + overrides: + item: default:palm_planks + loot: + template: loot_table:normal + arguments: + item: default:palm_planks + state: + id: 12 + state: note_block:12 + model: + path: "minecraft:block/custom/palm_planks" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/palm_planks" + +items: + default:palm_log: + material: paper + custom-model-data: 1000 + tags: + - "default:palm_logs" + - "minecraft:logs" + data: + display-name: "Palm Log" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_log" + generation: + parent: "minecraft:block/custom/palm_log" + behavior: + type: block_item + block: default:palm_log + default:stripped_palm_log: + material: paper + custom-model-data: 1001 + tags: + - "default:palm_logs" + - "minecraft:logs" + data: + display-name: "Stripped Palm Log" + model: + type: "minecraft:model" + path: "minecraft:item/custom/stripped_palm_log" + generation: + parent: "minecraft:block/custom/stripped_palm_log" + behavior: + type: block_item + block: default:stripped_palm_log + default:palm_wood: + material: paper + custom-model-data: 1002 + tags: + - "default:palm_logs" + - "minecraft:logs" + data: + display-name: "Palm Wood" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_wood" + generation: + parent: "minecraft:block/custom/palm_wood" + behavior: + type: block_item + block: default:palm_wood + default:stripped_palm_wood: + material: paper + custom-model-data: 1003 + tags: + - "default:palm_logs" + - "minecraft:logs" + data: + display-name: "Stripped Palm Wood" + model: + type: "minecraft:model" + path: "minecraft:item/custom/stripped_palm_wood" + generation: + parent: "minecraft:block/custom/stripped_palm_wood" + behavior: + type: block_item + block: default:stripped_palm_wood + default:palm_planks: + material: paper + custom-model-data: 1004 + tags: + - "minecraft:planks" + - "minecraft:wooden_tool_materials" + data: + display-name: "Palm Planks" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_planks" + generation: + parent: "minecraft:block/custom/palm_planks" + behavior: + type: block_item + block: default:palm_planks + default:palm_leaves: + material: oak_leaves + custom-model-data: 1000 + data: + display-name: "Palm Leaves" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_leaves" + generation: + parent: "minecraft:block/custom/palm_leaves" + tints: + - type: "minecraft:constant" + value: -12012264 + behavior: + type: block_item + block: default:palm_leaves + +recipes: + default:palm_planks: + type: shapeless + ingredients: + A: "#default:palm_logs" + result: + id: default:palm_planks + count: 4 + default:palm_wood: + type: shaped + pattern: + - "AA" + - "AA" + ingredients: + A: "default:palm_log" + result: + id: default:palm_wood + count: 3 + default:stripped_palm_wood: + type: shaped + pattern: + - "AA" + - "AA" + ingredients: + A: "default:stripped_palm_log" + result: + id: default:stripped_palm_wood + count: 3 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml b/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml new file mode 100644 index 000000000..0c2f24287 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml @@ -0,0 +1,393 @@ +# map-color: https://minecraft.wiki/w/Map_item_format +templates: + # Block Settings + block_settings:surface_decoration: + hardness: 0 + resistance: 0 + block_settings:leaves: + hardness: 0.2 + resistance: 0.2 + push-reaction: DESTROY # NORMAL,DESTROY,BLOCK,IGNORE,PUSH_ONLY + replaceable: false + burnable: true + burn-chance: 30 + fire-spread-chance: 100 + is-redstone-conductor: false + is-suffocating: false + instrument: HARP + tags: + - minecraft:mineable/hoe + - minecraft:sword_efficient + - minecraft:leaves + - minecraft:replaceable_by_trees + sounds: + break: minecraft:block.grass.break + step: minecraft:block.grass.step + place: minecraft:block.grass.place + hit: minecraft:block.grass.hit + fall: minecraft:block.grass.fall + block_settings:log: + hardness: 2.0 + resistance: 2.0 + push-reaction: NORMAL + replaceable: false + burnable: true + burn-chance: 5 + fire-spread-chance: 5 + is-redstone-conductor: true + is-suffocating: true + instrument: BASS + can-occlude: true + tags: + - minecraft:mineable/axe + - minecraft:logs_that_burn + - minecraft:logs + - minecraft:completes_find_tree_tutorial + sounds: + break: minecraft:block.wood.break + step: minecraft:block.wood.step + place: minecraft:block.wood.place + hit: minecraft:block.wood.hit + fall: minecraft:block.wood.fall + block_settings:planks: + hardness: 2.0 + resistance: 2.0 + push-reaction: NORMAL + replaceable: false + burnable: true + burn-chance: 5 + fire-spread-chance: 5 + is-redstone-conductor: true + is-suffocating: true + instrument: BASS + can-occlude: true + tags: + - minecraft:mineable/axe + sounds: + break: minecraft:block.wood.break + step: minecraft:block.wood.step + place: minecraft:block.wood.place + hit: minecraft:block.wood.hit + fall: minecraft:block.wood.fall + block_settings:ore: + hardness: 4.5 + resistance: 3.0 + push-reaction: NORMAL + is-redstone-conductor: true + is-suffocating: true + instrument: BASEDRUM + can-occlude: true + map-color: 11 + tags: + - minecraft:mineable/pickaxe + sounds: + break: minecraft:block.stone.break + step: minecraft:block.stone.step + place: minecraft:block.stone.place + hit: minecraft:block.stone.hit + fall: minecraft:block.stone.fall + block_settings:deepslate_ore: + hardness: 6 + resistance: 3.0 + push-reaction: NORMAL + is-redstone-conductor: true + is-suffocating: true + instrument: BASEDRUM + can-occlude: true + map-color: 59 + tags: + - minecraft:mineable/pickaxe + sounds: + break: minecraft:block.deepslate.break + step: minecraft:block.deepslate.step + place: minecraft:block.deepslate.place + hit: minecraft:block.deepslate.hit + fall: minecraft:block.deepslate.fall + + # Block States + states:log: + properties: + axis: + type: axis + default: y + appearances: + axisY: + state: "{base_block}:{vanilla_id}" + model: + path: "{model_vertical_path}" + generation: + parent: "minecraft:block/cube_column" + textures: + "end": "{texture_top_path}" + "side": "{texture_side_path}" + axisX: + state: "{base_block}:{vanilla_id}" + model: + x: 90 + y: 90 + path: "{model_horizontal_path}" + generation: + parent: "minecraft:block/cube_column_horizontal" + textures: + "end": "{texture_top_path}" + "side": "{texture_side_path}" + axisZ: + state: "{base_block}:{vanilla_id}" + model: + x: 90 + path: "{model_horizontal_path}" + generation: + parent: "minecraft:block/cube_column_horizontal" + textures: + "end": "{texture_top_path}" + "side": "{texture_side_path}" + variants: + axis=x: + appearance: axisX + id: "{internal_id}" + axis=y: + appearance: axisY + id: "{internal_id}" + axis=z: + appearance: axisZ + id: "{internal_id}" + states:leaves: + properties: + waterlogged: + type: boolean + default: false + persistent: + type: boolean + default: true + distance: + type: int + default: 7 + range: 1~7 + appearances: + default: + state: "{default_state}" + model: + path: "{model_path}" + generation: + parent: "minecraft:block/leaves" + textures: + "all": "{texture_path}" + waterlogged: + state: "{waterlogged_state}" + model: + path: "{model_path}" + variants: + distance=1,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=2,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=3,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=4,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=5,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=6,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=7,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + settings: + is-randomly-ticking: true + distance=1,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=2,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=3,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=4,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=5,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=6,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=7,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=1,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=2,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=3,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=4,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=5,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=6,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=7,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + is-randomly-ticking: true + distance=1,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=2,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=3,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=4,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=5,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=6,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=7,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + + # Loot Tables + loot_table:normal: + pools: + - rolls: 1 + conditions: + - type: survives_explosion + entries: + - type: item + item: "{item}" + loot_table:ore: + pools: + - rolls: 1 + conditions: + - type: survives_explosion + entries: + - type: alternatives + children: + - type: item + item: "{ore_block}" + conditions: + - type: enchantment + predicate: minecraft:silk_touch>=1 + - type: item + item: "{ore_drop}" + functions: + - type: apply_bonus + enchantment: minecraft:fortune + formula: ore_drops + - type: explosion_decay + loot_table:leaves: + pools: + - rolls: 1 + entries: + - type: alternatives + children: + - type: item + item: "{leaves}" + conditions: + - type: any_of + terms: + - type: match_item + id: minecraft:shears + - type: enchantment + predicate: minecraft:silk_touch>=1 + - type: item + item: "{sapling}" + conditions: + - type: survives_explosion + - type: table_bonus + enchantment: minecraft:fortune + chances: + - 0.05 + - 0.0625 + - 0.083333333 + - 0.1 + - rolls: 1 + conditions: + - type: inverted + term: + type: any_of + terms: + - type: match_item + id: minecraft:shears + - type: enchantment + predicate: minecraft:silk_touch>=1 + entries: + - type: item + item: minecraft:stick + conditions: + - type: table_bonus + enchantment: minecraft:fortune + chances: + - 0.02 + - 0.022222222 + - 0.025 + - 0.033333333 + - 0.1 + functions: + - type: set_count + count: + type: uniform + min: 1 + max: 2 + - type: explosion_decay \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/pack.yml b/bukkit-loader/src/main/resources/resources/default/pack.yml new file mode 100644 index 000000000..76b8a33b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/pack.yml @@ -0,0 +1,4 @@ +author: XiaoMoMi +version: 0.0.1 +description: Default Assets for CraftEngine +namespace: default \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json new file mode 100644 index 000000000..fd7176e69 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json @@ -0,0 +1,58 @@ +{ + "credit": "XiaoMoMi", + "textures": { + "0": "block/custom/fairy_flower_1", + "particle": "block/custom/fairy_flower_1" + }, + "elements": [ + { + "from": [3.75, 0, 12.25], + "to": [15.75, 29, 12.25], + "rotation": {"angle": 45, "axis": "y", "origin": [3.75, 0, 12.25]}, + "faces": { + "north": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [3.75, 0, 3.75], + "to": [3.75, 29, 15.75], + "rotation": {"angle": 45, "axis": "y", "origin": [3.75, 0, 3.75]}, + "faces": { + "north": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [7, 28, 7], + "to": [9, 30, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 28, 7]}, + "faces": { + "north": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "south": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "west": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "up": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "down": {"uv": [15, 0, 16, 1], "texture": "#0"} + } + } + ], + "display": { + "head": { + "translation": [0, 18.5, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -15], + "scale": [2, 2, 2] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json new file mode 100644 index 000000000..7d88139de --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json @@ -0,0 +1,255 @@ +{ + "credit": "MadewithBlockbench", + "texture_size": [64, 64], + "textures": { + "0": "item/custom/bench", + "particle": "item/custom/bench" + }, + "elements": [ + { + "from": [-8, 0, 1], + "to": [-6, 7, 3], + "faces": { + "north": {"uv": [7, 10.25, 7.5, 12], "texture": "#0"}, + "east": {"uv": [7.5, 10.25, 8, 12], "texture": "#0"}, + "south": {"uv": [8, 10.25, 8.5, 12], "texture": "#0"}, + "west": {"uv": [8.5, 10.25, 9, 12], "texture": "#0"}, + "up": {"uv": [10.5, 6.75, 10, 6.25], "texture": "#0"}, + "down": {"uv": [10.5, 6.75, 10, 7.25], "texture": "#0"} + } + }, + { + "from": [22, 0, 1], + "to": [24, 7, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [7.5, 10.25, 7, 12], "texture": "#0"}, + "east": {"uv": [9, 10.25, 8.5, 12], "texture": "#0"}, + "south": {"uv": [8.5, 10.25, 8, 12], "texture": "#0"}, + "west": {"uv": [8, 10.25, 7.5, 12], "texture": "#0"}, + "up": {"uv": [10, 6.75, 10.5, 6.25], "texture": "#0"}, + "down": {"uv": [10, 6.75, 10.5, 7.25], "texture": "#0"} + } + }, + { + "from": [22, 0, 13], + "to": [24, 7, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, + "faces": { + "north": {"uv": [8, 10.25, 8.5, 12], "texture": "#0"}, + "east": {"uv": [8.5, 10.25, 9, 12], "texture": "#0"}, + "south": {"uv": [7, 10.25, 7.5, 12], "texture": "#0"}, + "west": {"uv": [7.5, 10.25, 8, 12], "texture": "#0"}, + "up": {"uv": [10, 6.25, 10.5, 6.75], "texture": "#0"}, + "down": {"uv": [10, 7.25, 10.5, 6.75], "texture": "#0"} + } + }, + { + "from": [-8, 0, 13], + "to": [-6, 7, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [8.5, 10.25, 8, 12], "texture": "#0"}, + "east": {"uv": [8, 10.25, 7.5, 12], "texture": "#0"}, + "south": {"uv": [7.5, 10.25, 7, 12], "texture": "#0"}, + "west": {"uv": [9, 10.25, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 6.25, 10, 6.75], "texture": "#0"}, + "down": {"uv": [10.5, 7.25, 10, 6.75], "texture": "#0"} + } + }, + { + "from": [-8, 13, 1], + "to": [-6, 15, 13], + "faces": { + "north": {"uv": [12.25, 9.25, 12.75, 9.75], "texture": "#0"}, + "east": {"uv": [13, 5.75, 10, 6.25], "texture": "#0"}, + "south": {"uv": [12.25, 9.75, 12.75, 10.25], "texture": "#0"}, + "west": {"uv": [10, 5.75, 13, 6.25], "texture": "#0"}, + "up": {"uv": [2.5, 13.25, 2, 10.25], "texture": "#0"}, + "down": {"uv": [3, 10.25, 2.5, 13.25], "texture": "#0"} + } + }, + { + "from": [-7, 9, 1], + "to": [-7, 13, 13], + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [7, 4.25, 10, 5.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [7, 4.25, 10, 5.25], "texture": "#0"}, + "up": {"uv": [0, 3, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 3], "texture": "#0"} + } + }, + { + "from": [-8, 9, 13], + "to": [-6, 21, 15], + "faces": { + "north": {"uv": [5, 10.25, 5.5, 13.25], "texture": "#0"}, + "east": {"uv": [5.5, 10.25, 6, 13.25], "texture": "#0"}, + "south": {"uv": [6, 10.25, 6.5, 13.25], "texture": "#0"}, + "west": {"uv": [6.5, 10.25, 7, 13.25], "texture": "#0"}, + "up": {"uv": [12.75, 11.75, 12.25, 11.25], "texture": "#0"}, + "down": {"uv": [12.75, 11.75, 12.25, 12.25], "texture": "#0"} + } + }, + { + "from": [-6, 8, 14], + "to": [22, 22, 14], + "faces": { + "north": {"uv": [0, 0, 7, 3.5], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 3.5], "texture": "#0"}, + "south": {"uv": [0, 3.5, 7, 7], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 3.5], "texture": "#0"}, + "up": {"uv": [7, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [7, 0, 0, 0], "texture": "#0"} + } + }, + { + "from": [-8, 7, 0], + "to": [-6, 9, 15], + "faces": { + "north": {"uv": [12.25, 12.25, 12.75, 12.75], "texture": "#0"}, + "east": {"uv": [10, 3.25, 13.75, 3.75], "texture": "#0"}, + "south": {"uv": [12.5, 6.25, 13, 6.75], "texture": "#0"}, + "west": {"uv": [10, 3.75, 13.75, 4.25], "texture": "#0"}, + "up": {"uv": [0.5, 14, 0, 10.25], "texture": "#0"}, + "down": {"uv": [1, 10.25, 0.5, 14], "texture": "#0"} + } + }, + { + "from": [22, 7, 0], + "to": [24, 9, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [12.75, 12.25, 12.25, 12.75], "texture": "#0"}, + "east": {"uv": [13.75, 3.75, 10, 4.25], "texture": "#0"}, + "south": {"uv": [13, 6.25, 12.5, 6.75], "texture": "#0"}, + "west": {"uv": [13.75, 3.25, 10, 3.75], "texture": "#0"}, + "up": {"uv": [0, 14, 0.5, 10.25], "texture": "#0"}, + "down": {"uv": [0.5, 10.25, 1, 14], "texture": "#0"} + } + }, + { + "from": [22, 13, 1], + "to": [24, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [12.75, 9.25, 12.25, 9.75], "texture": "#0"}, + "east": {"uv": [13, 5.75, 10, 6.25], "texture": "#0"}, + "south": {"uv": [12.75, 9.75, 12.25, 10.25], "texture": "#0"}, + "west": {"uv": [10, 5.75, 13, 6.25], "texture": "#0"}, + "up": {"uv": [2, 13.25, 2.5, 10.25], "texture": "#0"}, + "down": {"uv": [2.5, 10.25, 3, 13.25], "texture": "#0"} + } + }, + { + "from": [23, 9, 1], + "to": [23, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [10, 4.25, 7, 5.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [10, 4.25, 7, 5.25], "texture": "#0"}, + "up": {"uv": [0, 3, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 3], "texture": "#0"} + } + }, + { + "from": [22, 9, 13], + "to": [24, 21, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [5.5, 10.25, 5, 13.25], "texture": "#0"}, + "east": {"uv": [7, 10.25, 6.5, 13.25], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6, 13.25], "texture": "#0"}, + "west": {"uv": [6, 10.25, 5.5, 13.25], "texture": "#0"}, + "up": {"uv": [12.25, 11.75, 12.75, 11.25], "texture": "#0"}, + "down": {"uv": [12.25, 11.75, 12.75, 12.25], "texture": "#0"} + } + }, + { + "from": [-7, 3, 3], + "to": [-7, 7, 12], + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [7, 8.25, 9.25, 9.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [7, 8.25, 9.25, 9.25], "texture": "#0"}, + "up": {"uv": [0, 2.25, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2.25], "texture": "#0"} + } + }, + { + "from": [23, 3, 3], + "to": [23, 7, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [9.25, 8.25, 7, 9.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [9.25, 8.25, 7, 9.25], "texture": "#0"}, + "up": {"uv": [0, 2.25, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2.25], "texture": "#0"} + } + }, + { + "from": [-6, 8, 1], + "to": [22, 8, 14], + "faces": { + "north": {"uv": [0, 0, 7, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 3.25, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 7, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 3.25, 0], "texture": "#0"}, + "up": {"uv": [7, 10.25, 0, 7], "texture": "#0"}, + "down": {"uv": [7, 7, 0, 10.25], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 3.25, 0], + "scale": [0.3, 0.3, 0.3] + }, + "gui": { + "rotation": [25, 138, 0], + "translation": [0, -1, 0], + "scale": [0.4, 0.4, 0.4] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 0, 6], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + } + ] +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json new file mode 100644 index 000000000..31bb35cfa --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "item/custom/table_lamp", + "particle": "item/custom/table_lamp" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 0, 3]}, + "faces": { + "north": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "east": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "south": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "west": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "up": {"uv": [5, 5, 0, 0], "texture": "#0"}, + "down": {"uv": [5, 5, 0, 10], "texture": "#0"} + } + }, + { + "from": [9, 1, 6], + "to": [9, 10, 10], + "rotation": {"angle": -22.5, "axis": "z", "origin": [9, 1, 10]}, + "faces": { + "north": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "east": {"uv": [5, 0, 7, 4.5], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "west": {"uv": [7, 0, 5, 4.5], "texture": "#0"}, + "up": {"uv": [0, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2], "texture": "#0"} + } + }, + { + "from": [12, 6, 6], + "to": [12, 15, 10], + "rotation": {"angle": 45, "axis": "z", "origin": [12, 8, 10]}, + "faces": { + "north": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "east": {"uv": [5, 4.5, 7, 9], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "west": {"uv": [5, 4.5, 7, 9], "texture": "#0"}, + "up": {"uv": [0, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2], "texture": "#0"} + } + }, + { + "from": [5.05096, 10.77888, 6], + "to": [9.05096, 14.77888, 10], + "rotation": {"angle": 22.5, "axis": "z", "origin": [5.80096, 12.77888, 8]}, + "faces": { + "north": {"uv": [14, 0, 16, 2], "texture": "#0"}, + "east": {"uv": [12, 0, 14, 2], "texture": "#0"}, + "south": {"uv": [16, 0, 14, 2], "texture": "#0"}, + "west": {"uv": [14, 2, 16, 4], "texture": "#0"}, + "up": {"uv": [14, 4, 12, 2], "texture": "#0"}, + "down": {"uv": [14, 4, 12, 6], "texture": "#0"} + } + }, + { + "from": [4.05096, 9.77888, 5], + "to": [5.05096, 15.77888, 11], + "rotation": {"angle": 22.5, "axis": "z", "origin": [5.80096, 12.77888, 8]}, + "faces": { + "north": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "east": {"uv": [7, 0, 10, 3], "texture": "#0"}, + "south": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "west": {"uv": [7, 3, 10, 6], "texture": "#0"}, + "up": {"uv": [11, 3, 10.5, 0], "texture": "#0"}, + "down": {"uv": [10.5, 0, 10, 3], "texture": "#0"} + } + }, + { + "from": [4.97484, 10.16157, 5], + "to": [3.97484, 16.16157, 11], + "rotation": {"angle": 22.5, "axis": "z", "origin": [6.72484, 13.16157, 8]}, + "faces": { + "north": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "east": {"uv": [7, 3, 10, 6], "texture": "#0"}, + "south": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "west": {"uv": [7, 0, 10, 3], "texture": "#0"}, + "up": {"uv": [11, 3, 10.5, 0], "texture": "#0"}, + "down": {"uv": [10.5, 0, 10, 3], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [60, 45, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [60, 45, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 22, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, -161, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 3.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [25, 51, 0], + "translation": [0, 0.25, 0], + "scale": [0.65, 0.65, 0.65] + }, + "fixed": { + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json new file mode 100644 index 000000000..dd4fac5a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json @@ -0,0 +1,163 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "1": "item/custom/wooden_chair" + }, + "elements": [ + { + "from": [3.75, -0.25, 3.75], + "to": [5.25, 7.25, 5.25], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 4, 4.5]}, + "faces": { + "north": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "east": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "south": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "west": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "up": {"uv": [16, 0.5, 15.5, 0], "texture": "#1"}, + "down": {"uv": [15.5, 0, 15, 0.5], "texture": "#1"} + } + }, + { + "from": [10.75, -0.25, 3.75], + "to": [12.25, 7.25, 5.25], + "rotation": {"angle": 0, "axis": "y", "origin": [11.5, 3.5, 4.5]}, + "faces": { + "north": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "east": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "south": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "west": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "up": {"uv": [15.5, 0.5, 16, 0], "texture": "#1"}, + "down": {"uv": [15, 0, 15.5, 0.5], "texture": "#1"} + } + }, + { + "from": [10.75, -0.25, 10.75], + "to": [12.25, 7.25, 12.25], + "rotation": {"angle": 0, "axis": "y", "origin": [11.5, 4, 11.5]}, + "faces": { + "north": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "east": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "south": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "west": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "up": {"uv": [15.5, 0, 16, 0.5], "texture": "#1"}, + "down": {"uv": [15, 0.5, 15.5, 0], "texture": "#1"} + } + }, + { + "from": [3.75, -0.25, 10.75], + "to": [5.25, 7.25, 12.25], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 4, 11.5]}, + "faces": { + "north": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "east": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "south": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "west": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "up": {"uv": [16, 0, 15.5, 0.5], "texture": "#1"}, + "down": {"uv": [15.5, 0.5, 15, 0], "texture": "#1"} + } + }, + { + "from": [4, 9, 12], + "to": [12, 17, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 9, 14]}, + "faces": { + "north": {"uv": [4, 5, 0, 9], "texture": "#1"}, + "east": {"uv": [0, 0, 0, 4], "texture": "#1"}, + "south": {"uv": [0, 5, 4, 9], "texture": "#1"}, + "west": {"uv": [0, 0, 0, 4], "texture": "#1"}, + "up": {"uv": [4, 0, 0, 0], "texture": "#1"}, + "down": {"uv": [4, 0, 0, 0], "texture": "#1"} + } + }, + { + "from": [4, 16.5, 11.5], + "to": [12, 18.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 17, 14]}, + "faces": { + "north": {"uv": [8, 5, 4, 6], "texture": "#1"}, + "east": {"uv": [8, 5, 8.5, 6], "texture": "#1"}, + "south": {"uv": [4, 5, 8, 6], "texture": "#1"}, + "west": {"uv": [8, 5, 8.5, 6], "texture": "#1"}, + "up": {"uv": [8, 7, 4, 6.5], "texture": "#1"}, + "down": {"uv": [8, 6, 4, 6.5], "texture": "#1"} + } + }, + { + "from": [3, 9, 11], + "to": [4, 19, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 9, 13]}, + "faces": { + "north": {"uv": [0.5, 11, 1, 16], "texture": "#1"}, + "east": {"uv": [2, 11, 3, 16], "texture": "#1"}, + "south": {"uv": [0, 11, 0.5, 16], "texture": "#1"}, + "west": {"uv": [1, 11, 2, 16], "texture": "#1"}, + "up": {"uv": [2, 11, 1, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [2, 11, 3, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [12, 9, 11], + "to": [13, 19, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 9, 13]}, + "faces": { + "north": {"uv": [1, 11, 0.5, 16], "texture": "#1"}, + "east": {"uv": [2, 11, 1, 16], "texture": "#1"}, + "south": {"uv": [0.5, 11, 0, 16], "texture": "#1"}, + "west": {"uv": [3, 11, 2, 16], "texture": "#1"}, + "up": {"uv": [2, 10.5, 1, 11], "rotation": 90, "texture": "#1"}, + "down": {"uv": [2, 10.5, 3, 11], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [3, 7, 3], + "to": [13, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 7, 5]}, + "faces": { + "north": {"uv": [10, 2, 15, 3], "texture": "#1"}, + "east": {"uv": [10, 0, 15, 1], "texture": "#1"}, + "south": {"uv": [10, 1, 15, 2], "texture": "#1"}, + "west": {"uv": [15, 0, 10, 1], "texture": "#1"}, + "up": {"uv": [5, 5, 0, 0], "texture": "#1"}, + "down": {"uv": [10, 0, 5, 5], "texture": "#1"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 3.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [25, 138, 0], + "translation": [0, -1, 0], + "scale": [0.65, 0.65, 0.65] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 0, 1.5], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png new file mode 100644 index 000000000..49f185bd6 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png new file mode 100644 index 000000000..10bfa945e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png new file mode 100644 index 000000000..db7bae179 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png new file mode 100644 index 000000000..d6d9c4559 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png new file mode 100644 index 000000000..1f5fccf5f Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png new file mode 100644 index 000000000..18543c0b3 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png new file mode 100644 index 000000000..d6430f45b Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png new file mode 100644 index 000000000..9538a07bc Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png new file mode 100644 index 000000000..384b66d19 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png new file mode 100644 index 000000000..4c7776334 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png new file mode 100644 index 000000000..26b82c82e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png new file mode 100644 index 000000000..fcb124fbb Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png new file mode 100644 index 000000000..384b66d19 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png new file mode 100644 index 000000000..3eb2113a9 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png new file mode 100644 index 000000000..c65accf81 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod.png new file mode 100644 index 000000000..87b5ad10b Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod_cast.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod_cast.png new file mode 100644 index 000000000..354b5371f Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod_cast.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png new file mode 100644 index 000000000..e2c3b257b Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png new file mode 100644 index 000000000..5255ccd63 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png new file mode 100644 index 000000000..fd7fa26cb Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png new file mode 100644 index 000000000..aa0bf3636 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png new file mode 100644 index 000000000..28fcde829 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta new file mode 100644 index 000000000..c8662fc21 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta @@ -0,0 +1,10 @@ +{ + "pack":{ + "pack_format": 15, + "description":"CraftEngine", + "supported_formats": { + "min_inclusive": 15, + "max_inclusive": 46 + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png new file mode 100644 index 000000000..d72a566d1 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml b/bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml new file mode 100644 index 000000000..cf2175bf7 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml @@ -0,0 +1,265 @@ +images: + internal:neg_1: + height: -3 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf800' + internal:neg_2: + height: -4 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf801' + internal:neg_3: + height: -5 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf802' + internal:neg_4: + height: -6 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf803' + internal:neg_5: + height: -7 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf804' + internal:neg_6: + height: -8 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf805' + internal:neg_7: + height: -9 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf806' + internal:neg_8: + height: -10 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf807' + internal:neg_9: + height: -11 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf808' + internal:neg_10: + height: -12 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf809' + internal:neg_11: + height: -13 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf80a' + internal:neg_12: + height: -14 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf80b' + internal:neg_13: + height: -15 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf80c' + internal:neg_14: + height: -16 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf80d' + internal:neg_15: + height: -17 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf80e' + internal:neg_16: + height: -18 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf80f' + internal:neg_24: + height: -26 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf810' + internal:neg_32: + height: -34 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf811' + internal:neg_48: + height: -50 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf812' + internal:neg_64: + height: -66 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf813' + internal:neg_128: + height: -130 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf814' + internal:neg_256: + height: -258 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf815' + internal:pos_1: + height: -1 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf830' + internal:pos_2: + height: 1 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf831' + internal:pos_3: + height: 2 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf832' + internal:pos_4: + height: 3 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf833' + internal:pos_5: + height: 4 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf834' + internal:pos_6: + height: 5 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf835' + internal:pos_7: + height: 6 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf836' + internal:pos_8: + height: 7 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf837' + internal:pos_9: + height: 8 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf838' + internal:pos_10: + height: 9 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf839' + internal:pos_11: + height: 10 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf83a' + internal:pos_12: + height: 11 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf83b' + internal:pos_13: + height: 12 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf83c' + internal:pos_14: + height: 13 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf83d' + internal:pos_15: + height: 14 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf83e' + internal:pos_16: + height: 15 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf83f' + internal:pos_24: + height: 23 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf840' + internal:pos_32: + height: 31 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf841' + internal:pos_48: + height: 47 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf842' + internal:pos_64: + height: 63 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf843' + internal:pos_128: + height: 127 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf844' + internal:pos_256: + height: 255 + ascent: -5000 + font: minecraft:default + file: minecraft:font/offset/space_split.png + char: '\uf845' \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/pack.yml b/bukkit-loader/src/main/resources/resources/internal/pack.yml new file mode 100644 index 000000000..5cca63a6f --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/pack.yml @@ -0,0 +1,4 @@ +author: XiaoMoMi +version: 0.0.1 +description: Internal Assets +namespace: default \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json new file mode 100644 index 000000000..e2571f1ec --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json @@ -0,0 +1,90 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "block/chorus_plant", + "inside": "block/chorus_plant" + }, + "elements": [ + { + "from": [3, 14, 3], + "to": [13, 16, 13], + "faces": { + "north": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "east": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "south": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "west": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "up": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "up"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#inside"} + } + }, + { + "from": [0, 3, 3], + "to": [2, 13, 12], + "faces": { + "north": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "west"}, + "south": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "west"}, + "west": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "west"}, + "up": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "west"}, + "down": {"uv": [15, 13, 13, 3], "texture": "#inside", "cullface": "west"} + } + }, + { + "from": [3, 3, 0], + "to": [13, 13, 2], + "faces": { + "north": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "north"}, + "east": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "north"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#inside"}, + "west": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "north"}, + "up": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "north"}, + "down": {"uv": [13, 3, 3, 1], "texture": "#inside", "cullface": "north"} + } + }, + { + "from": [3, 3, 14], + "to": [13, 13, 16], + "faces": { + "east": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "south"}, + "south": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "south"}, + "west": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "south"}, + "up": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "south"}, + "down": {"uv": [13, 15, 3, 13], "texture": "#inside", "cullface": "south"} + } + }, + { + "from": [14, 3, 3], + "to": [16, 13, 13], + "faces": { + "north": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "east"}, + "east": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "east"}, + "south": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "east"}, + "up": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "east"}, + "down": {"uv": [3, 13, 1, 3], "texture": "#inside", "cullface": "east"} + } + }, + { + "from": [3, 0, 3], + "to": [13, 2, 13], + "faces": { + "north": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "east": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "south": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "west": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "down": {"uv": [13, 13, 3, 3], "texture": "#inside", "cullface": "down"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 14, 14], + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "east": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "west": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "down": {"uv": [14, 14, 2, 2], "texture": "#inside"} + } + } + ] +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png new file mode 100644 index 000000000..3ca3f1d84 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png differ diff --git a/bukkit-loader/src/main/resources/translations/en.yml b/bukkit-loader/src/main/resources/translations/en.yml new file mode 100644 index 000000000..a4146e598 --- /dev/null +++ b/bukkit-loader/src/main/resources/translations/en.yml @@ -0,0 +1,41 @@ +# Don't change this +config-version: "1" + +exception.invalid_syntax: "Invalid syntax. Correct syntax: " +exception.invalid_argument: "Invalid argument. Reason: " +exception.invalid_sender: " is not allowed to execute that command. Must be of type " +exception.unexpected: "An internal error occurred while attempting to perform this command" +exception.no_permission: "I'm sorry, but you do not have permission to perform this command" +exception.no_such_command: "Unknown command." +argument.entity.notfound.player: "" +argument.entity.notfound.entity: "" +argument.parse.failure.time: "'' is not a valid time format" +argument.parse.failure.material: "'' is not a valid material name" +argument.parse.failure.enchantment: "'' is not a valid enchantment" +argument.parse.failure.offlineplayer: "No player found for input ''" +argument.parse.failure.player: "No player found for input ''" +argument.parse.failure.world: "'' is not a valid Minecraft world" +argument.parse.failure.location.invalid_format: "'' is not a valid location. Required format is ' " +argument.parse.failure.location.mixed_local_absolute: "Cannot mix local and absolute coordinates. (either all coordinates use '^' or none do)" +argument.parse.failure.namespacedkey.namespace: "Invalid namespace ''. Must be [a-z0-9._-]" +argument.parse.failure.namespacedkey.key: "Invalid key ''. Must be [a-z0-9/._-]" +argument.parse.failure.namespacedkey.need_namespace: "Invalid input '', requires an explicit namespace" +argument.parse.failure.boolean: "Could not parse boolean from ''" +argument.parse.failure.number: "'' is not a valid number in the range to " +argument.parse.failure.char: "'' is not a valid character" +argument.parse.failure.string: "'' is not a valid string of type " +argument.parse.failure.uuid: "'' is not a valid UUID" +argument.parse.failure.enum: "'' is not one of the following: " +argument.parse.failure.regex: "'' does not match ''" +argument.parse.failure.flag.unknown: "Unknown flag ''" +argument.parse.failure.flag.duplicate_flag: "Duplicate flag ''" +argument.parse.failure.flag.no_flag_started: "No flag started. Don't know what to do with ''" +argument.parse.failure.flag.missing_argument: "Missing argument for ''" +argument.parse.failure.flag.no_permission: "You don't have permission to use ''" +argument.parse.failure.color: "'' is not a valid color" +argument.parse.failure.duration: "'' is not a duration format" +argument.parse.failure.aggregate.missing: "Missing component ''" +argument.parse.failure.aggregate.failure: "Invalid component '': " +argument.parse.failure.either: "Could not resolve or from ''" +argument.parse.failure.namedtextcolor: "'' is not a named text color" +command.reload.success: "Reloaded. Took ms." \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/translations/zh_cn.yml b/bukkit-loader/src/main/resources/translations/zh_cn.yml new file mode 100644 index 000000000..5e66df165 --- /dev/null +++ b/bukkit-loader/src/main/resources/translations/zh_cn.yml @@ -0,0 +1,41 @@ +# 别动这个 +config-version: "1" + +exception.invalid_syntax: "无效语法. 正确语法:" +exception.invalid_argument: "无效参数. 原因:" +exception.invalid_sender: " 不允许执行该命令. 执行者必须是 " +exception.unexpected: "执行该命令时发生内部错误" +exception.no_permission: "抱歉, 您没有权限执行该命令" +exception.no_such_command: "未知命令" +argument.entity.notfound.player: "找不到玩家 ''" +argument.entity.notfound.entity: "找不到实体 ''" +argument.parse.failure.time: "'' 不是有效的时间格式" +argument.parse.failure.material: "'' 不是有效的材料" +argument.parse.failure.enchantment: "'' 不是有效的魔咒" +argument.parse.failure.offlineplayer: "输入的玩家 '' 已离线" +argument.parse.failure.player: "找不到输入的玩家 ''" +argument.parse.failure.world: "'' 不是有效的 Minecraft 世界名称" +argument.parse.failure.location.invalid_format: "'' 不是有效的位置格式.必须格式为 ' '" +argument.parse.failure.location.mixed_local_absolute: "不能混用相对和绝对坐标.坐标要么全部使用 '^',要么全部不用" +argument.parse.failure.namespacedkey.namespace: "无效的命名空间 ''.必须为 [a-z0-9._-]" +argument.parse.failure.namespacedkey.key: "无效的键 ''.必须为 [a-z0-9/._-]" +argument.parse.failure.namespacedkey.need_namespace: "无效的输入 '', 需要显式指定命名空间" +argument.parse.failure.boolean: "无法解析布尔值 ''" +argument.parse.failure.number: "'' 不是从 范围内的有效数字" +argument.parse.failure.char: "'' 不是有效的字符" +argument.parse.failure.string: "'' 不是类型为 的有效字符串" +argument.parse.failure.uuid: "'' 不是有效的 UUID" +argument.parse.failure.enum: "'' 不是以下任何一种情况之一: " +argument.parse.failure.regex: "'' 不匹配 ''" +argument.parse.failure.flag.unknown: "未知标志 ''" +argument.parse.failure.flag.duplicate_flag: "重复的标志 ''" +argument.parse.failure.flag.no_flag_started: "没有开始标志. 不知道如何处理 ''" +argument.parse.failure.flag.missing_argument: "缺少 '' 参数" +argument.parse.failure.flag.no_permission: "您没有权限使用 ''" +argument.parse.failure.color: "'' 不是有效的颜色" +argument.parse.failure.duration: "'' 不是有效的持续时间格式" +argument.parse.failure.aggregate.missing: "缺少组件 ''" +argument.parse.failure.aggregate.failure: "无效的组件 '': " +argument.parse.failure.either: "无法从 '' 解析 " +argument.parse.failure.namedtextcolor: "'' 不是颜色代码" +command.reload.success: "重新加载完成. 耗时 毫秒" \ No newline at end of file diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts new file mode 100644 index 000000000..581a10d3a --- /dev/null +++ b/bukkit/build.gradle.kts @@ -0,0 +1,92 @@ +plugins { + id("io.github.goooler.shadow") version "8.1.8" +} + +repositories { + maven("https://jitpack.io/") + maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // papi + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://maven.enginehub.org/repo/") // worldguard worldedit + maven("https://repo.momirealms.net/releases/") + mavenCentral() +} + +dependencies { + // API + implementation(project(":shared")) + implementation(project(":core")) + implementation(project(":bukkit:legacy")) + // NBT + implementation("com.github.Xiao-MoMi:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}") + // Placeholder + compileOnly("me.clip:placeholderapi:${rootProject.properties["placeholder_api_version"]}") + // Platform + compileOnly("dev.folia:folia-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT") + // OpenGL Math + compileOnly("org.joml:joml:${rootProject.properties["joml_version"]}") + // Gson + compileOnly("com.google.code.gson:gson:${rootProject.properties["gson_version"]}") + // Guava + compileOnly("com.google.guava:guava:${rootProject.properties["guava_version"]}") + // FastUtil + compileOnly("it.unimi.dsi:fastutil:${rootProject.properties["fastutil_version"]}") + // Netty + compileOnly("io.netty:netty-all:${rootProject.properties["netty_version"]}.Final") + // ByteBuddy + compileOnly("net.bytebuddy:byte-buddy:${rootProject.properties["byte_buddy_version"]}") + // Command + compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}") + compileOnly("org.incendo:cloud-minecraft-extras:${rootProject.properties["cloud_minecraft_extras_version"]}") + compileOnly("org.incendo:cloud-paper:${rootProject.properties["cloud_paper_version"]}") + // YAML + compileOnly("dev.dejvokep:boosted-yaml:${rootProject.properties["boosted_yaml_version"]}") + // Item Tag + implementation("com.saicone.rtag:rtag:${rootProject.properties["rtag_version"]}") + implementation("com.saicone.rtag:rtag-item:${rootProject.properties["rtag_version"]}") + implementation("com.saicone.rtag:rtag-entity:${rootProject.properties["rtag_version"]}") + // Adventure + implementation("net.kyori:adventure-api:${rootProject.properties["adventure_bundle_version"]}") + implementation("net.kyori:adventure-text-minimessage:${rootProject.properties["adventure_bundle_version"]}") + implementation("net.kyori:adventure-platform-bukkit:${rootProject.properties["adventure_platform_version"]}") + implementation("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") { + exclude("com.google.code.gson", "gson") + } + compileOnly("com.sk89q.worldedit:worldedit-core:7.2.19") + compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.19") + // Data Fixer Upper + compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +artifacts { + archives(tasks.shadowJar) +} + +tasks { + shadowJar { + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("net.momirealms.sparrow.nbt", "net.momirealms.craftengine.libraries.nbt") + relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.tag") + relocate("org.incendo", "net.momirealms.craftengine.libraries") + relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") + relocate("org.apache.commons.io", "net.momirealms.craftengine.libraries.commons.io") + relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") + relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine") + relocate("net.objecthunter.exp4j", "net.momirealms.craftengine.libraries.exp4j") + relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy") + relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") + } +} diff --git a/bukkit/legacy/build.gradle.kts b/bukkit/legacy/build.gradle.kts new file mode 100644 index 000000000..40e26ed6f --- /dev/null +++ b/bukkit/legacy/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + id("io.github.goooler.shadow") version "8.1.8" +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") + mavenCentral() +} + +dependencies { + // Platform + compileOnly("dev.folia:folia-api:1.20.1-R0.1-SNAPSHOT") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +artifacts { + archives(tasks.shadowJar) +} \ No newline at end of file diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/legacy/listener/DismountListener1_20.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/legacy/listener/DismountListener1_20.java new file mode 100644 index 000000000..5d33802ac --- /dev/null +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/legacy/listener/DismountListener1_20.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.legacy.listener; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.function.BiConsumer; + +public class DismountListener1_20 implements Listener { + private final BiConsumer consumer; + + public DismountListener1_20(BiConsumer consumer) { + this.consumer = consumer; + } + + @EventHandler(ignoreCancelled = true) + public void onDismount(org.spigotmc.event.entity.EntityDismountEvent event) { + if (event.getEntity() instanceof Player player) { + this.consumer.accept(player, event.getDismounted()); + } + } +} diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/legacy/util/LegacyAttributeUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/legacy/util/LegacyAttributeUtils.java new file mode 100644 index 000000000..7fc483406 --- /dev/null +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/legacy/util/LegacyAttributeUtils.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.bukkit.legacy.util; + +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.ArmorStand; + +import java.util.Objects; + +public class LegacyAttributeUtils { + + public static void setMaxHealth(ArmorStand entity) { + Objects.requireNonNull(entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0.01); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java new file mode 100644 index 000000000..33755c68f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.bukkit.api; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.bukkit.Location; + +@SuppressWarnings("DuplicatedCode") +public final class CraftEngineBlocks { + + public static boolean place(Location location, ImmutableBlockState block, UpdateOption option) { + boolean success; + try { + Object worldServer = Reflections.field$CraftWorld$ServerLevel.get(location.getWorld()); + Object blockPos = Reflections.constructor$BlockPos.newInstance(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + Object blockState = block.customBlockState().handle(); + Object oldBlockState = Reflections.method$BlockGetter$getBlockState.invoke(worldServer, blockPos); + success = (boolean) Reflections.method$LevelWriter$setBlock.invoke(worldServer, blockPos, blockState, option.flags()); + if (success) { + Reflections.method$BlockStateBase$onPlace.invoke(blockState, worldServer, blockPos, oldBlockState, true); + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to set nms block", e); + return false; + } + return success; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java new file mode 100644 index 000000000..786bcee1d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -0,0 +1,259 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.bukkit.util.NoteBlockChainUpdateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.PushReaction; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.world.GenericGameEvent; + +import java.util.List; + +// TODO interact waterlogged blocks +public class BlockEventListener implements Listener { + private final BukkitCraftEngine plugin; + private final boolean enableNoteBlockCheck; + private final BukkitBlockManager manager; + + public BlockEventListener(BukkitCraftEngine plugin, BukkitBlockManager manager, boolean enableNoteBlockCheck) { + this.plugin = plugin; + this.manager = manager; + this.enableNoteBlockCheck = enableNoteBlockCheck; + } + + @EventHandler(ignoreCancelled = true) + public void onPlaceBlock(BlockPlaceEvent event) { + Player player = event.getPlayer(); + BukkitServerPlayer serverPlayer = plugin.adapt(player); + // send swing if player is clicking a replaceable block + if (serverPlayer.shouldResendSwing()) { + player.swingHand(event.getHand()); + } + // send sound if the placed block's sounds are removed + if (ConfigManager.enableSoundSystem()) { + Block block = event.getBlock(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + if (this.manager.isBlockSoundRemoved(ownerBlock)) { + if (player.getInventory().getItemInMainHand().getType() != Material.DEBUG_STICK) { + try { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object placeSound = Reflections.field$SoundType$placeSound.get(soundType); + player.playSound(block.getLocation(), Reflections.field$SoundEvent$location.get(placeSound).toString(), SoundCategory.BLOCKS, 1f, 1f); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get sound type", e); + } + } + return; + } + } + // resend sound if the clicked block is interactable on client side + if (serverPlayer.shouldResendSound()) { + try { + Block block = event.getBlock(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object placeSound = Reflections.field$SoundType$placeSound.get(soundType); + player.playSound(block.getLocation(), Reflections.field$SoundEvent$location.get(placeSound).toString(), SoundCategory.BLOCKS, 1f, 1f); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get sound type", e); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerBreak(BlockBreakEvent event) { + org.bukkit.block.Block block = event.getBlock(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + ImmutableBlockState state = manager.getImmutableBlockStateUnsafe(stateId); + if (!state.isEmpty()) { + Location location = block.getLocation(); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(location.getWorld()); + // handle waterlogged blocks + @SuppressWarnings("unchecked") + Property waterloggedProperty = (Property) state.owner().value().getProperty("waterlogged"); + if (waterloggedProperty != null) { + boolean waterlogged = state.get(waterloggedProperty); + if (waterlogged) { + location.getWorld().setBlockData(location, Material.WATER.createBlockData()); + } + } + // play sound + Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); + world.playBlockSound(vec3d, state.sounds().breakSound(), 1f, 1f); + + Player player = event.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE) { + return; + } + + // drop items + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.PLAYER, plugin.adapt(player)); + for (Item item : state.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + } else if (ConfigManager.enableSoundSystem()) { + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + if (manager.isBlockSoundRemoved(ownerBlock)) { + try { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object breakSound = Reflections.field$SoundType$breakSound.get(soundType); + block.getWorld().playSound(block.getLocation(), Reflections.field$SoundEvent$location.get(breakSound).toString(), SoundCategory.BLOCKS, 1f, 1f); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get sound type", e); + } + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onStep(GenericGameEvent event) { + if (event.getEvent() != GameEvent.STEP) return; + Entity entity = event.getEntity(); + if (!(entity instanceof Player player)) return; + BlockPos pos = EntityUtils.getOnPos(player); + Location playerLocation = player.getLocation(); + BlockData blockData = player.getWorld().getBlockData(pos.x(), pos.y(), pos.z()); + Object blockState = BlockStateUtils.blockDataToBlockState(blockData); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + ImmutableBlockState state = manager.getImmutableBlockStateUnsafe(stateId); + player.playSound(playerLocation, state.sounds().stepSound().toString(), SoundCategory.BLOCKS, 0.15f, 1f); + } else if (ConfigManager.enableSoundSystem()) { + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + if (manager.isBlockSoundRemoved(ownerBlock)) { + try { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object stepSound = Reflections.field$SoundType$stepSound.get(soundType); + player.playSound(playerLocation, Reflections.field$SoundEvent$location.get(stepSound).toString(), SoundCategory.BLOCKS, 0.15f, 1f); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get sound type", e); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onPistonRetract(BlockPistonRetractEvent event) { + handlePistonEvent(event.getDirection(), event.getBlocks(), event.getBlock()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onPistonExtend(BlockPistonExtendEvent event) { + handlePistonEvent(event.getDirection(), event.getBlocks(), event.getBlock()); + } + + // todo refactor this method + private void handlePistonEvent(BlockFace face, List blocksList, Block piston) { + int blocks = blocksList.size(); + CEWorld world = BukkitWorldManager.instance().getWorld(piston.getWorld()); + for (int i = blocks - 1; i >= 0; --i) { + Location oldLocation = blocksList.get(i).getLocation(); + BlockPos oldPos = new BlockPos(oldLocation.getBlockX(), oldLocation.getBlockY(), oldLocation.getBlockZ()); + ImmutableBlockState blockState = world.getBlockStateAtIfLoaded(oldPos); + if (blockState.pushReaction() == PushReaction.DESTROY) { + // break actions + ContextHolder.Builder builder = ContextHolder.builder(); + Vec3d vec3d = Vec3d.atCenterOf(oldPos); + builder.withParameter(LootParameters.LOCATION, vec3d); + for (Item item : blockState.getDrops(builder, world.world())) { + world.world().dropItemNaturally(vec3d, item); + } + world.world().playBlockSound(vec3d, blockState.sounds().breakSound(),1f, 1f); + } + // to prevent duplication in other events + world.setBlockStateAtIfLoaded(oldPos, EmptyBlock.INSTANCE.getDefaultState()); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onEntityExplode(EntityExplodeEvent event) { + handleExplodeEvent(event.blockList(), new BukkitWorld(event.getEntity().getWorld()), event.getYield()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onBlockExplode(BlockExplodeEvent event) { + handleExplodeEvent(event.blockList(), new BukkitWorld(event.getBlock().getWorld()), event.getYield()); + } + + private void handleExplodeEvent(List blocks, net.momirealms.craftengine.core.world.World world, float yield) { + for (int i = blocks.size() - 1; i >= 0; i--) { + Block block = blocks.get(i); + Location location = block.getLocation(); + BlockPos blockPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + ImmutableBlockState state = manager.getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (state != null && !state.isEmpty()) { + ContextHolder.Builder builder = ContextHolder.builder(); + Vec3d vec3d = Vec3d.atCenterOf(blockPos); + builder.withParameter(LootParameters.LOCATION, vec3d); + if (yield < 1f) { + builder.withParameter(LootParameters.EXPLOSION_RADIUS, 1.0f / yield); + } + for (Item item : state.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + world.playBlockSound(vec3d, state.sounds().breakSound(), 1f, 1f); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onBlockPhysics(BlockPhysicsEvent event) { + if (!this.enableNoteBlockCheck) return; + Block block = event.getBlock(); + // for vanilla blocks + if (block.getBlockData() instanceof NoteBlock) { + try { + World world = block.getWorld(); + Location location = block.getLocation(); + Block sourceBlock = event.getSourceBlock(); + BlockFace direction = sourceBlock.getFace(block); + if (direction == BlockFace.UP || direction == BlockFace.DOWN) { + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(serverLevel); + Object blockPos = Reflections.constructor$BlockPos.newInstance(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + Reflections.method$ServerChunkCache$blockChanged.invoke(chunkSource, blockPos); + if (direction == BlockFace.UP) { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$UP, blockPos, 0); + } else { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$DOWN, blockPos, 0); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to sync note block states", e); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java new file mode 100644 index 000000000..fa31df587 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -0,0 +1,745 @@ +package net.momirealms.craftengine.bukkit.block; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import dev.dejvokep.boostedyaml.YamlDocument; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.KeyUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.util.RegistryUtils; +import net.momirealms.craftengine.core.block.*; +import net.momirealms.craftengine.core.block.properties.Properties; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.*; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.incendo.cloud.suggestion.Suggestion; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.io.File; +import java.lang.reflect.Field; +import java.nio.file.Path; +import java.util.*; + +public class BukkitBlockManager extends AbstractBlockManager { + private static BukkitBlockManager instance; + private final BukkitCraftEngine plugin; + + // Used to store override information of json files + private final Map> blockStateOverrides = new HashMap<>(); + + // A temporary map used to detect whether the same block state corresponds to multiple models. + private final Map tempRegistryIdConflictMap = new HashMap<>(); + // A temporary map that converts the custom block registered on the server to the vanilla block ID. + private final Map tempBlockAppearanceConvertor = new HashMap<>(); + + // The total amount of blocks registered + private int customBlockCount; + + // CraftEngine objects + private final Map id2CraftEngineBlocks = new HashMap<>(); + private final ImmutableBlockState[] stateId2ImmutableBlockStates; + + // Minecraft objects + // Cached new blocks $ holders + private ImmutableMap internalId2StateId; + private ImmutableMap stateId2BlockHolder; + // This map is used to change the block states that are not necessarily needed into a certain block state + private ImmutableMap blockAppearanceMapper; + // Used to automatically arrange block states for strings such as minecraft:note_block:0 + private ImmutableMap> blockAppearanceArranger; + // Record the amount of real blocks by block type + private LinkedHashMap registeredRealBlockSlots; + // A set of blocks that sounds have been removed + private ImmutableSet affectedSoundBlocks; + private ImmutableMap soundMapper; + // A list to record the order of registration + private List blockRegisterOrder = new ArrayList<>(); + + // Cached command suggestions + private final List cachedSuggestions = new ArrayList<>(); + // Event listeners + private final BlockEventListener blockEventListener; + private final FallingBlockRemoveListener fallingBlockRemoveListener; + + public BukkitBlockManager(BukkitCraftEngine plugin) { + super(plugin); + this.plugin = plugin; + this.initVanillaRegistry(); + this.loadMappingsAndAdditionalBlocks(); + if (plugin.hasMod() && plugin.requiresRestart()) { + blockEventListener = null; + fallingBlockRemoveListener = null; + stateId2ImmutableBlockStates = null; + return; + } + this.registerBlocks(); + this.registerEmptyBlock(); + this.initMirrorRegistry(); + boolean enableNoteBlocks = this.blockAppearanceArranger.containsKey(BlockKeys.NOTE_BLOCK); + this.blockEventListener = new BlockEventListener(plugin, this, enableNoteBlocks); + if (enableNoteBlocks) { + this.recordVanillaNoteBlocks(); + } + if (VersionHelper.isVersionNewerThan1_20_3()) { + this.fallingBlockRemoveListener = new FallingBlockRemoveListener(); + } else this.fallingBlockRemoveListener = null; + this.stateId2ImmutableBlockStates = new ImmutableBlockState[customBlockCount]; + Arrays.fill(this.stateId2ImmutableBlockStates, EmptyBlock.INSTANCE.getDefaultState()); + instance = this; + } + + public static BukkitBlockManager instance() { + return instance; + } + + @Override + public void load() { + Bukkit.getPluginManager().registerEvents(this.blockEventListener, plugin.bootstrap()); + if (this.fallingBlockRemoveListener != null) { + Bukkit.getPluginManager().registerEvents(this.fallingBlockRemoveListener, plugin.bootstrap()); + } + } + + @Override + public void unload() { + HandlerList.unregisterAll(this.blockEventListener); + if (this.fallingBlockRemoveListener != null) HandlerList.unregisterAll(this.fallingBlockRemoveListener); + super.clearModelsToGenerate(); + this.clearCache(); + this.id2CraftEngineBlocks.clear(); + this.cachedSuggestions.clear(); + this.blockStateOverrides.clear(); + if (EmptyBlock.INSTANCE != null) + Arrays.fill(this.stateId2ImmutableBlockStates, EmptyBlock.INSTANCE.getDefaultState()); + } + + @Override + public void disable() { + this.unload(); + } + + @Override + public Map soundMapper() { + return this.soundMapper; + } + + @Override + public void delayedLoad() { + initSuggestions(); + resetPacketConsumers(); + clearCache(); + } + + private void clearCache() { + this.tempRegistryIdConflictMap.clear(); + this.tempBlockAppearanceConvertor.clear(); + } + + @Nullable + public Object getMinecraftBlockHolder(int stateId) { + return stateId2BlockHolder.get(stateId); + } + + @NotNull + public ImmutableBlockState getImmutableBlockStateUnsafe(int stateId) { + return stateId2ImmutableBlockStates[stateId - BlockStateUtils.vanillaStateSize()]; + } + + @Nullable + public ImmutableBlockState getImmutableBlockState(int stateId) { + if (!BlockStateUtils.isVanillaBlock(stateId)) { + return stateId2ImmutableBlockStates[stateId - BlockStateUtils.vanillaStateSize()]; + } + return null; + } + + public void initFastAsyncWorldEditHook() { + // do nothing + } + + public void initWorldEditHook() { + for (Key newBlockId : this.blockRegisterOrder) { + WorldEditHook.register(newBlockId); + } + } + + @Override + public Map> blockOverrides() { + return blockStateOverrides; + } + + @Override + public Map blocks() { + return this.id2CraftEngineBlocks; + } + + @Override + public Optional getBlock(Key key) { + return Optional.ofNullable(this.id2CraftEngineBlocks.get(key)); + } + + @Override + public Collection cachedSuggestions() { + return this.cachedSuggestions; + } + + @Override + public void initSuggestions() { + this.cachedSuggestions.clear(); + Set states = new HashSet<>(); + for (CustomBlock block : this.id2CraftEngineBlocks.values()) { + states.add(block.id().toString()); + for (ImmutableBlockState state : block.variantProvider().states()) { + states.add(state.toString()); + } + } + for (String state : states) { + this.cachedSuggestions.add(Suggestion.suggestion(state)); + } + } + + private void initMirrorRegistry() { + int size = RegistryUtils.currentBlockRegistrySize(); + PackedBlockState[] states = new PackedBlockState[size]; + for (int i = 0; i < size; i++) { + states[i] = new PackedBlockState(BlockStateUtils.idToBlockState(i), i); + } + BlockRegistryMirror.init(states); + } + + private void registerEmptyBlock() { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), Key.withDefaultNamespace("empty"))); + EmptyBlock emptyBlock = new EmptyBlock(Key.withDefaultNamespace("empty"), holder); + holder.bindValue(emptyBlock); + } + + private void resetPacketConsumers() { + Map finalMapping = new HashMap<>(this.blockAppearanceMapper); + int stoneId = BlockStateUtils.blockStateToId(Reflections.instance$Blocks$STONE$defaultState); + for (int custom : this.internalId2StateId.values()) { + finalMapping.put(custom, stoneId); + } + finalMapping.putAll(this.tempBlockAppearanceConvertor); + PacketConsumers.init(finalMapping, RegistryUtils.currentBlockRegistrySize()); + } + + private void initVanillaRegistry() { + int vanillaStateCount; + if (plugin.hasMod()) { + try { + Class modClass = ReflectionUtils.getClazz("net.momirealms.craftengine.mod.CraftEnginePlugin"); + Field amountField = ReflectionUtils.getDeclaredField(modClass, "vanillaRegistrySize"); + vanillaStateCount = (int) amountField.get(null); + } catch (Exception e) { + vanillaStateCount = RegistryUtils.currentBlockRegistrySize(); + plugin.logger().severe("Fatal error", e); + } + } else { + vanillaStateCount = RegistryUtils.currentBlockRegistrySize(); + } + plugin.logger().info("Vanilla block count: " + vanillaStateCount); + BlockStateUtils.init(vanillaStateCount); + } + + @SuppressWarnings("unchecked") + private void registerBlocks() { + plugin.logger().info("Registering blocks. Please wait..."); + try { + ImmutableMap.Builder builder1 = ImmutableMap.builder(); + ImmutableMap.Builder builder2 = ImmutableMap.builder(); + Set affectedSounds = new HashSet<>(); + Set affectedBlocks = new HashSet<>(); + List order = new ArrayList<>(); + + unfreezeRegistry(); + + int counter = 0; + for (Map.Entry baseBlockAndItsCount : this.registeredRealBlockSlots.entrySet()) { + counter = registerBlockVariants(baseBlockAndItsCount, counter, builder1, builder2, affectedSounds, order); + } + + freezeRegistry(); + this.plugin.logger().info("Registered block count: " + counter); + this.customBlockCount = counter; + this.internalId2StateId = builder1.build(); + this.stateId2BlockHolder = builder2.build(); + this.blockRegisterOrder = ImmutableList.copyOf(order); + + for (Object block : (Iterable) Reflections.instance$BuiltInRegistries$BLOCK) { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(block); + if (affectedSounds.contains(soundType)) { + affectedBlocks.add(block); + } + } + + this.affectedSoundBlocks = ImmutableSet.copyOf(affectedBlocks); + + ImmutableMap.Builder soundMapperBuilder = ImmutableMap.builder(); + for (Object soundType : affectedSounds) { + for (Field field : List.of(Reflections.field$SoundType$placeSound, Reflections.field$SoundType$fallSound, Reflections.field$SoundType$hitSound, Reflections.field$SoundType$stepSound, Reflections.field$SoundType$breakSound)) { + Object soundEvent = field.get(soundType); + Key previousId = Key.of(Reflections.field$SoundEvent$location.get(soundEvent).toString()); + soundMapperBuilder.put(previousId, Key.of(previousId.namespace(), "replaced." + previousId.value())); + } + } + + this.soundMapper = soundMapperBuilder.build(); + } catch (Throwable e) { + plugin.logger().warn("Failed to inject blocks.", e); + } + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + // read block settings + BlockSettings settings = BlockSettings.fromMap(MiscUtils.castToMap(section.getOrDefault("settings", Map.of()), false)); + // read loot table + LootTable lootTable = LootTable.fromMap(MiscUtils.castToMap(section.getOrDefault("loot", Map.of()), false)); + // read states + Map> properties; + Map appearances; + Map variants; + Map stateSection = MiscUtils.castToMap(section.get("state"), true); + if (stateSection != null) { + properties = Map.of(); + int internalId = MiscUtils.getAsInt(stateSection.getOrDefault("id", -1)); + if (PreConditions.runIfTrue(internalId < 0, () -> plugin.logger().warn(path, "No state id configured for block " + id))) return; + Pair pair = parseAppearanceSection(path, stateSection, id); + if (pair == null) return; + appearances = Map.of("default", pair.right()); + Key internalBlockId = Key.of(CraftEngine.NAMESPACE, pair.left().value() + "_" + internalId); + int internalBlockRegistryId = MiscUtils.getAsInt(this.internalId2StateId.getOrDefault(internalBlockId, -1)); + if (internalBlockRegistryId == -1) { + plugin.logger().warn(path, "Failed to register " + id + " because id " + internalId + " is not a value between 0~" + (MiscUtils.getAsInt(this.registeredRealBlockSlots.get(pair.left()))-1) + + ". Consider editing additional-real-blocks.yml if the number of real block IDs is insufficient while there are still available appearances"); + return; + } + variants = Map.of("", new VariantState("default", settings, internalBlockRegistryId)); + } else { + Map statesSection = MiscUtils.castToMap(section.get("states"), true); + if (statesSection == null) { + plugin.logger().warn(path, "No states configured for block " + id); + return; + } + Map propertySection = MiscUtils.castToMap(statesSection.get("properties"), true); + if (PreConditions.isNull(propertySection, () -> plugin.logger().warn(path, "No properties configured for block " + id))) return; + properties = parseProperties(path, propertySection); + Map appearancesSection = MiscUtils.castToMap(statesSection.get("appearances"), true); + if (PreConditions.isNull(appearancesSection, () -> plugin.logger().warn(path, "No appearances configured for block " + id))) return; + appearances = new HashMap<>(); + Map tempTypeMap = new HashMap<>(); + for (Map.Entry appearanceEntry : appearancesSection.entrySet()) { + if (appearanceEntry.getValue() instanceof Map appearanceSection) { + Pair pair = parseAppearanceSection(path, MiscUtils.castToMap(appearanceSection, false), id); + if (pair == null) return; + appearances.put(appearanceEntry.getKey(), pair.right()); + tempTypeMap.put(appearanceEntry.getKey(), pair.left()); + } + } + Map variantsSection = MiscUtils.castToMap(statesSection.get("variants"), true); + if (PreConditions.isNull(variantsSection, () -> plugin.logger().warn(path, "No variants configured for block " + id))) return; + variants = new HashMap<>(); + for (Map.Entry variantEntry : variantsSection.entrySet()) { + if (variantEntry.getValue() instanceof Map variantSection0) { + Map variantSection = MiscUtils.castToMap(variantSection0, false); + String variantName = variantEntry.getKey(); + String appearance = (String) variantSection.get("appearance"); + if (appearance == null) { + plugin.logger().warn(path, "No appearance configured for variant " + variantName); + return; + } + if (!appearances.containsKey(appearance)) { + plugin.logger().warn(path, appearance + " is not a valid appearance for block " + id); + return; + } + int internalId = MiscUtils.getAsInt(variantSection.getOrDefault("id", -1)); + Key baseBlock = tempTypeMap.get(appearance); + Key internalBlockId = Key.of(CraftEngine.NAMESPACE, baseBlock.value() + "_" + internalId); + int internalBlockRegistryId = MiscUtils.getAsInt(this.internalId2StateId.getOrDefault(internalBlockId, -1)); + if (internalBlockRegistryId == -1) { + plugin.logger().warn(path, "Failed to register " + id + " because id " + internalId + " is not a value between 0~" + (MiscUtils.getAsInt(this.registeredRealBlockSlots.getOrDefault(baseBlock, 1))-1) + + ". Consider editing additional-real-blocks.yml if the number of real block IDs is insufficient while there are still available appearances"); + return; + } + Map anotherSetting = MiscUtils.castToMap(variantSection.get("settings"), true); + variants.put(variantName, new VariantState(appearance, anotherSetting == null ? settings : BlockSettings.ofFullCopy(settings, anotherSetting), internalBlockRegistryId)); + } + } + } + // create or get block holder + Holder.Reference holder = BuiltInRegistries.BLOCK.get(id).orElseGet(() -> + ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), id))); + // create block + Map behaviorSection = MiscUtils.castToMap(section.getOrDefault("behavior", Map.of()), false); + + CustomBlock block = new BukkitCustomBlock(id, holder, properties, appearances, variants, settings, behaviorSection, lootTable); + + // bind appearance + bindAppearance(block); + this.id2CraftEngineBlocks.put(id, block); + } + + private void bindAppearance(CustomBlock block) { + for (ImmutableBlockState state : block.variantProvider().states()) { + this.stateId2ImmutableBlockStates[state.customBlockState().registryId() - BlockStateUtils.vanillaStateSize()] = state; + this.tempBlockAppearanceConvertor.put(state.customBlockState().registryId(), state.vanillaBlockState().registryId()); + } + } + + private Map> parseProperties(Path path, Map propertiesSection) { + Map> properties = new HashMap<>(); + for (Map.Entry entry : propertiesSection.entrySet()) { + if (entry.getValue() instanceof Map params) { + Property property = Properties.fromMap(entry.getKey(), MiscUtils.castToMap(params, false)); + properties.put(entry.getKey(), property); + } else { + this.plugin.logger().warn(path, "Invalid property format: " + entry.getKey()); + } + } + return properties; + } + + @Nullable + private Pair parseAppearanceSection(Path path, Map section, Key id) { + String vanillaStateString = (String) section.get("state"); + if (PreConditions.isNull(vanillaStateString, + () -> this.plugin.logger().warn(path, "No block state found for: " + id))) return null; + int vanillaStateRegistryId; + try { + vanillaStateRegistryId = parseVanillaStateRegistryId(vanillaStateString); + } catch (BlockStateArrangeException e) { + this.plugin.logger().warn(path, "Failed to load " + id + " - " + e.getMessage(), e); + return null; + } + Key ifAny = this.tempRegistryIdConflictMap.get(vanillaStateRegistryId); + if (ifAny != null && !ifAny.equals(id)) { + this.plugin.logger().warn(path, "Can't use " + BlockStateUtils.idToBlockState(vanillaStateRegistryId) + " as the base block for " + id + " because the state has already been used by " + ifAny); + return null; + } + Object models = section.getOrDefault("models", section.get("model")); + List variants = new ArrayList<>(); + if (models instanceof Map singleModelSection) { + loadVariantModel(variants, MiscUtils.castToMap(singleModelSection, false)); + } else if (models instanceof List modelList) { + for (Object model : modelList) { + if (model instanceof Map singleModelMap) { + loadVariantModel(variants, MiscUtils.castToMap(singleModelMap, false)); + } + } + } else { + this.plugin.logger().warn(path, "No model set for " + id); + return null; + } + if (variants.isEmpty()) return null; + this.tempRegistryIdConflictMap.put(vanillaStateRegistryId, id); + String blockState = BlockStateUtils.idToBlockState(vanillaStateRegistryId).toString(); + Key block = Key.of(blockState.substring(blockState.indexOf('{') + 1, blockState.lastIndexOf('}'))); + String propertyData = blockState.substring(blockState.indexOf('[') + 1, blockState.lastIndexOf(']')); + Map paths = this.blockStateOverrides.computeIfAbsent(block, k -> new HashMap<>()); + if (variants.size() == 1) { + paths.put(propertyData, variants.get(0)); + } else { + JsonArray array = new JsonArray(); + for (JsonObject object : variants) { + array.add(object); + } + paths.put(propertyData, array); + } + return Pair.of(block, vanillaStateRegistryId); + } + + private void loadVariantModel(List variants, Map singleModelMap) { + JsonObject json = new JsonObject(); + String modelPath = (String) singleModelMap.get("path"); + json.addProperty("model", modelPath); + if (singleModelMap.containsKey("x")) json.addProperty("x", MiscUtils.getAsInt(singleModelMap.get("x"))); + if (singleModelMap.containsKey("y")) json.addProperty("y", MiscUtils.getAsInt(singleModelMap.get("y"))); + if (singleModelMap.containsKey("uvlock")) json.addProperty("uvlock", (boolean) singleModelMap.get("uvlock")); + if (singleModelMap.containsKey("weight")) json.addProperty("weight", MiscUtils.getAsInt(singleModelMap.get("weight"))); + Map generationMap = MiscUtils.castToMap(singleModelMap.get("generation"), true); + if (generationMap != null) { + prepareModelGeneration(new ModelGeneration(Key.of(modelPath), generationMap)); + } + variants.add(json); + } + + private int parseVanillaStateRegistryId(String blockState) throws BlockStateArrangeException { + String[] split = blockState.split(":", 3); + PreConditions.runIfTrue(split.length >= 4, () -> { + throw new BlockStateArrangeException("Invalid vanilla block state: " + blockState); + }); + int registryId; + // minecraft:xxx:0 + // xxx:0 + String stateOrId = split[split.length - 1]; + boolean isId = !stateOrId.contains("[") && !stateOrId.contains("]"); + if (isId) { + if (split.length == 1) { + throw new BlockStateArrangeException("Invalid vanilla block state: " + blockState); + } + Key block = split.length == 2 ? Key.of(split[0]) : Key.of(split[0], split[1]); + try { + int id = split.length == 2 ? Integer.parseInt(split[1]) : Integer.parseInt(split[2]); + PreConditions.runIfTrue(id < 0, () -> { + throw new BlockStateArrangeException("Invalid block state: " + blockState); + }); + List arranger = this.blockAppearanceArranger.get(block); + PreConditions.isNull(arranger == null, () -> { + throw new BlockStateArrangeException("No freed block state is available for block " + block); + }); + assert arranger != null; + if (id >= arranger.size()) { + throw new BlockStateArrangeException(blockState + " is not a valid block state because " + id + " is outside of the range (0~" + (arranger.size() - 1) + ")"); + } + registryId = arranger.get(id); + } catch (NumberFormatException e) { + throw new BlockStateArrangeException("Invalid block state: " + blockState); + } + } else { + try { + BlockData blockData = Bukkit.createBlockData(blockState); + registryId = BlockStateUtils.blockDataToId(blockData); + } catch (IllegalArgumentException e) { + throw new BlockStateArrangeException("Invalid block state: " + blockState); + } + } + return registryId; + } + + private void loadMappingsAndAdditionalBlocks() { + this.plugin.logger().info("Loading mappings.yml."); + File mappingFile = new File(plugin.dataFolderFile(), "mappings.yml"); + YamlDocument mappings = plugin.loadOrCreateYamlData("mappings.yml"); + Map blockStateMappings = loadBlockStateMappings(mappings); + this.validateBlockStateMappings(mappingFile, blockStateMappings); + Map stateMap = new HashMap<>(); + Map blockTypeCounter = new LinkedHashMap<>(); + Map appearanceMapper = new HashMap<>(); + Map> appearanceArranger = new HashMap<>(); + for (Map.Entry entry : blockStateMappings.entrySet()) { + this.processBlockStateMapping(mappingFile, entry, stateMap, blockTypeCounter, appearanceMapper, appearanceArranger); + } + this.blockAppearanceMapper = ImmutableMap.copyOf(appearanceMapper); + this.blockAppearanceArranger = ImmutableMap.copyOf(appearanceArranger); + this.plugin.logger().info("Freed " + this.blockAppearanceMapper.size() + " block state appearances."); + YamlDocument additionalYaml = plugin.loadOrCreateYamlData("additional-real-blocks.yml"); + this.registeredRealBlockSlots = this.buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); + } + + private void recordVanillaNoteBlocks() { + try { + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, BlockKeys.NOTE_BLOCK.namespace(), BlockKeys.NOTE_BLOCK.value()); + Object block = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + Object stateDefinition = Reflections.field$Block$StateDefinition.get(block); + @SuppressWarnings("unchecked") + ImmutableList states = (ImmutableList) Reflections.field$StateDefinition$states.get(stateDefinition); + for (Object state : states) { + BlockStateUtils.CLIENT_SIDE_NOTE_BLOCKS.put(state, new Object()); + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to init vanilla note block", e); + } + } + + @Nullable + public Key replaceSoundIfExist(Key id) { + return this.soundMapper.get(id); + } + + public boolean isBlockSoundRemoved(Object block) { + return this.affectedSoundBlocks.contains(block); + } + + private Map loadBlockStateMappings(YamlDocument mappings) { + Map blockStateMappings = new LinkedHashMap<>(); + for (Map.Entry entry : mappings.getStringRouteMappedValues(false).entrySet()) { + if (entry.getValue() instanceof String afterValue) { + blockStateMappings.put(entry.getKey(), afterValue); + } + } + return blockStateMappings; + } + + private void validateBlockStateMappings(File mappingFile, Map blockStateMappings) { + Map temp = new HashMap<>(blockStateMappings); + for (Map.Entry entry : temp.entrySet()) { + String state = entry.getValue(); + if (blockStateMappings.containsKey(state)) { + String after = blockStateMappings.remove(state); + plugin.logger().warn(mappingFile, "'" + state + ": " + after + "' is invalid because '" + state + "' has already been used as a base block."); + } + } + } + + private void processBlockStateMapping(File mappingFile, + Map.Entry entry, + Map stateMap, + Map counter, + Map mapper, + Map> arranger) { + BlockData before = createBlockData(mappingFile, entry.getKey()); + BlockData after = createBlockData(mappingFile, entry.getValue()); + if (before == null || after == null) return; + + int beforeId = BlockStateUtils.blockDataToId(before); + int afterId = BlockStateUtils.blockDataToId(after); + + Integer previous = mapper.put(beforeId, afterId); + if (previous == null) { + Key key = KeyUtils.namespacedKey2Key(before.getMaterial().getKey()); + counter.compute(key, (k, count) -> count == null ? 1 : count + 1); + stateMap.put(beforeId, entry.getKey()); + stateMap.put(afterId, entry.getValue()); + arranger.computeIfAbsent(key, (k) -> new ArrayList<>()).add(beforeId); + } else { + String previousState = stateMap.get(previous); + plugin.logger().warn(mappingFile, "Duplicate entry: '" + previousState + "' equals '" + entry.getKey() + "'"); + } + } + + private BlockData createBlockData(File mappingFile, String blockState) { + try { + return Bukkit.createBlockData(blockState); + } catch (IllegalArgumentException e) { + plugin.logger().warn(mappingFile, "'" + blockState + "' is not a valid block state."); + return null; + } + } + + private LinkedHashMap buildRegisteredRealBlockSlots(Map counter, YamlDocument additionalYaml) { + LinkedHashMap map = new LinkedHashMap<>(); + for (Map.Entry entry : counter.entrySet()) { + String id = entry.getKey().toString(); + int additionalStates = additionalYaml.getInt(id, 0); + int internalIds = entry.getValue() + additionalStates; + plugin.logger().info("Loaded " + id + " with " + entry.getValue() + " appearances and " + internalIds + " real block states"); + map.put(entry.getKey(), internalIds); + } + return map; + } + + private void unfreezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$BuiltInRegistries$BLOCK, false); + Reflections.field$MappedRegistry$unregisteredIntrusiveHolders.set(Reflections.instance$BuiltInRegistries$BLOCK, new IdentityHashMap<>()); + } + + private void freezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$BuiltInRegistries$BLOCK, true); + } + + private int registerBlockVariants(Map.Entry blockWithCount, + int counter, + ImmutableMap.Builder builder1, + ImmutableMap.Builder builder2, + Set affectSoundTypes, + List order) throws Exception { + Key clientSideBlockType = blockWithCount.getKey(); + boolean isNoteBlock = clientSideBlockType.equals(BlockKeys.NOTE_BLOCK); + Object clientSideBlock = getBlockFromRegistry(createResourceLocation(clientSideBlockType)); + int amount = blockWithCount.getValue(); + + for (int i = 0; i < amount; i++) { + Key realBlockKey = createRealBlockKey(clientSideBlockType, i); + Object blockProperties = createBlockProperties(realBlockKey); + + Object newRealBlock; + Object newBlockState; + Object blockHolder; + Object resourceLocation = createResourceLocation(realBlockKey); + + if (plugin.hasMod()) { + newRealBlock = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + newBlockState = getOnlyBlockState(newRealBlock); + @SuppressWarnings("unchecked") + Optional optionalHolder = (Optional) Reflections.method$Registry$getHolder0.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + blockHolder = optionalHolder.get(); + } else { + try { + newRealBlock = BukkitInjector.generateBlock(clientSideBlockType, clientSideBlock, blockProperties); + } catch (Throwable throwable) { + plugin.logger().warn("Failed to generate dynamic block class", throwable); + continue; + } + + blockHolder = Reflections.method$Registry$registerForHolder.invoke(null, Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation, newRealBlock); + Reflections.method$Holder$Reference$bindValue.invoke(blockHolder, newRealBlock); + Reflections.field$Holder$Reference$tags.set(blockHolder, Set.of()); + + newBlockState = getOnlyBlockState(newRealBlock); + Reflections.method$IdMapper$add.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, newBlockState); + } + + if (isNoteBlock) { + BlockStateUtils.CLIENT_SIDE_NOTE_BLOCKS.put(newBlockState, new Object()); + } + + int stateId = BlockStateUtils.vanillaStateSize() + counter; + + builder1.put(realBlockKey, stateId); + builder2.put(stateId, blockHolder); + + deceiveBukkit(newRealBlock, clientSideBlockType); + order.add(realBlockKey); + counter++; + } + + Object soundType = Reflections.field$BlockBehaviour$soundType.get(clientSideBlock); + affectSoundTypes.add(soundType); + return counter; + } + + private Object createResourceLocation(Key key) throws Exception { + return Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value()); + } + + private Object getBlockFromRegistry(Object resourceLocation) throws Exception { + return Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + } + + private Key createRealBlockKey(Key replacedBlock, int index) { + return Key.of(CraftEngine.NAMESPACE, replacedBlock.value() + "_" + index); + } + + private Object createBlockProperties(Key realBlockKey) throws Exception { + Object blockProperties = Reflections.method$BlockBehaviour$Properties$of.invoke(null); + Object realBlockResourceLocation = createResourceLocation(realBlockKey); + Object realBlockResourceKey = Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$BLOCK, realBlockResourceLocation); + if (Reflections.field$BlockBehaviour$Properties$id != null) { + Reflections.field$BlockBehaviour$Properties$id.set(blockProperties, realBlockResourceKey); + } + return blockProperties; + } + + private Object getOnlyBlockState(Object newBlock) throws IllegalAccessException { + Object stateDefinition = Reflections.field$Block$StateDefinition.get(newBlock); + @SuppressWarnings("unchecked") + ImmutableList states = (ImmutableList) Reflections.field$StateDefinition$states.get(stateDefinition); + return states.get(0); + } + + private void deceiveBukkit(Object newBlock, Key replacedBlock) throws IllegalAccessException { + @SuppressWarnings("unchecked") + Map magicMap = (Map) Reflections.field$CraftMagicNumbers$BLOCK_MATERIAL.get(null); + magicMap.put(newBlock, org.bukkit.Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(replacedBlock.toString())))); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java new file mode 100644 index 000000000..a349d33a9 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.shared.block.BlockShape; + +public class BukkitBlockShape implements BlockShape { + private final Object rawBlockState; + + public BukkitBlockShape(Object rawBlockState) { + this.rawBlockState = rawBlockState; + } + + @Override + public Object getShape(Object thisObj, Object[] args) throws Exception { + return Reflections.method$BlockBehaviour$getShape.invoke(Reflections.field$StateHolder$owner.get(this.rawBlockState), this.rawBlockState, args[1], args[2], args[3]); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java new file mode 100644 index 000000000..6cd231677 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java @@ -0,0 +1,124 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.util.SoundUtils; +import net.momirealms.craftengine.core.block.*; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.Tristate; +import net.momirealms.craftengine.shared.ObjectHolder; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class BukkitCustomBlock extends CustomBlock { + + public BukkitCustomBlock( + Key id, + Holder.Reference holder, + Map> properties, + Map appearances, + Map variantMapper, + BlockSettings settings, + Map behaviorSettings, + @Nullable LootTable lootTable + ) { + super(id, holder, properties, appearances, variantMapper, settings, behaviorSettings, lootTable); + } + + @SuppressWarnings("unchecked") + @Nullable + @Override + public LootTable lootTable() { + return (LootTable) super.lootTable(); + } + + @Override + protected void applyPlatformSettings() { + try { + for (ImmutableBlockState state : variantProvider().states()) { + if (state.vanillaBlockState() == null) { + CraftEngine.instance().logger().warn("Could not find vanilla block state for " + state + ". This might cause errors!"); + continue; + } else if (state.customBlockState() == null) { + CraftEngine.instance().logger().warn("Could not find custom block state for " + state + ". This might cause errors!"); + continue; + } + Object mcBlockState = state.customBlockState().handle(); + BlockSettings settings = state.settings(); + // set block state properties + BlockStateUtils.setInstrument(mcBlockState, settings.instrument()); + BlockStateUtils.setMapColor(mcBlockState, settings.mapColor()); + BlockStateUtils.setLightEmission(mcBlockState, settings.luminance()); + BlockStateUtils.setBurnable(mcBlockState, settings.burnable()); + BlockStateUtils.setHardness(mcBlockState, settings.hardness()); + BlockStateUtils.setPushReaction(mcBlockState, settings.pushReaction()); + BlockStateUtils.setReplaceable(mcBlockState, settings.replaceable()); + BlockStateUtils.setCanOcclude(mcBlockState, settings.canOcclude()); + if (settings.isRedstoneConductor() == Tristate.TRUE) { + BlockStateUtils.setIsRedstoneConductor(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isRedstoneConductor() == Tristate.FALSE) { + BlockStateUtils.setIsRedstoneConductor(mcBlockState, StatePredicate.alwaysFalse()); + } + if (settings.isSuffocating() == Tristate.TRUE) { + BlockStateUtils.setIsSuffocating(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isSuffocating() == Tristate.FALSE) { + BlockStateUtils.setIsSuffocating(mcBlockState, StatePredicate.alwaysFalse()); + } + if (settings.isViewBlocking() == Tristate.TRUE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isViewBlocking() == Tristate.FALSE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysFalse()); + } else { + if (settings.isSuffocating() == Tristate.TRUE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isSuffocating() == Tristate.FALSE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysFalse()); + } + } + // set parent block properties + Object mcBlock = BlockStateUtils.getBlockOwner(mcBlockState); + // bind shape + Field shapeField = mcBlock.getClass().getField("shapeHolder"); + @SuppressWarnings("unchecked") + ObjectHolder shapeHolder = (ObjectHolder) shapeField.get(mcBlock); + shapeHolder.bindValue(new BukkitBlockShape(state.vanillaBlockState().handle())); + // bind behavior + Field behaviorField = mcBlock.getClass().getField("behaviorHolder"); + @SuppressWarnings("unchecked") + ObjectHolder behaviorHolder = (ObjectHolder) behaviorField.get(mcBlock); + behaviorHolder.bindValue(super.behavior); + // set block side properties + Reflections.field$BlockBehaviour$explosionResistance.set(mcBlock, settings.resistance()); + Reflections.field$BlockBehaviour$soundType.set(mcBlock, SoundUtils.toSoundType(settings.sounds())); + // init cache + Reflections.method$BlockStateBase$initCache.invoke(mcBlockState); + // set random tick later + BlockStateUtils.setIsRandomlyTicking(mcBlockState, settings.isRandomlyTicking()); + // bind tags + Object holder = BukkitCraftEngine.instance().blockManager().getMinecraftBlockHolder(state.customBlockState().registryId()); + Set tags = new HashSet<>(); + for (Key tag : settings.tags()) { + tags.add(Reflections.method$TagKey$create.invoke(null, Reflections.instance$Registries$BLOCK, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, tag.namespace(), tag.value()))); + } + Reflections.field$Holder$Reference$tags.set(holder, tags); + // set burning properties + if (settings.burnable()) { + Reflections.method$FireBlock$setFlammable.invoke(Reflections.instance$Blocks$FIRE, mcBlock, settings.burnChance(), settings.fireSpreadChance()); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to init block settings", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java new file mode 100644 index 000000000..8f8f29392 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.entity.FallingBlock; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class FallingBlockRemoveListener implements Listener { + + /* + * This is not an event that would be removed + * Paper mistakenly marked it as deprecated in 1.20.4 + */ + @SuppressWarnings("removal") + @EventHandler + public void onFallingBlockBreak(org.bukkit.event.entity.EntityRemoveEvent event) { + if (event.getCause() == org.bukkit.event.entity.EntityRemoveEvent.Cause.DROP && event.getEntity() instanceof FallingBlock fallingBlock) { + try { + Object fallingBlockEntity = Reflections.field$CraftEntity$entity.get(fallingBlock); + boolean cancelDrop = (boolean) Reflections.field$FallingBlockEntity$cancelDrop.get(fallingBlockEntity); + if (cancelDrop) return; + Object blockState = Reflections.field$FallingBlockEntity$blockState.get(fallingBlockEntity); + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null || immutableBlockState.isEmpty()) return; + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.FALLING_BLOCK, true); + double x = Reflections.field$Entity$xo.getDouble(fallingBlockEntity); + double y = Reflections.field$Entity$yo.getDouble(fallingBlockEntity); + double z = Reflections.field$Entity$zo.getDouble(fallingBlockEntity); + Vec3d vec3d = new Vec3d(x, y, z); + builder.withParameter(LootParameters.LOCATION, vec3d); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(fallingBlock.getWorld()); + for (Item item : immutableBlockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to handle EntityRemoveEvent", e); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/WorldEditHook.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/WorldEditHook.java new file mode 100644 index 000000000..5110083dd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/WorldEditHook.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.bukkit.block; + +import com.sk89q.worldedit.world.block.BlockType; +import net.momirealms.craftengine.core.util.Key; + +public class WorldEditHook { + + public static void register(Key id) { + BlockType.REGISTRY.register(id.toString(), new BlockType(id.toString(), blockState -> blockState)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java new file mode 100644 index 000000000..1f3273528 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.core.block.behavior.BlockBehaviors; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.shared.block.EmptyBlockBehavior; + +public class BukkitBlockBehaviors extends BlockBehaviors { + public static final Key EMPTY = Key.from("craftengine:empty"); + public static final Key BUSH_BLOCK = Key.from("craftengine:bush_block"); + public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); + public static final Key LEAVES_BLOCK = Key.from("craftengine:leaves_block"); + + public static void init() { + register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); + register(FALLING_BLOCK, FallingBlockBehavior.FACTORY); + register(BUSH_BLOCK, BushBlockBehavior.FACTORY); + register(LEAVES_BLOCK, LeavesBlockBehavior.FACTORY); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java new file mode 100644 index 000000000..f6a60445f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -0,0 +1,96 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.BlockTags; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.World; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class BushBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + public static final BushBlockBehavior INSTANCE = new BushBlockBehavior(); + private static final Object DIRT_TAG = BlockTags.getOrCreate(Key.of("minecraft", "dirt")); + private static final Object FARMLAND = BlockTags.getOrCreate(Key.of("minecraft", "farmland")); + + @Override + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world = args[1]; + Object blockPos = args[2]; + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level; + Object blockPos; + Object state = args[0]; + if (VersionHelper.isVersionNewerThan1_21_2()) { + level = args[1]; + blockPos = args[3]; + } else { + level = args[3]; + blockPos = args[4]; + } + if (!canSurvive(thisBlock, state, level, blockPos)) { + ImmutableBlockState previousState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + if (previousState != null && !previousState.isEmpty()) { + ContextHolder.Builder builder = ContextHolder.builder(); + BlockPos pos = LocationUtils.fromBlockPos(blockPos); + Vec3d vec3d = Vec3d.atCenterOf(pos); + builder.withParameter(LootParameters.LOCATION, vec3d); + net.momirealms.craftengine.core.world.World world = new BukkitWorld((World) Reflections.method$Level$getCraftWorld.invoke(level)); + for (Item item : previousState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + return Reflections.method$Block$defaultBlockState.invoke(Reflections.instance$Blocks$AIR); + } + return super.updateShape(thisBlock, args, superMethod); + } + + @Override + public boolean canSurvive(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object state = args[0]; + Object world = args[1]; + Object pos = args[2]; + return canSurvive(thisBlock, state, world, pos); + } + + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + return INSTANCE; + } + } + + private boolean canSurvive(Object thisBlock, Object state, Object world, Object blockPos) throws ReflectiveOperationException { + int y = Reflections.field$Vec3i$y.getInt(blockPos); + int x = Reflections.field$Vec3i$x.getInt(blockPos); + int z = Reflections.field$Vec3i$z.getInt(blockPos); + Object belowPos = Reflections.constructor$BlockPos.newInstance(x, y - 1, z); + Object belowState = Reflections.method$BlockGetter$getBlockState.invoke(world, belowPos); + return mayPlaceOn(belowState, world, belowPos); + } + + private boolean mayPlaceOn(Object belowState, Object world, Object blockPos) throws ReflectiveOperationException { + boolean isDirt = (boolean) Reflections.method$BlockStateBase$hasTag.invoke(belowState, DIRT_TAG); + if (isDirt) return true; + return (boolean) Reflections.method$BlockStateBase$hasTag.invoke(belowState, FARMLAND); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java new file mode 100644 index 000000000..b7d473f7c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -0,0 +1,112 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.World; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class FallingBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + private final float hurtAmount; + private final int maxHurt; + + public FallingBlockBehavior(float hurtAmount, int maxHurt) { + this.hurtAmount = hurtAmount; + this.maxHurt = maxHurt; + } + + @Override + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world = args[1]; + Object blockPos = args[2]; + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world; + Object blockPos; + if (VersionHelper.isVersionNewerThan1_21_2()) { + world = args[1]; + blockPos = args[3]; + } else { + world = args[3]; + blockPos = args[4]; + } + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + return super.updateShape(thisBlock, args, superMethod); + } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockPos = args[2]; + int y = Reflections.field$Vec3i$y.getInt(blockPos); + Object world = args[1]; + Object dimension = Reflections.method$$LevelReader$dimensionType.invoke(world); + int minY = Reflections.field$DimensionType$minY.getInt(dimension); + if (y < minY) { + return; + } + int x = Reflections.field$Vec3i$x.getInt(blockPos); + int z = Reflections.field$Vec3i$z.getInt(blockPos); + Object belowPos = Reflections.constructor$BlockPos.newInstance(x, y - 1, z); + Object belowState = Reflections.method$BlockGetter$getBlockState.invoke(world, belowPos); + boolean isFree = (boolean) Reflections.method$FallingBlock$isFree.invoke(null, belowState); + if (!isFree) { + return; + } + Object blockState = args[0]; + Object fallingBlockEntity = Reflections.method$FallingBlockEntity$fall.invoke(null, world, blockPos, blockState); + if (this.hurtAmount > 0 && this.maxHurt > 0) { + Reflections.method$FallingBlockEntity$setHurtsEntities.invoke(fallingBlockEntity, this.hurtAmount, this.maxHurt); + } + } + + @Override + public void onBrokenAfterFall(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + // Use EntityRemoveEvent for 1.20.3+ + if (VersionHelper.isVersionNewerThan1_20_3()) return; + Object level = args[0]; + Object fallingBlockEntity = args[2]; + boolean cancelDrop = (boolean) Reflections.field$FallingBlockEntity$cancelDrop.get(fallingBlockEntity); + if (cancelDrop) return; + Object blockState = Reflections.field$FallingBlockEntity$blockState.get(fallingBlockEntity); + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null || immutableBlockState.isEmpty()) return; + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.FALLING_BLOCK, true); + double x = Reflections.field$Entity$xo.getDouble(fallingBlockEntity); + double y = Reflections.field$Entity$yo.getDouble(fallingBlockEntity); + double z = Reflections.field$Entity$zo.getDouble(fallingBlockEntity); + Vec3d vec3d = new Vec3d(x, y, z); + builder.withParameter(LootParameters.LOCATION, vec3d); + net.momirealms.craftengine.core.world.World world = new BukkitWorld((World) Reflections.method$Level$getCraftWorld.invoke(level)); + for (Item item : immutableBlockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + float hurtAmount = MiscUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f)); + int hurtMax = MiscUtils.getAsInt(arguments.getOrDefault("max-hurt", -1)); + return new FallingBlockBehavior(hurtAmount, hurtMax); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java new file mode 100644 index 000000000..e2042ac13 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -0,0 +1,194 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.BlockTags; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.event.block.LeavesDecayEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class LeavesBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + private static final Object LOG_TAG = BlockTags.getOrCreate(Key.of("minecraft", "logs")); + private final int maxDistance; + private final Property distanceProperty; + private final Property persistentProperty; + @Nullable + private final Property waterloggedProperty; + + public LeavesBlockBehavior(int maxDistance, Property distanceProperty, Property persistentProperty, @Nullable Property waterloggedProperty) { + this.maxDistance = maxDistance; + this.distanceProperty = distanceProperty; + this.persistentProperty = persistentProperty; + this.waterloggedProperty = waterloggedProperty; + } + + public int getDistance(ImmutableBlockState state) { + return state.get(this.distanceProperty); + } + + public boolean isPersistent(ImmutableBlockState state) { + return state.get(this.persistentProperty); + } + + public boolean isWaterLogged(ImmutableBlockState state) { + if (this.waterloggedProperty == null) return false; + return state.get(this.waterloggedProperty); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world; + Object blockPos; + Object neighborState; + Object blockState = args[0]; + if (VersionHelper.isVersionNewerThan1_21_2()) { + world = args[1]; + neighborState = args[6]; + blockPos = args[3]; + } else { + world = args[3]; + blockPos = args[4]; + neighborState = args[2]; + } + ImmutableBlockState thisState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (thisState != null && thisState.behavior() instanceof LeavesBlockBehavior behavior) { + int distance = behavior.getDistanceAt(neighborState) + 1; + if (distance != 1 || behavior.getDistance(thisState) != distance) { + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 1); + } + } + return blockState; + } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockState = args[0]; + Object level = args[1]; + Object blockPos = args[2]; + ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (currentState != null && !currentState.isEmpty() && currentState.behavior() instanceof LeavesBlockBehavior behavior) { + ImmutableBlockState newState = behavior.updateDistance(currentState, level, blockPos); + if (newState != currentState) { + if (blockState == newState.customBlockState().handle()) { + Reflections.method$BlockStateBase$updateNeighbourShapes.invoke(blockState, level, blockPos, UpdateOption.UPDATE_ALL.flags(), 512); + } else { + Reflections.method$Level$setBlock.invoke(level, blockPos, newState.customBlockState().handle(), UpdateOption.UPDATE_ALL.flags()); + } + } + } + } + + @Override + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level = args[1]; + Object blockPos = args[2]; + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(args[0])); + if (immutableBlockState != null && immutableBlockState.behavior() instanceof LeavesBlockBehavior behavior && behavior.isDecaying(immutableBlockState)) { + World bukkitWorld = (World) Reflections.method$Level$getCraftWorld.invoke(level); + BlockPos pos = LocationUtils.fromBlockPos(blockPos); + // call bukkit event + LeavesDecayEvent event = new LeavesDecayEvent(bukkitWorld.getBlockAt(pos.x(), pos.y(), pos.z())); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + Reflections.method$Level$removeBlock.invoke(level, blockPos, false); + if (isWaterLogged(immutableBlockState)) { + bukkitWorld.setBlockData(pos.x(), pos.y(), pos.z(), Material.WATER.createBlockData()); + } + Vec3d vec3d = Vec3d.atCenterOf(pos); + ContextHolder.Builder builder = ContextHolder.builder() + .withParameter(LootParameters.LOCATION, vec3d); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(bukkitWorld); + for (Item item : immutableBlockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + } + + private boolean isDecaying(ImmutableBlockState blockState) { + return !isPersistent(blockState) && getDistance(blockState) == this.maxDistance; + } + + private ImmutableBlockState updateDistance(ImmutableBlockState state, Object world, Object blockPos) throws ReflectiveOperationException { + int i = this.maxDistance; + Object mutablePos = Reflections.constructor$MutableBlockPos.newInstance(); + int j = Direction.values().length; + for (int k = 0; k < j; ++k) { + Object direction = Reflections.instance$Directions[k]; + Reflections.method$MutableBlockPos$setWithOffset.invoke(mutablePos, blockPos, direction); + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(world, mutablePos); + i = Math.min(i, getDistanceAt(blockState) + 1); + if (i == 1) { + break; + } + } + return state.with(this.distanceProperty, i); + } + + private int getDistanceAt(Object blockState) throws ReflectiveOperationException { + boolean isLog = (boolean) Reflections.method$BlockStateBase$hasTag.invoke(blockState, LOG_TAG); + if (isLog) return 0; + int id = BlockStateUtils.blockStateToId(blockState); + if (BlockStateUtils.isVanillaBlock(id)) { + Object distanceProperty = Reflections.field$LeavesBlock$DISTANCE.get(null); + boolean hasDistanceProperty = (boolean) Reflections.method$StateHolder$hasProperty.invoke(blockState, distanceProperty); + if (!hasDistanceProperty) return this.maxDistance; + return (int) Reflections.method$StateHolder$getValue.invoke(blockState, distanceProperty); + } else { + ImmutableBlockState anotherBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(id); + if (!(anotherBlockState.behavior() instanceof LeavesBlockBehavior otherBehavior)) return this.maxDistance; + return otherBehavior.getDistance(anotherBlockState); + } + } + + @SuppressWarnings("unchecked") + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + Property persistent = (Property) block.getProperty("persistent"); + if (persistent == null) { + throw new NullPointerException("persistent property not set for block " + block.id()); + } + Property distance = (Property) block.getProperty("distance"); + if (distance == null) { + throw new NullPointerException("distance not set for block " + block.id()); + } + Property waterlogged = (Property) block.getProperty("waterlogged"); + int actual = distance.possibleValues().get(distance.possibleValues().size() - 1); + return new LeavesBlockBehavior(actual, distance, persistent, waterlogged); + } + } + + @Override + public Object getFluidState(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockState = args[0]; + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (state == null || state.isEmpty() || waterloggedProperty == null) return super.getFluidState(thisBlock, args, superMethod); + boolean waterlogged = state.get(waterloggedProperty); + return waterlogged ? Reflections.method$FlowingFluid$getSource.invoke(Reflections.instance$Fluids$WATER, false) : super.getFluidState(thisBlock, args, superMethod); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/DisplayEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/DisplayEntityData.java new file mode 100644 index 000000000..28889589e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/DisplayEntityData.java @@ -0,0 +1,112 @@ +package net.momirealms.craftengine.bukkit.entity; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.List; + +public class DisplayEntityData { + + private final int id; + private final Object serializer; + private final T defaultValue; + + // Entity + public static final DisplayEntityData EntityMasks = of(0, EntityDataValue.Serializers$BYTE, (byte) 0); + + // Display only + public static final DisplayEntityData InterpolationDelay = of(8, EntityDataValue.Serializers$INT, 0); + + // 1.19.4-1.20.1 + public static final DisplayEntityData InterpolationDuration = of(9, EntityDataValue.Serializers$INT, 0); + + // 1.20.2+ + public static final DisplayEntityData TransformationInterpolationDuration = of(9, EntityDataValue.Serializers$INT, 0); + public static final DisplayEntityData PositionRotationInterpolationDuration = of(10, EntityDataValue.Serializers$INT, 0); + + public static final DisplayEntityData Translation = of(11, EntityDataValue.Serializers$VECTOR3, Reflections.instance$Vector3f$None); + public static final DisplayEntityData Scale = of(12, EntityDataValue.Serializers$VECTOR3, Reflections.instance$Vector3f$Normal); + public static final DisplayEntityData RotationLeft = of(13, EntityDataValue.Serializers$QUATERNION, Reflections.instance$Quaternionf$None); + public static final DisplayEntityData RotationRight = of(14, EntityDataValue.Serializers$QUATERNION, Reflections.instance$Quaternionf$None); + /** + * Billboard Constraints (0 = FIXED, 1 = VERTICAL, 2 = HORIZONTAL, 3 = CENTER) + */ + public static final DisplayEntityData BillboardConstraints = of(15, EntityDataValue.Serializers$BYTE, (byte) 0); + /** + * Brightness override (blockLight << 4 | skyLight << 20) + */ + public static final DisplayEntityData BrightnessOverride = of(16, EntityDataValue.Serializers$INT, -1); + public static final DisplayEntityData ViewRange = of(17, EntityDataValue.Serializers$FLOAT, 1f); + public static final DisplayEntityData ShadowRadius = of(18, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData ShadowStrength = of(19, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData Width = of(20, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData Height = of(21, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData GlowColorOverride = of(22, EntityDataValue.Serializers$INT, -1); + + // Text display only + public static final DisplayEntityData Text = of(23, EntityDataValue.Serializers$COMPONENT, Reflections.instance$Component$empty); + public static final DisplayEntityData LineWidth = of(24, EntityDataValue.Serializers$INT, 200); + public static final DisplayEntityData BackgroundColor = of(25, EntityDataValue.Serializers$INT, 0x40000000); + public static final DisplayEntityData TextOpacity = of(26, EntityDataValue.Serializers$BYTE, (byte) -1); + public static final DisplayEntityData TextDisplayMasks = of(27, EntityDataValue.Serializers$BYTE, (byte) 0); + + // Item display only + public static final DisplayEntityData DisplayedItem = of(23, EntityDataValue.Serializers$ITEM_STACK, Reflections.instance$ItemStack$Air); + /** + * Display type: + * 0 = NONE + * 1 = THIRD_PERSON_LEFT_HAND + * 2 = THIRD_PERSON_RIGHT_HAND + * 3 = FIRST_PERSON_LEFT_HAND + * 4 = FIRST_PERSON_RIGHT_HAND + * 5 = HEAD + * 6 = GUI + * 7 = GROUND + * 8 = FIXED + */ + public static final DisplayEntityData DisplayType = of(24, EntityDataValue.Serializers$BYTE, (byte) 0); + + // Block display only + public static final DisplayEntityData DisplayedBlock = of(23, EntityDataValue.Serializers$BLOCK_STATE, Reflections.instance$Blocks$AIR$defaultState); + + public static DisplayEntityData of(final int id, final Object serializer, T defaultValue) { + return new DisplayEntityData<>(id, serializer, defaultValue); + } + + public DisplayEntityData(int id, Object serializer, T defaultValue) { + if (!VersionHelper.isVersionNewerThan1_20_2()) { + if (id >= 11) { + id--; + } + } + this.id = id; + this.serializer = serializer; + this.defaultValue = defaultValue; + } + + public Object serializer() { + return serializer; + } + + public int id() { + return id; + } + + public T defaultValue() { + return defaultValue; + } + + public Object createEntityDataIfNotDefaultValue(T value) { + if (defaultValue().equals(value)) return null; + return EntityDataValue.create(id, serializer, value); + } + + public void addEntityDataIfNotDefaultValue(T value, List list) { + if (defaultValue().equals(value)) return; + list.add(EntityDataValue.create(id, serializer, value)); + } + + public void addEntityData(T value, List list) { + list.add(EntityDataValue.create(id, serializer, value)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/EntityDataValue.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/EntityDataValue.java new file mode 100644 index 000000000..288e7dbc1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/EntityDataValue.java @@ -0,0 +1,104 @@ +package net.momirealms.craftengine.bukkit.entity; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; + +public class EntityDataValue { + private static int internalID = 0; + + private static final String[] fieldsObf = { + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" + }; + + public static final Object Serializers$BYTE; + public static final Object Serializers$INT; + public static final Object Serializers$LONG; + public static final Object Serializers$FLOAT; + public static final Object Serializers$STRING; + public static final Object Serializers$COMPONENT; + public static final Object Serializers$OPTIONAL_COMPONENT; + public static final Object Serializers$ITEM_STACK; + public static final Object Serializers$BLOCK_STATE; + public static final Object Serializers$OPTIONAL_BLOCK_STATE; + public static final Object Serializers$BOOLEAN; + public static final Object Serializers$PARTICLE; + public static final Object Serializers$PARTICLES; + public static final Object Serializers$ROTATIONS; + public static final Object Serializers$BLOCK_POS; + public static final Object Serializers$OPTIONAL_BLOCK_POS; + public static final Object Serializers$DIRECTION; + public static final Object Serializers$OPTIONAL_UUID; + public static final Object Serializers$OPTIONAL_GLOBAL_POS; + public static final Object Serializers$COMPOUND_TAG; + public static final Object Serializers$VILLAGER_DATA; + public static final Object Serializers$OPTIONAL_UNSIGNED_INT; + public static final Object Serializers$POSE; + public static final Object Serializers$CAT_VARIANT; + public static final Object Serializers$WOLF_VARIANT; + public static final Object Serializers$FROG_VARIANT; + public static final Object Serializers$PAINTING_VARIANT; + public static final Object Serializers$ARMADILLO_STATE; + public static final Object Serializers$SNIFFER_STATE; + public static final Object Serializers$VECTOR3; + public static final Object Serializers$QUATERNION; + + static { + try { + Serializers$BYTE = initSerializersByName("BYTE"); + Serializers$INT = initSerializersByName("INT"); + Serializers$LONG = initSerializersByName("LONG"); + Serializers$FLOAT = initSerializersByName("FLOAT"); + Serializers$STRING = initSerializersByName("STRING"); + Serializers$COMPONENT = initSerializersByName("COMPONENT"); + Serializers$OPTIONAL_COMPONENT = initSerializersByName("OPTIONAL_COMPONENT"); + Serializers$ITEM_STACK = initSerializersByName("ITEM_STACK"); + Serializers$BLOCK_STATE = initSerializersByName("BLOCK_STATE"); + Serializers$OPTIONAL_BLOCK_STATE = initSerializersByName("OPTIONAL_BLOCK_STATE"); + Serializers$BOOLEAN = initSerializersByName("BOOLEAN"); + Serializers$PARTICLE = initSerializersByName("PARTICLE"); + if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$PARTICLES = initSerializersByName("PARTICLES"); + else Serializers$PARTICLES = null; + Serializers$ROTATIONS = initSerializersByName("ROTATIONS"); + Serializers$BLOCK_POS = initSerializersByName("BLOCK_POS"); + Serializers$OPTIONAL_BLOCK_POS = initSerializersByName("OPTIONAL_BLOCK_POS"); + Serializers$DIRECTION = initSerializersByName("DIRECTION"); + Serializers$OPTIONAL_UUID = initSerializersByName("OPTIONAL_UUID"); + Serializers$OPTIONAL_GLOBAL_POS = initSerializersByName("OPTIONAL_GLOBAL_POS"); + Serializers$COMPOUND_TAG = initSerializersByName("COMPOUND_TAG"); + Serializers$VILLAGER_DATA = initSerializersByName("VILLAGER_DATA"); + Serializers$OPTIONAL_UNSIGNED_INT = initSerializersByName("OPTIONAL_UNSIGNED_INT"); + Serializers$POSE = initSerializersByName("POSE"); + Serializers$CAT_VARIANT = initSerializersByName("CAT_VARIANT"); + if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$WOLF_VARIANT = initSerializersByName("WOLF_VARIANT"); + else Serializers$WOLF_VARIANT = null; + Serializers$FROG_VARIANT = initSerializersByName("FROG_VARIANT"); + Serializers$PAINTING_VARIANT = initSerializersByName("PAINTING_VARIANT"); + if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$ARMADILLO_STATE = initSerializersByName("ARMADILLO_STATE"); + else Serializers$ARMADILLO_STATE = null; + Serializers$SNIFFER_STATE = initSerializersByName("SNIFFER_STATE"); + Serializers$VECTOR3 = initSerializersByName("VECTOR3"); + Serializers$QUATERNION = initSerializersByName("QUATERNION"); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + private static Object initSerializersByName(String name) throws ReflectiveOperationException { + return ReflectionUtils.getDeclaredField(Reflections.clazz$EntityDataSerializers, new String[]{fieldsObf[internalID++], name}).get(null); + } + + private EntityDataValue() { + throw new IllegalAccessError("Utility class"); + } + + public static Object create(int id, Object serializer, Object value) { + try { + Object entityDataAccessor = Reflections.constructor$EntityDataAccessor.newInstance(id, serializer); + return Reflections.method$SynchedEntityData$DataValue$create.invoke(null, entityDataAccessor, value); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/InteractionEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/InteractionEntityData.java new file mode 100644 index 000000000..3193c0d13 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/InteractionEntityData.java @@ -0,0 +1,60 @@ +package net.momirealms.craftengine.bukkit.entity; + +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.List; + +public class InteractionEntityData { + + private final int id; + private final Object serializer; + private final T defaultValue; + + // Entity + public static final InteractionEntityData EntityMasks = of(0, EntityDataValue.Serializers$BYTE, (byte) 0); + // Interaction only + public static final InteractionEntityData Width = of(8, EntityDataValue.Serializers$FLOAT, 1F); + public static final InteractionEntityData Height = of(9, EntityDataValue.Serializers$FLOAT, 1F); + public static final InteractionEntityData Responsive = of(10, EntityDataValue.Serializers$BOOLEAN, false); + + public static InteractionEntityData of(final int id, final Object serializer, T defaultValue) { + return new InteractionEntityData<>(id, serializer, defaultValue); + } + + public InteractionEntityData(int id, Object serializer, T defaultValue) { + if (!VersionHelper.isVersionNewerThan1_20_2()) { + if (id >= 11) { + id--; + } + } + this.id = id; + this.serializer = serializer; + this.defaultValue = defaultValue; + } + + public Object serializer() { + return serializer; + } + + public int id() { + return id; + } + + public T defaultValue() { + return defaultValue; + } + + public Object createEntityDataIfNotDefaultValue(T value) { + if (defaultValue().equals(value)) return null; + return EntityDataValue.create(id, serializer, value); + } + + public void addEntityDataIfNotDefaultValue(T value, List list) { + if (defaultValue().equals(value)) return; + list.add(EntityDataValue.create(id, serializer, value)); + } + + public void addEntityData(T value, List list) { + list.add(EntityDataValue.create(id, serializer, value)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java new file mode 100644 index 000000000..ceb3d0126 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -0,0 +1,347 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent; +import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; +import net.momirealms.craftengine.bukkit.legacy.listener.DismountListener1_20; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.entity.furniture.AnchorType; +import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDismountEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.EntitiesLoadEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.joml.Quaternionf; +import org.joml.Vector3d; +import org.joml.Vector3f; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +public class BukkitFurnitureManager implements FurnitureManager, Listener { + public static final NamespacedKey FURNITURE_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:furniture_id")); + public static final NamespacedKey FURNITURE_ANCHOR_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:anchor_type")); + public static final NamespacedKey FURNITURE_SEAT_BASE_ENTITY_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:seat_to_base_entity")); + public static final NamespacedKey FURNITURE_SEAT_VECTOR_3F_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:seat_vector")); + private static BukkitFurnitureManager instance; + private final BukkitCraftEngine plugin; + private final Listener dismountListener; + private final Map furnitureByBaseEntityId; + private final Map furnitureByInteractionEntityId; + private final Map baseEntity2SubEntities; + private static final int DELAYED_TICK = 5; + // Delay furniture cache remove for about 4-5 ticks + private final IntSet[] delayedRemove = new IntSet[DELAYED_TICK]; + + public BukkitFurnitureManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + this.furnitureByBaseEntityId = new ConcurrentHashMap<>(256, 0.5f); + this.furnitureByInteractionEntityId = new ConcurrentHashMap<>(512, 0.5f); + this.baseEntity2SubEntities = new ConcurrentHashMap<>(256, 0.5f); + this.dismountListener = VersionHelper.isVersionNewerThan1_20_3() ? new DismountListener1_20_3() : new DismountListener1_20(this::handleDismount); + for (int i = 0; i < DELAYED_TICK; i++) { + this.delayedRemove[i] = new IntOpenHashSet(); + } + instance = this; + } + + public void tick() { + IntSet first = delayedRemove[0]; + for (int i : first) { + // unloaded furniture might be loaded again + LoadedFurniture furniture = getLoadedFurnitureByBaseEntityId(i); + if (furniture == null) + this.baseEntity2SubEntities.remove(i); + } + first.clear(); + for (int i = 1; i < DELAYED_TICK; i++) { + delayedRemove[i - 1] = delayedRemove[i]; + } + delayedRemove[DELAYED_TICK-1] = first; + } + + public void delayedLoad() { + for (World world : Bukkit.getWorlds()) { + List entities = world.getEntities(); + for (Entity entity : entities) { + handleEntityLoadEarly(entity); + } + } + } + + @Override + public void unload() { + HandlerList.unregisterAll(this); + HandlerList.unregisterAll(this.dismountListener); + } + + @Override + public void load() { + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + Bukkit.getPluginManager().registerEvents(this.dismountListener, plugin.bootstrap()); + } + + @Override + public void disable() { + unload(); + for (Player player : Bukkit.getOnlinePlayers()) { + Entity vehicle = player.getVehicle(); + if (vehicle != null) { + tryLeavingSeat(player, vehicle); + } + } + } + + @Nullable + public int[] getSubEntityIdsByBaseEntityId(int entityId) { + return this.baseEntity2SubEntities.get(entityId); + } + + public boolean isFurnitureBaseEntity(int entityId) { + return this.furnitureByBaseEntityId.containsKey(entityId); + } + + @Nullable + public LoadedFurniture getLoadedFurnitureByBaseEntityId(int entityId) { + return this.furnitureByBaseEntityId.get(entityId); + } + + @Nullable + public LoadedFurniture getLoadedFurnitureByInteractionEntityId(int entityId) { + return this.furnitureByInteractionEntityId.get(entityId); + } + + public static BukkitFurnitureManager instance() { + return instance; + } + + /* + * Load Entities + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onEntitiesLoadEarly(EntitiesLoadEvent event) { + List entities = event.getEntities(); + for (Entity entity : entities) { + handleEntityLoadEarly(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onWorldLoad(WorldLoadEvent event) { + List entities = event.getWorld().getEntities(); + for (Entity entity : entities) { + handleEntityLoadEarly(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onEntityLoad(EntityAddToWorldEvent event) { + handleEntityLoadLate(event.getEntity()); + } + + /* + * Unload Entities + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onChunkUnload(ChunkUnloadEvent event) { + Entity[] entities = event.getChunk().getEntities(); + for (Entity entity : entities) { + handleEntityUnload(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onWorldUnload(WorldUnloadEvent event) { + List entities = event.getWorld().getEntities(); + for (Entity entity : entities) { + handleEntityUnload(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onEntityUnload(EntityRemoveFromWorldEvent event) { + handleEntityUnload(event.getEntity()); + } + + private void handleEntityUnload(Entity entity) { + int id = entity.getEntityId(); + LoadedFurniture furniture = this.furnitureByBaseEntityId.remove(id); + if (furniture != null) { + furniture.destroySeats(); + for (int sub : furniture.interactionEntityIds()) { + this.furnitureByInteractionEntityId.remove(sub); + } + this.delayedRemove[DELAYED_TICK-1].add(id); + } + } + + @SuppressWarnings("deprecation") + public void handleEntityLoadLate(Entity entity) { + if (entity instanceof ItemDisplay display) { + String id = entity.getPersistentDataContainer().get(FURNITURE_KEY, PersistentDataType.STRING); + if (id == null) return; + Key key = Key.of(id); + Optional> optionalItem = plugin.itemManager().getCustomItem(key); + if (optionalItem.isEmpty()) return; + CustomItem customItem = optionalItem.get(); + if (!(customItem.behavior() instanceof FurnitureItemBehavior behavior)) return; + LoadedFurniture previous = this.furnitureByBaseEntityId.get(display.getEntityId()); + if (previous != null) return; + Quaternionf rotation = display.getTransformation().getRightRotation(); + LoadedFurniture furniture = addNewFurniture(display, key, behavior, getAnchorType(entity, behavior), rotation); + for (Player player : display.getTrackedPlayers()) { + plugin.networkManager().sendPacket(player, furniture.spawnPacket()); + } + } + } + + public void handleEntityLoadEarly(Entity entity) { + if (entity instanceof ItemDisplay display) { + String id = entity.getPersistentDataContainer().get(FURNITURE_KEY, PersistentDataType.STRING); + if (id == null) return; + Key key = Key.of(id); + Optional> optionalItem = plugin.itemManager().getCustomItem(key); + if (optionalItem.isPresent()) { + Quaternionf rotation = display.getTransformation().getRightRotation(); + CustomItem customItem = optionalItem.get(); + if (customItem.behavior() instanceof FurnitureItemBehavior behavior) { + LoadedFurniture previous = this.furnitureByBaseEntityId.get(display.getEntityId()); + if (previous != null) return; + addNewFurniture(display, key, behavior, getAnchorType(entity, behavior), rotation); + return; + } + } + // Remove the entity if it's not a valid furniture + if (ConfigManager.removeInvalidFurniture()) { + if (ConfigManager.furnitureToRemove().isEmpty() || ConfigManager.furnitureToRemove().contains(id)) { + entity.remove(); + } + } + } + } + + private AnchorType getAnchorType(Entity entity, FurnitureItemBehavior behavior) { + String anchorType = entity.getPersistentDataContainer().get(FURNITURE_ANCHOR_KEY, PersistentDataType.STRING); + if (anchorType != null) { + try { + AnchorType unverified = AnchorType.valueOf(anchorType); + if (behavior.isAllowedPlacement(unverified)) { + return unverified; + } + } catch (IllegalArgumentException ignored) { + } + } + AnchorType anchorTypeEnum = behavior.getAnyPlacement(); + entity.getPersistentDataContainer().set(FURNITURE_ANCHOR_KEY, PersistentDataType.STRING, anchorTypeEnum.name()); + return anchorTypeEnum; + } + + private synchronized LoadedFurniture addNewFurniture(ItemDisplay display, Key key, FurnitureItemBehavior behavior, AnchorType anchorType, Quaternionf rotation) { + Location location = display.getLocation(); + LoadedFurniture furniture = new LoadedFurniture(key, display, behavior, anchorType, new Vector3d(location.getX(), location.getY(), location.getZ()), rotation); + this.furnitureByBaseEntityId.put(furniture.baseEntityId(), furniture); + this.baseEntity2SubEntities.put(furniture.baseEntityId(), furniture.subEntityIds()); + for (int entityId : furniture.interactionEntityIds()) { + this.furnitureByInteractionEntityId.put(entityId, furniture); + } + return furniture; + } + + public class DismountListener1_20_3 implements Listener { + @EventHandler(ignoreCancelled = true) + public void onDismount(EntityDismountEvent event) { + if (event.getEntity() instanceof Player player) { + handleDismount(player, event.getDismounted()); + } + } + } + + public void handleDismount(Player player, Entity entity) { + if (!isSeatCarrier(entity)) return; + Location location = entity.getLocation(); + plugin.scheduler().sync().runDelayed(() -> tryLeavingSeat(player, entity), player.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + Entity entity = player.getVehicle(); + if (entity == null) return; + if (isSeatCarrier(entity)) { + tryLeavingSeat(player, entity); + } + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getPlayer(); + Entity entity = player.getVehicle(); + if (entity == null) return; + if (isSeatCarrier(entity)) { + tryLeavingSeat(player, entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onInteractArmorStand(PlayerInteractAtEntityEvent event) { + Entity clicked = event.getRightClicked(); + if (clicked instanceof ArmorStand armorStand) { + Integer baseFurniture = armorStand.getPersistentDataContainer().get(FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER); + if (baseFurniture == null) return; + event.setCancelled(true); + } + } + + private void tryLeavingSeat(@NotNull Player player, @NotNull Entity vehicle) { + Integer baseFurniture = vehicle.getPersistentDataContainer().get(FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER); + if (baseFurniture == null) return; + vehicle.remove(); + LoadedFurniture furniture = getLoadedFurnitureByBaseEntityId(baseFurniture); + if (furniture == null) { + return; + } + String vector3f = vehicle.getPersistentDataContainer().get(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING); + if (vector3f == null) { + plugin.logger().warn("Failed to get vector3f for player " + player.getName() + "'s seat"); + return; + } + Vector3f seatPos = MiscUtils.getVector3f(vector3f); + if (!furniture.releaseSeat(seatPos)) { + plugin.logger().warn("Failed to release seat " + seatPos + " for player " + player.getName()); + } + } + + public boolean isSeatCarrier(Entity entity) { + return (entity instanceof ArmorStand || entity instanceof ItemDisplay); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java new file mode 100644 index 000000000..c753f725a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -0,0 +1,287 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import net.momirealms.craftengine.bukkit.entity.DisplayEntityData; +import net.momirealms.craftengine.bukkit.entity.InteractionEntityData; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; +import net.momirealms.craftengine.bukkit.legacy.util.LegacyAttributeUtils; +import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.entity.furniture.AnchorType; +import net.momirealms.craftengine.core.entity.furniture.FurnitureElement; +import net.momirealms.craftengine.core.entity.furniture.HitBox; +import net.momirealms.craftengine.core.entity.furniture.Seat; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.ArrayUtils; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.QuaternionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.Location; +import org.bukkit.SoundCategory; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.joml.Quaternionf; +import org.joml.Vector3d; +import org.joml.Vector3f; + +import java.util.*; + +public class LoadedFurniture { + private final Key id; + private final Entity baseEntity; + private final FurnitureItemBehavior behavior; + private final Map elements; + private final Map hitboxes; + private final int[] subEntityIds; + private final int[] interactionEntityIds; + private final Vector3d position; + private final Set occupiedSeats = Collections.synchronizedSet(new HashSet<>()); + private final int baseEntityId; + private final Quaternionf rotation; + private final Vector seats = new Vector<>(); + private Object cachedSpawnPacket; + + public LoadedFurniture(Key id, + Entity baseEntity, + FurnitureItemBehavior behavior, + AnchorType anchorType, + Vector3d position, + Quaternionf rotation) { + this.id = id; + this.baseEntityId = baseEntity.getEntityId(); + this.rotation = rotation; + this.position = position; + this.baseEntity = baseEntity; + this.behavior = behavior; + this.hitboxes = new HashMap<>(); + this.elements = new HashMap<>(); + List entityIds = new ArrayList<>(); + List interactionEntityIds = new ArrayList<>(); + FurnitureItemBehavior.FurniturePlacement placement = behavior.getPlacement(anchorType); + for (FurnitureElement element : placement.elements()) { + int entityId = Reflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); + entityIds.add(entityId); + this.elements.put(entityId, element); + } + for (HitBox hitBox : placement.hitbox()) { + int entityId = Reflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); + entityIds.add(entityId); + interactionEntityIds.add(entityId); + this.hitboxes.put(entityId, hitBox); + } + this.subEntityIds = new int[entityIds.size()]; + for (int i = 0; i < entityIds.size(); ++i) { + this.subEntityIds[i] = entityIds.get(i); + } + this.interactionEntityIds = new int[interactionEntityIds.size()]; + for (int i = 0; i < interactionEntityIds.size(); ++i) { + this.interactionEntityIds[i] = interactionEntityIds.get(i); + } + } + + private void resetSpawnPackets() { + try { + List packets = new ArrayList<>(); + for (Map.Entry entry : elements.entrySet()) { + int entityId = entry.getKey(); + FurnitureElement element = entry.getValue(); + Item item = BukkitItemManager.instance().createWrappedItem(element.item(), null); + if (item == null) { + CraftEngine.instance().logger().warn("Failed to create furniture element for " + id + " because item " + element.item() + " not found"); + continue; + } + item.load(); + + Vector3f offset = new Quaternionf(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w).conjugate().transform(new Vector3f(element.offset())); + Object addEntityPacket = Reflections.constructor$ClientboundAddEntityPacket.newInstance( + entityId, UUID.randomUUID(), position.x() + offset.x, position.y() + offset.y, position.z() - offset.z, 0, 0, + Reflections.instance$EntityType$ITEM_DISPLAY, 0, Reflections.instance$Vec3$Zero, 0 + ); + + ArrayList values = new ArrayList<>(); + DisplayEntityData.DisplayedItem.addEntityDataIfNotDefaultValue(item.getLiteralObject(), values); + DisplayEntityData.Scale.addEntityDataIfNotDefaultValue(element.scale(), values); + DisplayEntityData.RotationRight.addEntityDataIfNotDefaultValue(this.rotation, values); + DisplayEntityData.RotationLeft.addEntityDataIfNotDefaultValue(element.rotation(), values); + DisplayEntityData.BillboardConstraints.addEntityDataIfNotDefaultValue(element.billboard().id(), values); + DisplayEntityData.Translation.addEntityDataIfNotDefaultValue(element.translation(), values); + DisplayEntityData.DisplayType.addEntityDataIfNotDefaultValue(element.transform().id(), values); + Object setDataPacket = Reflections.constructor$ClientboundSetEntityDataPacket.newInstance(entityId, values); + + packets.add(addEntityPacket); + packets.add(setDataPacket); + } + for (Map.Entry entry : hitboxes.entrySet()) { + int entityId = entry.getKey(); + HitBox hitBox = entry.getValue(); + Vector3f offset = new Quaternionf(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w).conjugate().transform(new Vector3f(hitBox.offset())); + Object addEntityPacket = Reflections.constructor$ClientboundAddEntityPacket.newInstance( + entityId, UUID.randomUUID(), position.x() + offset.x, position.y() + offset.y, position.z() - offset.z, 0, 0, + Reflections.instance$EntityType$INTERACTION, 0, Reflections.instance$Vec3$Zero, 0 + ); + + ArrayList values = new ArrayList<>(); + InteractionEntityData.Height.addEntityDataIfNotDefaultValue(hitBox.size().y, values); + InteractionEntityData.Width.addEntityDataIfNotDefaultValue(hitBox.size().x, values); + InteractionEntityData.Responsive.addEntityDataIfNotDefaultValue(hitBox.responsive(), values); + Object setDataPacket = Reflections.constructor$ClientboundSetEntityDataPacket.newInstance(entityId, values); + + packets.add(addEntityPacket); + packets.add(setDataPacket); + } + this.cachedSpawnPacket = Reflections.constructor$ClientboundBundlePacket.newInstance(packets); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to init spawn packets for furniture " + id, e); + } + } + + public Object spawnPacket() { + if (this.cachedSpawnPacket == null) { + this.resetSpawnPackets(); + } + return this.cachedSpawnPacket; + } + + public boolean isValid() { + return this.baseEntity.isValid(); + } + + public void onPlayerDestroy(Player player) { + if (!isValid()) return; + Location location = baseEntity.getLocation(); + this.baseEntity.remove(); + for (Entity entity : this.seats) { + for (Entity passenger : entity.getPassengers()) { + entity.removePassenger(passenger); + } + entity.remove(); + } + this.seats.clear(); + LootTable lootTable = behavior.lootTable(); + Vec3d vec3d = new Vec3d(position.x(), position.y(), position.z()); + if (lootTable != null && !player.isCreativeMode()) { + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.PLAYER, player); + List> items = lootTable.getRandomItems(builder.build(), new BukkitWorld(this.baseEntity.getWorld())); + for (Item item : items) { + ItemStack itemStack = item.load(); + if (ItemUtils.isEmpty(itemStack)) continue; + location.getWorld().dropItemNaturally(LocationUtils.toBlockCenterLocation(location), itemStack); + } + } + location.getWorld().playSound(location, behavior.sounds().breakSound().toString(), SoundCategory.BLOCKS,1f, 1f); + } + + public void destroySeats() { + for (Entity entity : this.seats) { + entity.remove(); + } + this.seats.clear(); + } + + public void addSeatEntity(Entity entity) { + this.seats.add(entity); + } + + public Optional getAvailableSeat(int clickedEntityId) { + HitBox hitbox = this.hitboxes.get(clickedEntityId); + if (hitbox == null) + return Optional.empty(); + Seat[] seats = hitbox.seats(); + if (ArrayUtils.isEmpty(seats)) { + return Optional.empty(); + } + for (Seat seat : seats) { + if (!this.occupiedSeats.contains(seat.offset())) { + return Optional.of(seat); + } + } + return Optional.empty(); + } + + public Location getSeatLocation(Seat seat) { + Vector3f offset = new Quaternionf(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w).conjugate().transform(new Vector3f(seat.offset())); + double yaw = -Math.toDegrees(QuaternionUtils.quaternionToPitch(this.rotation)) + seat.yaw(); + if (yaw < -180) yaw += 360; + return new Location(null, position.x() + offset.x, position.y() + offset.y + 0.6, position.z() - offset.z, (float) yaw, 0f); + } + + public boolean releaseSeat(Vector3f seat) { + return this.occupiedSeats.remove(seat); + } + + public boolean occupySeat(Seat seat) { + if (this.occupiedSeats.contains(seat.offset())) { + return false; + } + this.occupiedSeats.add(seat.offset()); + return true; + } + + public int baseEntityId() { + return baseEntityId; + } + + public int[] interactionEntityIds() { + return interactionEntityIds; + } + + public int[] subEntityIds() { + return this.subEntityIds; + } + + public FurnitureItemBehavior behavior() { + return behavior; + } + + public Entity baseEntity() { + return this.baseEntity; + } + + public void mountSeat(org.bukkit.entity.Player player, Seat seat) { + Location location = this.getSeatLocation(seat); + Entity seatEntity = seat.limitPlayerRotation() ? + EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isVersionNewerThan1_20_2() ? location.subtract(0,0.9875,0) : location.subtract(0,0.990625,0), EntityType.ARMOR_STAND, entity -> { + ArmorStand armorStand = (ArmorStand) entity; + if (VersionHelper.isVersionNewerThan1_21_3()) { + Objects.requireNonNull(armorStand.getAttribute(Attribute.MAX_HEALTH)).setBaseValue(0.01); + } else { + LegacyAttributeUtils.setMaxHealth(armorStand); + } + armorStand.setSmall(true); + armorStand.setInvisible(true); + armorStand.setSilent(true); + armorStand.setInvulnerable(true); + armorStand.setArms(false); + armorStand.setCanTick(false); + armorStand.setAI(false); + armorStand.setGravity(false); + armorStand.setPersistent(false); + armorStand.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER, this.baseEntityId()); + armorStand.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING, seat.offset().x + ", " + seat.offset().y + ", " + seat.offset().z); + }) : + EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isVersionNewerThan1_20_2() ? location : location.subtract(0,0.25,0), EntityType.ITEM_DISPLAY, entity -> { + ItemDisplay itemDisplay = (ItemDisplay) entity; + itemDisplay.setPersistent(false); + itemDisplay.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER, this.baseEntityId()); + itemDisplay.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING, seat.offset().x + ", " + seat.offset().y + ", " + seat.offset().z); + }); + this.addSeatEntity(seatEntity); + seatEntity.addPassenger(player); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java new file mode 100644 index 000000000..287e6f2ad --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java @@ -0,0 +1,124 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.MaterialUtils; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.EmptyItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemModifier; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class BukkitCustomItem implements CustomItem { + private final Key id; + private final Key materialKey; + private final Material material; + private final List> modifiers; + private final ItemBehavior behavior; + + public BukkitCustomItem(Key id, Key materialKey, Material material, List> modifiers, ItemBehavior behavior) { + this.id = id; + this.material = material; + this.modifiers = modifiers; + this.behavior = behavior; + this.materialKey = materialKey; + } + + @Override + public Key id() { + return id; + } + + @Override + public Key material() { + return materialKey; + } + + @Override + public List> modifiers() { + return modifiers; + } + + @Override + public ItemStack buildItemStack(Player player, int count) { + ItemStack item = new ItemStack(material); + if (this.modifiers.isEmpty()) { + return item; + } + Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); + wrapped.count(count); + for (ItemModifier modifier : this.modifiers) { + modifier.apply(wrapped, player); + } + return wrapped.load(); + } + + @Override + public Item buildItem(Player player) { + ItemStack item = new ItemStack(material); + Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); + for (ItemModifier modifier : modifiers()) { + modifier.apply(wrapped, player); + } + return wrapped; + } + + @Override + public ItemBehavior behavior() { + return this.behavior; + } + + public static Builder builder() { + return new BuilderImpl(); + } + + public static class BuilderImpl implements Builder { + private Key id; + private Material material; + private Key materialKey; + private ItemBehavior behavior = EmptyItemBehavior.INSTANCE; + private final List> modifiers = new ArrayList<>(); + + @Override + public Builder id(Key id) { + this.id = id; + return this; + } + + @Override + public Builder material(Key material) { + this.materialKey = material; + this.material = MaterialUtils.getMaterial(material.value()); + return this; + } + + @Override + public Builder modifier(ItemModifier modifier) { + this.modifiers.add(modifier); + return this; + } + + @Override + public Builder modifiers(List> list) { + this.modifiers.addAll(list); + return this; + } + + @Override + public Builder behavior(ItemBehavior behavior) { + this.behavior= behavior; + return this; + } + + @Override + public CustomItem build() { + return new BukkitCustomItem(id, materialKey, material, modifiers, behavior); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java new file mode 100644 index 000000000..4403d0645 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -0,0 +1,428 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.bukkit.item.factory.BukkitItemFactory; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.bukkit.util.MaterialUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.AbstractItemManager; +import net.momirealms.craftengine.core.item.BuildableItem; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; +import net.momirealms.craftengine.core.item.modifier.CustomModelDataModifier; +import net.momirealms.craftengine.core.item.modifier.IdModifier; +import net.momirealms.craftengine.core.pack.LegacyOverridesModel; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.*; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceKey; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.incendo.cloud.type.Either; +import org.jetbrains.annotations.Nullable; + +import java.nio.file.Path; +import java.util.*; + +public class BukkitItemManager extends AbstractItemManager { + private static BukkitItemManager instance; + private final BukkitItemFactory factory; + private final Map> legacyOverrides; + private final Map> modernOverrides; + private final BukkitCraftEngine plugin; + private final ItemEventListener itemEventListener; + private final Map>> vanillaItemTags; + private final Map>> customItemTags; + private final Map> cmdConflictChecker; + + public BukkitItemManager(BukkitCraftEngine plugin) { + super(plugin); + this.plugin = plugin; + this.factory = BukkitItemFactory.create(plugin); + this.legacyOverrides = new HashMap<>(); + this.modernOverrides = new HashMap<>(); + this.vanillaItemTags = new HashMap<>(); + this.customItemTags = new HashMap<>(); + this.cmdConflictChecker = new HashMap<>(); + this.itemEventListener = new ItemEventListener(plugin); + this.registerAllVanillaItems(); + instance = this; + } + + public static BukkitItemManager instance() { + return instance; + } + + @Override + public Optional> getVanillaItem(Key key) { + Material material = Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(key.toString()))); + if (material == null) { + return Optional.empty(); + } + return Optional.of(new CloneableConstantItem(new ItemStack(material))); + } + + @Override + public List> tagToItems(Key tag) { + List> items = new ArrayList<>(); + List> holders = vanillaItemTags.get(tag); + if (holders != null) { + items.addAll(holders); + } + List> customItems = customItemTags.get(tag); + if (customItems != null) { + items.addAll(customItems); + } + return items; + } + + @Override + public List> tagToVanillaItems(Key tag) { + return this.vanillaItemTags.getOrDefault(tag, List.of()); + } + + @Override + public List> tagToCustomItems(Key tag) { + return this.customItemTags.getOrDefault(tag, List.of()); + } + + @Override + public void load() { + super.load(); + Bukkit.getPluginManager().registerEvents(this.itemEventListener, plugin.bootstrap()); + } + + @Override + public void unload() { + super.unload(); + this.legacyOverrides.clear(); + this.modernOverrides.clear(); + this.customItemTags.clear(); + HandlerList.unregisterAll(this.itemEventListener); + this.cmdConflictChecker.clear(); + } + + @Override + public ItemStack buildCustomItemStack(Key id, Player player) { + return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItemStack(player, 1)).orElse(null); + } + + @Override + public ItemStack buildItemStack(Key id, @Nullable Player player) { + return Optional.ofNullable(buildCustomItemStack(id, player)).orElseGet(() -> createVanillaItemStack(id)); + } + + @Override + public Item createCustomWrappedItem(Key id, Player player) { + return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItem(player)).orElse(null); + } + + private ItemStack createVanillaItemStack(Key id) { + NamespacedKey key = NamespacedKey.fromString(id.toString()); + if (key == null) { + CraftEngine.instance().logger().warn(id + " is not a valid namespaced key"); + return new ItemStack(Material.AIR); + } + Material material = Registry.MATERIAL.get(key); + if (material == null) { + CraftEngine.instance().logger().warn(id + " is not a valid material"); + return new ItemStack(Material.AIR); + } + return new ItemStack(material); + } + + @Override + public Item createWrappedItem(Key id, @Nullable Player player) { + return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItem(player)).orElseGet(() -> { + ItemStack itemStack = createVanillaItemStack(id); + return wrap(itemStack); + }); + } + + @Override + public Item wrap(ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) return null; + return this.factory.wrap(itemStack); + } + + @Override + public Key itemId(ItemStack itemStack) { + Item wrapped = wrap(itemStack); + return wrapped.id(); + } + + @Override + public Key customItemId(ItemStack itemStack) { + Item wrapped = wrap(itemStack); + if (!wrapped.hasTag("craftengine:id")) return null; + return wrapped.id(); + } + + @Override + public Collection items() { + return new ArrayList<>(customItems.keySet()); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + // just register and recipes + Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id) + .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) + .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); + + String materialStringId = (String) section.get("material"); + Material material = MaterialUtils.getMaterial(materialStringId); + if (material == null) { + plugin.logger().warn(path, "material " + Optional.ofNullable(materialStringId).map(it -> it + " ").orElse("") + "does not exist for item " + id); + return; + } + Key materialId = Key.of(material.getKey().namespace(), material.getKey().value()); + int customModelData = MiscUtils.getAsInt(section.getOrDefault("custom-model-data", 0)); + + // Sets some basic tags + CustomItem.Builder itemBuilder = BukkitCustomItem.builder().id(id).material(materialId); + if (customModelData != 0) { + itemBuilder.modifier(new CustomModelDataModifier<>(customModelData)); + } + itemBuilder.modifier(new IdModifier<>(id)); + + // Get item behavior + Map behaviorSection = MiscUtils.castToMap(section.get("behavior"), true); + if (behaviorSection != null) { + itemBuilder.behavior(ItemBehaviors.fromMap(id, behaviorSection)); + } + + // Get item data + Map dataSection = MiscUtils.castToMap(section.get("data"), true); + if (dataSection != null) { + for (Map.Entry dataEntry : dataSection.entrySet()) { + Optional.ofNullable(dataFunctions.get(dataEntry.getKey())).ifPresentOrElse(function -> { + try { + itemBuilder.modifier(function.apply(dataEntry.getValue())); + } catch (IllegalArgumentException e) { + plugin.logger().warn("Invalid data format", e); + } + }, () -> plugin.logger().warn(path, dataEntry.getKey() + " is not a valid data type")); + } + } + this.customItems.put(id, itemBuilder.build()); + + List tags = MiscUtils.getAsStringList(section.get("tags")); + for (String tag : tags) { + Key key = Key.of(tag); + this.customItemTags.computeIfAbsent(key, k -> new ArrayList<>()).add(holder); + } + + // model part, can be null + Map modelSection = MiscUtils.castToMap(section.get("model"), true); + if (modelSection == null) { + return; + } + // custom model data is required for generating models + if (customModelData == 0) { + plugin.logger().warn(path, "custom-model-data should be nonnull for item " + id); + return; + } + + // check conflict + Map conflict = this.cmdConflictChecker.computeIfAbsent(materialId, k -> new HashMap<>()); + if (conflict.containsKey(customModelData)) { + plugin.logger().warn(path, "Failed to create model for " + id + " because custom-model-data " + customModelData + " already occupied by item " + conflict.get(customModelData).toString()); + return; + } + + conflict.put(customModelData, id); + + // Parse models + ItemModel model = ItemModels.fromMap(modelSection); + for (ModelGeneration generation : model.modelsToGenerate()) { + prepareModelGeneration(generation); + } + + if (ConfigManager.packMaxVersion() > 21.39f) { + TreeMap map = modernOverrides.computeIfAbsent(materialId, k -> new TreeMap<>()); + map.put(customModelData, model); + } + + if (ConfigManager.packMinVersion() < 21.39f) { + // TODO `charged` and `fallback` + List legacyOverridesModels = new ArrayList<>(); + processModelRecursively(model, new LinkedHashMap<>(), legacyOverridesModels, materialId, customModelData); + TreeSet lom = legacyOverrides.computeIfAbsent(materialId, k -> new TreeSet<>()); + lom.addAll(legacyOverridesModels); + } + } + + @Override + public Map> legacyItemOverrides() { + return legacyOverrides; + } + + @Override + public Map> modernItemOverrides() { + return modernOverrides; + } + + private void processModelRecursively( + ItemModel currentModel, + Map accumulatedPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (currentModel instanceof ConditionItemModel conditionModel) { + handleConditionModel(conditionModel, accumulatedPredicates, resultList, materialId, customModelData); + } else if (currentModel instanceof RangeDispatchItemModel rangeModel) { + handleRangeModel(rangeModel, accumulatedPredicates, resultList, materialId, customModelData); + } else if (currentModel instanceof SelectItemModel selectModel) { + handleSelectModel(selectModel, accumulatedPredicates, resultList, materialId, customModelData); + } else if (currentModel instanceof BaseItemModel baseModel) { + resultList.add(new LegacyOverridesModel( + new LinkedHashMap<>(accumulatedPredicates), + baseModel.path(), + customModelData + )); + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void handleConditionModel( + ConditionItemModel model, + Map parentPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (model.property() instanceof LegacyModelPredicate predicate) { + String predicateId = predicate.legacyPredicateId(materialId); + Map truePredicates = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(true) + ); + processModelRecursively( + model.onTrue(), + truePredicates, + resultList, + materialId, + customModelData + ); + Map falsePredicates = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(false) + ); + processModelRecursively( + model.onFalse(), + falsePredicates, + resultList, + materialId, + customModelData + ); + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void handleRangeModel( + RangeDispatchItemModel model, + Map parentPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (model.property() instanceof LegacyModelPredicate predicate) { + String predicateId = predicate.legacyPredicateId(materialId); + for (Map.Entry entry : model.entries().entrySet()) { + Map merged = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(entry.getKey()) + ); + processModelRecursively( + entry.getValue(), + merged, + resultList, + materialId, + customModelData + ); + } + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void handleSelectModel( + SelectItemModel model, + Map parentPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (model.property() instanceof LegacyModelPredicate predicate) { + String predicateId = predicate.legacyPredicateId(materialId); + for (Map.Entry>, ItemModel> entry : model.whenMap().entrySet()) { + List cases = entry.getKey().fallbackOrMapPrimary(List::of); + for (String caseValue : cases) { + Map merged = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(caseValue) + ); + processModelRecursively( + entry.getValue(), + merged, + resultList, + materialId, + customModelData + ); + } + } + } + } + + private Map mergePredicates( + Map existing, + String newKey, + Number newValue + ) { + Map merged = new LinkedHashMap<>(existing); + merged.put(newKey, newValue); + return merged; + } + + @SuppressWarnings("unchecked") + private void registerAllVanillaItems() { + try { + for (Material material : Registry.MATERIAL) { + if (!material.isLegacy() && material.isItem()) { + Key id = Key.from(material.getKey().asString()); + Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id) + .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) + .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); + + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value()); + Object mcHolder = ((Optional) Reflections.method$Registry$getHolder1.invoke(Reflections.instance$BuiltInRegistries$ITEM, Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$ITEM, resourceLocation))).get(); + Set tags = (Set) Reflections.field$Holder$Reference$tags.get(mcHolder); + for (Object tag : tags) { + Key tagId = Key.of(Reflections.field$TagKey$location.get(tag).toString()); + this.vanillaItemTags.computeIfAbsent(tagId, (key) -> new ArrayList<>()).add(holder); + } + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to init vanilla items", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/CloneableConstantItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/CloneableConstantItem.java new file mode 100644 index 000000000..061e994b6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/CloneableConstantItem.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.BuildableItem; +import org.bukkit.inventory.ItemStack; + +public class CloneableConstantItem implements BuildableItem { + private final ItemStack item; + + public CloneableConstantItem(ItemStack item) { + this.item = item; + } + + @Override + public ItemStack buildItemStack(Player player, int count) { + ItemStack itemStack = this.item.clone(); + itemStack.setAmount(count); + return itemStack; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java new file mode 100644 index 000000000..214cc640a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java @@ -0,0 +1,217 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import javax.annotation.Nullable; +import java.util.*; + +public class ItemEventListener implements Listener { + private final BukkitCraftEngine plugin; + + public ItemEventListener(BukkitCraftEngine plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInteractAtBlock(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + if (event.useItemInHand() == Event.Result.DENY) return; + if (event.useInteractedBlock() == Event.Result.DENY) return; + Location interactionPoint = event.getInteractionPoint(); + if (interactionPoint == null) return; + Player bukkitPlayer = event.getPlayer(); + BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); + InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + if (hand == InteractionHand.OFF_HAND) { + int currentTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(currentTicks)) { + event.setCancelled(true); + return; + } + } + + Item itemInHand = player.getItemInHand(hand); + if (itemInHand == null) return; + Optional> customItem = itemInHand.getCustomItem(); + + Block clickedBlock = Objects.requireNonNull(event.getClickedBlock()); + Material material = itemInHand.getItem().getType(); + // is custom item + if (customItem.isPresent()) { + if (material.isBlock()) { + event.setCancelled(true); + } + CustomItem item = customItem.get(); + BlockPos pos = LocationUtils.toBlockPos(clickedBlock.getLocation()); + Vec3d vec3d = new Vec3d(interactionPoint.getX(), interactionPoint.getY(), interactionPoint.getZ()); + Direction direction = DirectionUtils.toDirection(event.getBlockFace()); + BlockHitResult hitResult = new BlockHitResult(vec3d, direction, pos, false); + if (!player.isSecondaryUseActive()) { + if (InteractUtils.isInteractable(BlockStateUtils.getRealBlockId(clickedBlock), bukkitPlayer, clickedBlock.getBlockData(), hitResult, itemInHand)) return; + } + InteractionResult result = item.behavior().useOnBlock(new UseOnContext(player, hand, hitResult)); + int maxY = player.level().worldHeight().getMaxBuildHeight() - 1; + if (direction == Direction.UP + && !result.consumesAction() + && pos.y() >= maxY + && item.behavior() instanceof BlockItemBehavior + ) { + player.sendActionBar(Component.translatable("build.tooHigh").arguments(Component.text(maxY)).color(NamedTextColor.RED)); + } + } else { + // vanilla item + if (material.isBlock()) { + // client won't have sounds if the fake block is interactable + Object blockState = BlockStateUtils.blockDataToBlockState(clickedBlock.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + ImmutableBlockState againCustomBlock = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); + if (!againCustomBlock.isEmpty()) { + BlockPos pos = LocationUtils.toBlockPos(clickedBlock.getLocation()); + Vec3d vec3d = new Vec3d(interactionPoint.getX(), interactionPoint.getY(), interactionPoint.getZ()); + Direction direction = DirectionUtils.toDirection(event.getBlockFace()); + BlockHitResult hitResult = new BlockHitResult(vec3d, direction, pos, false); + try { + BlockData craftBlockData = (BlockData) Reflections.method$CraftBlockData$createData.invoke(null, againCustomBlock.vanillaBlockState().handle()); + if (InteractUtils.isInteractable(Key.of(clickedBlock.getType().getKey().asString()), bukkitPlayer, craftBlockData, hitResult, itemInHand)) { + if (!player.isSecondaryUseActive()) { + player.setResendSound(); + } + } else { + if (BlockStateUtils.isReplaceable(againCustomBlock.customBlockState().handle()) && !BlockStateUtils.isReplaceable(againCustomBlock.vanillaBlockState().handle())) { + player.setResendSwing(); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get CraftBlockData", e); + } + } + } + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onUseDebugStick(PlayerInteractEvent event) { + Block clickedBlock = event.getClickedBlock(); + if (clickedBlock == null) return; + ItemStack itemInHand = event.getItem(); + if (itemInHand == null) return; + Material material = itemInHand.getType(); + if (material != Material.DEBUG_STICK) return; + Player bukkitPlayer = event.getPlayer(); + BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); + if (!(player.canInstabuild() && player.hasPermission("minecraft.debugstick")) && !player.hasPermission("minecraft.debugstick.always")) { + return; + } + if (event.getHand() == EquipmentSlot.OFF_HAND) { + int currentTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(currentTicks)) { + event.setCancelled(true); + return; + } + } + Object blockState = BlockStateUtils.blockDataToBlockState(clickedBlock.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + event.setCancelled(true); + boolean update = event.getAction() == Action.RIGHT_CLICK_BLOCK; + ImmutableBlockState clickedCustomBlock = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); + CustomBlock block = clickedCustomBlock.owner().value(); + Collection> properties = block.properties(); + String blockId = block.id().toString(); + try { + if (properties.isEmpty()) { + Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.empty").arguments(Component.text(blockId))), true); + player.sendPacket(systemChatPacket, false); + } else { + Item wrapped = BukkitItemManager.instance().wrap(itemInHand); + Object storedData = wrapped.getTag("craftengine:debug_stick_state"); + if (storedData == null) storedData = new HashMap<>(); + if (storedData instanceof Map map) { + Map data = MiscUtils.castToMap(map, false); + String currentPropertyName = (String) data.get(blockId); + Property currentProperty = block.getProperty(currentPropertyName); + if (currentProperty == null) { + currentProperty = properties.iterator().next(); + } + if (update) { + ImmutableBlockState nextState = cycleState(clickedCustomBlock, currentProperty, player.isSecondaryUseActive()); + CraftEngineBlocks.place(clickedBlock.getLocation(), nextState, new UpdateOption.Builder().updateClients().updateKnownShape().build()); + Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.update") + .arguments( + Component.text(currentProperty.name()), + Component.text(getNameHelper(nextState, currentProperty)) + )), true); + player.sendPacket(systemChatPacket, false); + } else { + currentProperty = getRelative(properties, currentProperty, player.isSecondaryUseActive()); + data.put(blockId, currentProperty.name()); + wrapped.setTag(data, "craftengine:debug_stick_state"); + wrapped.load(); + Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.select") + .arguments( + Component.text(currentProperty.name()), + Component.text(getNameHelper(clickedCustomBlock, currentProperty)) + )), true); + player.sendPacket(systemChatPacket, false); + } + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to send system chat packet", e); + } + } + } + + private static > ImmutableBlockState cycleState(ImmutableBlockState state, Property property, boolean inverse) { + return state.with(property, getRelative(property.possibleValues(), state.get(property), inverse)); + } + + private static T getRelative(Iterable elements, @Nullable T current, boolean inverse) { + return inverse ? MCUtils.findPreviousInIterable(elements, current) : MCUtils.findNextInIterable(elements, current); + } + + private static > String getNameHelper(ImmutableBlockState state, Property property) { + return property.valueName(state.get(property)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java new file mode 100644 index 000000000..46d87ddd0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java @@ -0,0 +1,113 @@ +package net.momirealms.craftengine.bukkit.item; + +import com.saicone.rtag.RtagItem; +import net.momirealms.craftengine.core.item.ItemWrapper; +import org.bukkit.inventory.ItemStack; + +@SuppressWarnings("UnstableApiUsage") +public class RTagItemWrapper implements ItemWrapper { + private final RtagItem rtagItem; + private int count; + + public RTagItemWrapper(RtagItem rtagItem, int count) { + this.rtagItem = rtagItem; + this.count = count; + } + + @Override + public ItemStack getItem() { + ItemStack itemStack = this.rtagItem.getItem(); + itemStack.setAmount(this.count); + return itemStack; + } + + @Override + public boolean set(Object value, Object... path) { + return this.rtagItem.set(value, path); + } + + @Override + public boolean add(Object value, Object... path) { + return this.rtagItem.add(value, path); + } + + @Override + public V get(Object... path) { + return this.rtagItem.get(path); + } + + @Override + public void setComponent(Object path, Object value) { + this.rtagItem.setComponent(path, value); + } + + @Override + public Object getComponent(Object path) { + return this.rtagItem.getComponent(path); + } + + @Override + public int count() { + return this.count; + } + + @Override + public void count(int amount) { + if (amount < 0) amount = 0; + this.count = amount; + } + + @Override + public V getExact(Object... path) { + return this.rtagItem.get(path); + } + + @Override + public void removeComponent(Object path) { + this.rtagItem.removeComponent(path); + } + + @Override + public boolean hasComponent(Object path) { + return this.rtagItem.hasComponent(path); + } + + @Override + public void update() { + this.rtagItem.update(); + } + + @Override + public boolean remove(Object... path) { + return this.rtagItem.remove(path); + } + + @Override + public boolean hasTag(Object... path) { + return this.rtagItem.hasTag(path); + } + + @Override + public ItemStack load() { + ItemStack itemStack = this.rtagItem.load(); + itemStack.setAmount(this.count); + return itemStack; + } + + @Override + public ItemStack loadCopy() { + ItemStack itemStack = this.rtagItem.loadCopy(); + itemStack.setAmount(this.count); + return itemStack; + } + + @Override + public Object getLiteralObject() { + return this.rtagItem.getLiteralObject(); + } + + @Override + public ItemWrapper copyWithCount(int count) { + return new RTagItemWrapper(new RtagItem(this.rtagItem.loadCopy()), count); + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java new file mode 100644 index 000000000..7ab243057 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java @@ -0,0 +1,140 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.block.BlockCanBuildEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.util.Vector; + +import javax.annotation.Nullable; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; +import java.util.Optional; + +public class BlockItemBehavior extends ItemBehavior { + public static final Factory FACTORY = new Factory(); + private final Key blockId; + + public BlockItemBehavior(Key blockId) { + this.blockId = blockId; + } + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + return this.place(new BlockPlaceContext(context)); + } + + public InteractionResult place(BlockPlaceContext context) { + if (!context.canPlace()) { + return InteractionResult.FAIL; + } + Optional optionalBlock = BukkitBlockManager.instance().getBlock(this.blockId); + if (optionalBlock.isEmpty()) { + CraftEngine.instance().logger().warn("Failed to place unknown block " + this.blockId); + return InteractionResult.FAIL; + } + CustomBlock block = optionalBlock.get(); + BlockPlaceContext placeContext = updatePlacementContext(context); + if (placeContext == null) { + return InteractionResult.FAIL; + } + ImmutableBlockState blockStateToPlace = getPlacementState(placeContext, block); + if (blockStateToPlace == null) { + return InteractionResult.FAIL; + } + Player player = placeContext.getPlayer(); + int gameTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(gameTicks)) { + return InteractionResult.FAIL; + } + + BlockPos pos = placeContext.getClickedPos(); + World world = (World) placeContext.getLevel().getHandle(); + CraftEngineBlocks.place(new Location(world, pos.x(), pos.y(), pos.z()), blockStateToPlace, UpdateOption.UPDATE_ALL_IMMEDIATE); + + if (!player.isCreativeMode()) { + Item item = placeContext.getItem(); + item.count(item.count() - 1); + item.load(); + } + + player.swingHand(placeContext.getHand()); + world.playSound(new Location(world, pos.x(), pos.y(), pos.z()), blockStateToPlace.sounds().placeSound().toString(), SoundCategory.BLOCKS, 1f, 1f); + world.sendGameEvent((org.bukkit.entity.Player) player.platformPlayer(), GameEvent.BLOCK_PLACE, new Vector(pos.x(), pos.y(), pos.z())); + return InteractionResult.SUCCESS; + } + + @Nullable + public BlockPlaceContext updatePlacementContext(BlockPlaceContext context) { + return context; + } + + protected ImmutableBlockState getPlacementState(BlockPlaceContext context, CustomBlock block) { + ImmutableBlockState state = block.getStateForPlacement(context); + return state != null && this.canPlace(context, state) ? state : null; + } + + protected boolean checkStatePlacement() { + return true; + } + + protected boolean canPlace(BlockPlaceContext context, ImmutableBlockState state) { + try { + Object player; + try { + player = Reflections.method$CraftPlayer$getHandle.invoke(context.getPlayer().platformPlayer()); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException("Failed to get server player", e); + } + Object blockState = state.customBlockState().handle(); + Object blockPos = LocationUtils.toBlockPos(context.getClickedPos()); + Object voxelShape = Reflections.method$CollisionContext$of.invoke(null, player); + Object world = Reflections.field$CraftWorld$ServerLevel.get(context.getLevel().getHandle()); + boolean defaultReturn = ((!this.checkStatePlacement() || (boolean) Reflections.method$BlockStateBase$canSurvive.invoke(blockState, world, blockPos)) + && (boolean) Reflections.method$ServerLevel$checkEntityCollision.invoke(world, blockState, player, voxelShape, blockPos, true)); + Block block = (Block) Reflections.method$CraftBlock$at.invoke(null, world, blockPos); + BlockData blockData = (BlockData) Reflections.method$CraftBlockData$fromData.invoke(null, blockState); + BlockCanBuildEvent canBuildEvent = new BlockCanBuildEvent(block, (org.bukkit.entity.Player) context.getPlayer().platformPlayer(), blockData, defaultReturn, context.getHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); + Bukkit.getPluginManager().callEvent(canBuildEvent); + return canBuildEvent.isBuildable(); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to check canPlace", e); + return false; + } + } + + public Key blockId() { + return this.blockId; + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Key __, Map arguments) { + Object id = arguments.get("block"); + if (id == null) { + throw new IllegalArgumentException("Missing required parameter 'block' for block_item behavior"); + } + Key blockId = Key.of(id.toString()); + return new BlockItemBehavior(blockId); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java new file mode 100644 index 000000000..1695aa0ad --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.core.item.behavior.EmptyItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; +import net.momirealms.craftengine.core.util.Key; + +public class BukkitItemBehaviors extends ItemBehaviors { + public static final Key EMPTY = Key.from("craftengine:empty"); + public static final Key BLOCK_ITEM = Key.from("craftengine:block_item"); + public static final Key FURNITURE_ITEM = Key.from("craftengine:furniture_item"); + + public static void init() { + register(EMPTY, (args, id) -> EmptyItemBehavior.INSTANCE); + register(BLOCK_ITEM, BlockItemBehavior.FACTORY); + register(FURNITURE_ITEM, FurnitureItemBehavior.FACTORY); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java new file mode 100644 index 000000000..5211baa62 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -0,0 +1,270 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.core.block.BlockSounds; +import net.momirealms.craftengine.core.entity.furniture.*; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.util.*; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.util.Transformation; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.*; + +public class FurnitureItemBehavior extends ItemBehavior { + public static final Factory FACTORY = new Factory(); + private final Key id; + private final BlockSounds sounds; + private final EnumMap placements; + @Nullable + private final LootTable lootTable; + + public FurnitureItemBehavior(Key id, + BlockSounds sounds, + EnumMap placements, + @Nullable LootTable lootTable) { + this.id = id; + this.placements = placements; + this.lootTable = lootTable; + this.sounds = sounds; + } + + public AnchorType getAnyPlacement() { + return placements.keySet().stream().findFirst().orElse(null); + } + + public boolean isAllowedPlacement(AnchorType anchorType) { + return placements.containsKey(anchorType); + } + + public FurniturePlacement getPlacement(AnchorType anchorType) { + return placements.get(anchorType); + } + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + return this.place(new BlockPlaceContext(context)); + } + + public InteractionResult place(BlockPlaceContext context) { + if (!context.canPlace()) { + return InteractionResult.FAIL; + } + Direction clickedFace = context.getClickedFace(); + AnchorType anchorType = switch (clickedFace) { + case EAST, WEST, NORTH, SOUTH -> AnchorType.WALL; + case UP -> AnchorType.GROUND; + case DOWN -> AnchorType.CEILING; + }; + FurniturePlacement placement = this.placements.get(anchorType); + if (placement == null) { + return InteractionResult.FAIL; + } + + Player player = context.getPlayer(); + int gameTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(gameTicks)) { + return InteractionResult.FAIL; + } + if (!player.isCreativeMode()) { + Item item = context.getItem(); + item.count(item.count() - 1); + item.load(); + } + player.swingHand(context.getHand()); + + Vec3d clickedPosition = context.getClickLocation(); + World world = (World) context.getLevel().getHandle(); + + // get position and rotation for placement + Vec3d finalPlacePosition; + double furnitureYaw; + if (anchorType == AnchorType.WALL) { + furnitureYaw = -Direction.getYaw(clickedFace); + if (clickedFace == Direction.EAST || clickedFace == Direction.WEST) { + Pair xz = placement.alignmentRule.apply(Pair.of(clickedPosition.y(), clickedPosition.z())); + finalPlacePosition = new Vec3d(clickedPosition.x(), xz.left(), xz.right()); + } else { + Pair xz = placement.alignmentRule.apply(Pair.of(clickedPosition.x(), clickedPosition.y())); + finalPlacePosition = new Vec3d(xz.left(), xz.right(), clickedPosition.z()); + } + } else { + furnitureYaw = placement.rotationRule.apply(180 - player.getXRot()); + Pair xz = placement.alignmentRule.apply(Pair.of(clickedPosition.x(), clickedPosition.z())); + finalPlacePosition = new Vec3d(xz.left(), clickedPosition.y(), xz.right()); + } + + // spawn entity and load + EntityUtils.spawnEntity(world, new Location(world, finalPlacePosition.x(), finalPlacePosition.y(), finalPlacePosition.z()), EntityType.ITEM_DISPLAY, entity -> { + ItemDisplay display = (ItemDisplay) entity; + Quaternionf quaternion = QuaternionUtils.toQuaternionf(0, Math.toRadians(furnitureYaw), 0); + display.setTransformation( + new Transformation( + new Vector3f(), + new Quaternionf(), + new Vector3f(1, 1, 1), + quaternion + ) + ); + display.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_KEY, PersistentDataType.STRING, id.toString()); + display.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_ANCHOR_KEY, PersistentDataType.STRING, anchorType.name()); + BukkitFurnitureManager.instance().handleEntityLoadEarly(display); + }); + context.getLevel().playBlockSound(clickedPosition, sounds.placeSound(), 1f, 1f); + return InteractionResult.SUCCESS; + } + + public BlockSounds sounds() { + return sounds; + } + + @Nullable + public LootTable lootTable() { + return lootTable; + } + + public Key itemId() { + return id; + } + + public static class FurniturePlacement { + private final FurnitureElement[] elements; + private final HitBox[] hitbox; + private final RotationRule rotationRule; + private final AlignmentRule alignmentRule; + + public FurniturePlacement(FurnitureElement[] elements, HitBox[] hitbox, RotationRule rotationRule, AlignmentRule alignmentRule) { + this.elements = elements; + this.hitbox = hitbox; + this.rotationRule = rotationRule; + this.alignmentRule = alignmentRule; + } + + public HitBox[] hitbox() { + return hitbox; + } + + public FurnitureElement[] elements() { + return elements; + } + + public RotationRule rotationRule() { + return rotationRule; + } + + public AlignmentRule alignmentRule() { + return alignmentRule; + } + } + + public static class Factory implements ItemBehaviorFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemBehavior create(Key id, Map arguments) { + Map lootMap = MiscUtils.castToMap(arguments.get("loot"), true); + Map soundMap = MiscUtils.castToMap(arguments.get("sounds"), true); + Map placementMap = MiscUtils.castToMap(arguments.get("placement"), true); + EnumMap placements = new EnumMap<>(AnchorType.class); + if (placementMap == null) { + throw new IllegalArgumentException("Missing required parameter 'placement' for furniture_item behavior"); + } + for (Map.Entry entry : placementMap.entrySet()) { + AnchorType anchorType = AnchorType.valueOf(entry.getKey().toUpperCase(Locale.ENGLISH)); + Map placementArguments = MiscUtils.castToMap(entry.getValue(), true); + + List elements = new ArrayList<>(); + List> elementConfigs = (List>) placementArguments.getOrDefault("elements", List.of()); + for (Map element : elementConfigs) { + String key = (String) element.get("item"); + if (key == null) { + throw new IllegalArgumentException("Missing required parameter 'item' for furniture_item behavior"); + } + ItemDisplayContext transform = ItemDisplayContext.valueOf(element.getOrDefault("transform", "NONE").toString().toUpperCase(Locale.ENGLISH)); + Billboard billboard = Billboard.valueOf(element.getOrDefault("billboard", "FIXED").toString().toUpperCase(Locale.ENGLISH)); + FurnitureElement furnitureElement = new FurnitureElement(Key.of(key), billboard, transform, + MiscUtils.getVector3f(element.getOrDefault("scale", "1")), + MiscUtils.getVector3f(element.getOrDefault("translation", "0")), + MiscUtils.getVector3f(element.getOrDefault("position", "0")), + MiscUtils.getQuaternionf(element.getOrDefault("rotation", "0")) + ); + elements.add(furnitureElement); + } + List> hitboxConfigs = (List>) placementArguments.getOrDefault("hitboxes", List.of()); + List hitboxes = new ArrayList<>(); + for (Map config : hitboxConfigs) { + List seats = (List) config.getOrDefault("seats", List.of()); + Seat[] seatArray = seats.stream() + .map(arg -> { + String[] split = arg.split(" "); + if (split.length == 1) return new Seat(MiscUtils.getVector3f(split[0]), 0, false); + return new Seat(MiscUtils.getVector3f(split[0]), Float.parseFloat(split[1]), true); + }) + .toArray(Seat[]::new); + Vector3f position = MiscUtils.getVector3f(config.getOrDefault("position", "0")); + float width = MiscUtils.getAsFloat(config.getOrDefault("width", "1")); + float height = MiscUtils.getAsFloat(config.getOrDefault("height", "1")); + HitBox hitBox = new HitBox( + position, + new Vector3f(width, height, width), + seatArray, + (boolean) config.getOrDefault("interactive", true) + ); + hitboxes.add(hitBox); + } + if (hitboxes.isEmpty()) { + hitboxes.add(new HitBox( + new Vector3f(), + new Vector3f(1,1,1), + new Seat[0], + true + )); + } + Map ruleSection = MiscUtils.castToMap(placementArguments.get("rules"), true); + if (ruleSection != null) { + RotationRule rotationRule = Optional.ofNullable((String) ruleSection.get("rotation")) + .map(it -> RotationRule.valueOf(it.toUpperCase(Locale.ENGLISH))) + .orElse(RotationRule.ANY); + AlignmentRule alignmentRule = Optional.ofNullable((String) ruleSection.get("alignment")) + .map(it -> AlignmentRule.valueOf(it.toUpperCase(Locale.ENGLISH))) + .orElse(AlignmentRule.CENTER); + placements.put(anchorType, new FurniturePlacement( + elements.toArray(new FurnitureElement[0]), + hitboxes.toArray(new HitBox[0]), + rotationRule, + alignmentRule + )); + } else { + placements.put(anchorType, new FurniturePlacement( + elements.toArray(new FurnitureElement[0]), + hitboxes.toArray(new HitBox[0]), + RotationRule.ANY, + AlignmentRule.CENTER + )); + } + } + return new FurnitureItemBehavior( + id, + BlockSounds.fromMap(soundMap), + placements, + lootMap == null ? null : LootTable.fromMap(lootMap) + ); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java new file mode 100644 index 000000000..23b538d6b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -0,0 +1,133 @@ +package net.momirealms.craftengine.bukkit.item.factory; + +import com.saicone.rtag.RtagItem; +import net.momirealms.craftengine.bukkit.item.RTagItemWrapper; +import net.momirealms.craftengine.bukkit.util.ItemTags; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.item.ItemFactory; +import net.momirealms.craftengine.core.item.ItemWrapper; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.inventory.ItemStack; + +import java.util.Objects; +import java.util.Optional; + +public abstract class BukkitItemFactory extends ItemFactory { + + protected BukkitItemFactory(CraftEngine plugin) { + super(plugin); + } + + public static BukkitItemFactory create(CraftEngine plugin) { + Objects.requireNonNull(plugin, "plugin"); + switch (plugin.serverVersion()) { + case "1.17", "1.17.1", + "1.18", "1.18.1", "1.18.2", + "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", + "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4" -> { + return new UniversalItemFactory(plugin); + } + case "1.20.5", "1.20.6", + "1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4" -> { + return new ComponentItemFactory(plugin); + } + default -> throw new IllegalStateException("Unsupported server version: " + plugin.serverVersion()); + } + } + + @Override + protected Key id(ItemWrapper item) { + Object id = item.get("craftengine:id"); + if (id == null) return Key.of(item.getItem().getType().getKey().asString()); + return Key.of(id.toString()); + } + + @Override + protected Optional customId(ItemWrapper item) { + Object id = item.get("craftengine:id"); + if (id == null) return Optional.empty(); + return Optional.of(Key.of(id.toString())); + } + + @Override + protected Key vanillaId(ItemWrapper item) { + return Key.of(item.getItem().getType().getKey().asString()); + } + + @Override + protected ItemWrapper wrapInternal(ItemStack item) { + return new RTagItemWrapper(new RtagItem(item), item.getAmount()); + } + + @Override + protected void setTag(ItemWrapper item, Object value, Object... path) { + item.set(value, path); + } + + @Override + protected Object getTag(ItemWrapper item, Object... path) { + return item.get(path); + } + + @Override + protected boolean hasTag(ItemWrapper item, Object... path) { + return item.hasTag(path); + } + + @Override + protected boolean removeTag(ItemWrapper item, Object... path) { + return item.remove(path); + } + + @Override + protected void setComponent(ItemWrapper item, String type, Object value) { + item.setComponent(type, value); + } + + @Override + protected Object getComponent(ItemWrapper item, String type) { + return item.getComponent(type); + } + + @Override + protected boolean hasComponent(ItemWrapper item, String type) { + return item.hasComponent(type); + } + + @Override + protected void removeComponent(ItemWrapper item, String type) { + item.removeComponent(type); + } + + @Override + protected void update(ItemWrapper item) { + item.update(); + } + + @Override + protected ItemStack load(ItemWrapper item) { + return item.load(); + } + + @Override + protected ItemStack getItem(ItemWrapper item) { + return item.getItem(); + } + + @Override + protected ItemStack loadCopy(ItemWrapper item) { + return item.loadCopy(); + } + + @Override + protected boolean is(ItemWrapper item, Key itemTag) { + Object literalObject = item.getLiteralObject(); + Object tag = ItemTags.getOrCreate(itemTag); + try { + return (boolean) Reflections.method$ItemStack$isTag.invoke(literalObject, tag); + } catch (ReflectiveOperationException e) { + return false; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java new file mode 100644 index 000000000..408028da7 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java @@ -0,0 +1,255 @@ +package net.momirealms.craftengine.bukkit.item.factory; + +import com.saicone.rtag.data.ComponentType; +import net.momirealms.craftengine.bukkit.util.EnchantmentUtils; +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.ItemWrapper; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Function; + +@SuppressWarnings("UnstableApiUsage") +public class ComponentItemFactory extends BukkitItemFactory { + + private final BiConsumer, Integer> customModelDataSetter; + private final Function, Optional> customModelDataGetter; + + public ComponentItemFactory(CraftEngine plugin) { + super(plugin); + this.customModelDataSetter = VersionHelper.isVersionNewerThan1_21_4() ? + ((item, data) -> item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, + Map.of("floats", List.of(data.floatValue())))) : ((item, data) -> item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, data)); + this.customModelDataGetter = VersionHelper.isVersionNewerThan1_21_4() ? + (item) -> { + Optional optional = ComponentType.encodeJava(ComponentKeys.CUSTOM_MODEL_DATA, item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA)); + if (optional.isEmpty()) return Optional.empty(); + @SuppressWarnings("unchecked") + Map data = (Map) optional.get(); + @SuppressWarnings("unchecked") + List floats = (List) data.get("floats"); + if (floats == null || floats.isEmpty()) return Optional.empty(); + return Optional.of((int) Math.floor(floats.get(0))); + } : (item) -> Optional.ofNullable( + (Integer) ComponentType.encodeJava( + ComponentKeys.CUSTOM_MODEL_DATA, + item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA) + ).orElse(null) + ); + } + + @Override + protected void customModelData(ItemWrapper item, Integer data) { + if (data == null) { + item.removeComponent(ComponentKeys.CUSTOM_MODEL_DATA); + } else { + this.customModelDataSetter.accept(item, data); + } + } + + @Override + protected Optional customModelData(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.CUSTOM_MODEL_DATA)) return Optional.empty(); + return this.customModelDataGetter.apply(item); + } + + @Override + protected void displayName(ItemWrapper item, String json) { + if (json == null) { + item.removeComponent(ComponentKeys.CUSTOM_NAME); + } else { + item.setComponent(ComponentKeys.CUSTOM_NAME, json); + } + } + + @Override + protected Optional displayName(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.CUSTOM_NAME)) return Optional.empty(); + return Optional.ofNullable( + (String) ComponentType.encodeJava( + ComponentKeys.CUSTOM_NAME, + item.getComponent(ComponentKeys.CUSTOM_NAME) + ).orElse(null) + ); + } + + @Override + protected void skull(ItemWrapper item, String skullData) { + final Map profile = Map.of( + "properties", List.of( + Map.of( + "name", "textures", + "value", skullData + ) + ) + ); + item.setComponent("minecraft:profile", profile); + } + + @SuppressWarnings("unchecked") + @Override + protected Optional> lore(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.LORE)) return Optional.empty(); + return Optional.ofNullable( + (List) ComponentType.encodeJava( + ComponentKeys.LORE, + item.getComponent(ComponentKeys.LORE) + ).orElse(null) + ); + } + + @Override + protected void lore(ItemWrapper item, List lore) { + if (lore == null || lore.isEmpty()) { + item.removeComponent(ComponentKeys.LORE); + } else { + item.setComponent(ComponentKeys.LORE, lore); + } + } + + @Override + protected boolean unbreakable(ItemWrapper item) { + return item.hasComponent(ComponentKeys.UNBREAKABLE); + } + + @Override + protected void unbreakable(ItemWrapper item, boolean unbreakable) { + if (unbreakable) { + item.removeComponent(ComponentKeys.UNBREAKABLE); + } else { + item.setComponent(ComponentKeys.UNBREAKABLE, true); + } + } + + @Override + protected Optional glint(ItemWrapper item) { + return Optional.ofNullable((Boolean) item.getComponent(ComponentKeys.ENCHANTMENT_GLINT_OVERRIDE)); + } + + @Override + protected void glint(ItemWrapper item, Boolean glint) { + item.setComponent(ComponentKeys.ENCHANTMENT_GLINT_OVERRIDE, glint); + } + + @Override + protected Optional damage(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.DAMAGE)) return Optional.empty(); + return Optional.ofNullable( + (Integer) ComponentType.encodeJava( + ComponentKeys.DAMAGE, + item.getComponent(ComponentKeys.DAMAGE) + ).orElse(null) + ); + } + + @Override + protected void damage(ItemWrapper item, Integer damage) { + if (damage == null) damage = 0; + item.setComponent(ComponentKeys.DAMAGE, damage); + } + + @Override + protected Optional maxDamage(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.MAX_DAMAGE)) return Optional.of((int) item.getItem().getType().getMaxDurability()); + return Optional.ofNullable( + (Integer) ComponentType.encodeJava( + ComponentKeys.MAX_DAMAGE, + item.getComponent(ComponentKeys.MAX_DAMAGE) + ).orElse(null) + ); + } + + @Override + protected void maxDamage(ItemWrapper item, Integer damage) { + if (damage == null) { + item.removeComponent(ComponentKeys.MAX_DAMAGE); + } else { + item.setComponent(ComponentKeys.MAX_DAMAGE, damage); + } + } + + @Override + protected Optional getEnchantment(ItemWrapper item, Key key) { + Object enchant = item.getComponent(ComponentKeys.ENCHANTMENTS); + try { + Map map = EnchantmentUtils.toMap(enchant); + Integer level = map.get(key.toString()); + if (level == null) return Optional.empty(); + return Optional.of(new Enchantment(key, level)); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get enchantment " + key, e); + return Optional.empty(); + } + } + + @Override + protected void enchantments(ItemWrapper item, List enchantments) { + Map enchants = new HashMap<>(); + for (Enchantment enchantment : enchantments) { + enchants.put(enchantment.id().toString(), enchantment.level()); + } + item.setComponent(ComponentKeys.ENCHANTMENTS, enchants); + } + + @Override + protected void storedEnchantments(ItemWrapper item, List enchantments) { + Map enchants = new HashMap<>(); + for (Enchantment enchantment : enchantments) { + enchants.put(enchantment.id().toString(), enchantment.level()); + } + item.setComponent(ComponentKeys.STORED_ENCHANTMENTS, enchants); + } + + @Override + protected void addEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchant = item.getComponent(ComponentKeys.ENCHANTMENTS); + try { + Map map = EnchantmentUtils.toMap(enchant); + map.put(enchantment.toString(), enchantment.level()); + item.setComponent(ComponentKeys.ENCHANTMENTS, map); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to add enchantment", e); + } + } + + @Override + protected void addStoredEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchant = item.getComponent(ComponentKeys.STORED_ENCHANTMENTS); + try { + Map map = EnchantmentUtils.toMap(enchant); + map.put(enchantment.toString(), enchantment.level()); + item.setComponent(ComponentKeys.STORED_ENCHANTMENTS, map); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to add stored enchantment", e); + } + } + + @Override + protected void itemFlags(ItemWrapper item, List flags) { + throw new UnsupportedOperationException("This feature is not available on 1.20.5+"); + } + + @Override + protected int maxStackSize(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.MAX_STACK_SIZE)) return item.getItem().getType().getMaxStackSize(); + return Optional.ofNullable((Integer) ComponentType.encodeJava(ComponentKeys.MAX_STACK_SIZE, item.getComponent(ComponentKeys.DAMAGE)).orElse(null)) + .orElse(item.getItem().getType().getMaxStackSize()); + } + + @Override + protected void maxStackSize(ItemWrapper item, Integer maxStackSize) { + if (maxStackSize == null) { + item.removeComponent(ComponentKeys.MAX_STACK_SIZE); + } else { + item.setComponent(ComponentKeys.MAX_STACK_SIZE, maxStackSize); + } + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java new file mode 100644 index 000000000..de10e57d6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -0,0 +1,214 @@ +package net.momirealms.craftengine.bukkit.item.factory; + +import com.saicone.rtag.tag.TagBase; +import com.saicone.rtag.tag.TagCompound; +import com.saicone.rtag.tag.TagList; +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.ItemWrapper; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.SkullUtils; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.nio.charset.StandardCharsets; +import java.util.*; + +public class UniversalItemFactory extends BukkitItemFactory { + + public UniversalItemFactory(CraftEngine plugin) { + super(plugin); + } + + @Override + protected void displayName(ItemWrapper item, String json) { + if (json != null) { + item.set(json, "display", "Name"); + } else { + item.remove("display", "Name"); + } + } + + @Override + protected Optional displayName(ItemWrapper item) { + if (!item.hasTag("display", "Name")) return Optional.empty(); + return Optional.of(item.get("display", "Name")); + } + + @Override + protected void customModelData(ItemWrapper item, Integer data) { + if (data == null) { + item.remove("CustomModelData"); + } else { + item.set(data, "CustomModelData"); + } + } + + @Override + protected Optional customModelData(ItemWrapper item) { + if (!item.hasTag("CustomModelData")) return Optional.empty(); + return Optional.of(item.get("CustomModelData")); + } + + @Override + protected void skull(ItemWrapper item, String skullData) { + if (skullData == null) { + item.remove("SkullOwner"); + } else { + item.set(UUID.nameUUIDFromBytes(SkullUtils.identifierFromBase64(skullData).getBytes(StandardCharsets.UTF_8)), "SkullOwner", "Id"); + item.set( + List.of(Map.of("Value", skullData)), + "SkullOwner", "Properties", "textures" + ); + } + } + + @Override + protected Optional> lore(ItemWrapper item) { + if (!item.hasTag("display", "Lore")) return Optional.empty(); + return Optional.of(item.get("display", "Lore")); + } + + @Override + protected void lore(ItemWrapper item, List lore) { + if (lore == null || lore.isEmpty()) { + item.remove("display", "Lore"); + } else { + item.set(lore, "display", "Lore"); + } + } + + @Override + protected boolean unbreakable(ItemWrapper item) { + return Optional.ofNullable((Boolean) item.get("Unbreakable")).orElse(false); + } + + @Override + protected void unbreakable(ItemWrapper item, boolean unbreakable) { + item.set(unbreakable, "Unbreakable"); + } + + @Override + protected Optional glint(ItemWrapper item) { + return Optional.of(false); + } + + @Override + protected void glint(ItemWrapper item, Boolean glint) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected Optional damage(ItemWrapper item) { + if (!item.hasTag("Damage")) return Optional.empty(); + return Optional.of(item.get("Damage")); + } + + @Override + protected void damage(ItemWrapper item, Integer damage) { + item.set(damage, "Damage"); + } + + @Override + protected Optional maxDamage(ItemWrapper item) { +// if (!item.hasTag("CustomFishing", "max_dur")) return Optional.empty(); +// return Optional.of(item.get("CustomFishing", "max_dur")); + return Optional.of((int) item.getItem().getType().getMaxDurability()); + } + + @Override + protected void maxDamage(ItemWrapper item, Integer damage) { +// if (damage == null) { +// item.remove("CustomFishing", "max_dur"); +// } else { +// item.set(damage, "CustomFishing", "max_dur"); +// } + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected void enchantments(ItemWrapper item, List enchantments) { + ArrayList tags = new ArrayList<>(); + for (Enchantment enchantment : enchantments) { + tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()))); + } + item.set(tags, "Enchantments"); + } + + @Override + protected void storedEnchantments(ItemWrapper item, List enchantments) { + ArrayList tags = new ArrayList<>(); + for (Enchantment enchantment : enchantments) { + tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()))); + } + item.set(tags, "StoredEnchantments"); + } + + @Override + protected void addEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchantments = item.getExact("Enchantments"); + if (enchantments != null) { + for (Object enchant : TagList.getValue(enchantments)) { + if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) { + TagCompound.set(enchant, "lvl", TagBase.newTag(enchantment.level())); + return; + } + } + item.add(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level()), "Enchantments"); + } else { + item.set(List.of(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level())), "Enchantments"); + } + } + + @Override + protected void addStoredEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchantments = item.getExact("StoredEnchantments"); + if (enchantments != null) { + for (Object enchant : TagList.getValue(enchantments)) { + if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) { + TagCompound.set(enchant, "lvl", TagBase.newTag(enchantment.level())); + return; + } + } + item.add(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level()), "StoredEnchantments"); + } else { + item.set(List.of(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level())), "StoredEnchantments"); + } + } + + @Override + protected Optional getEnchantment(ItemWrapper item, Key key) { + Object enchantments = item.getExact("Enchantments"); + if (enchantments != null) { + for (Object enchant : TagList.getValue(enchantments)) { + if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) { + return Optional.of(new Enchantment(key, (int) TagBase.getValue(TagCompound.get(enchant, "lvl")))); + } + } + } + return Optional.empty(); + } + + @Override + protected void itemFlags(ItemWrapper item, List flags) { + if (flags == null || flags.isEmpty()) { + item.remove("HideFlags"); + return; + } + int f = 0; + for (String flag : flags) { + ItemFlag itemFlag = ItemFlag.valueOf(flag); + f = f | 1 << itemFlag.ordinal(); + } + item.set(f, "HideFlags"); + } + + @Override + protected int maxStackSize(ItemWrapper item) { + return item.getItem().getType().getMaxStackSize(); + } + + @Override + protected void maxStackSize(ItemWrapper item, Integer maxStackSize) { + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java new file mode 100644 index 000000000..d80e76bb2 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -0,0 +1,392 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.saicone.rtag.item.ItemObject; +import com.saicone.rtag.tag.TagCompound; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.CloneableConstantItem; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.MaterialUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.recipe.*; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.item.recipe.vanilla.RecipeResult; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaRecipeReader; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapedRecipe; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapelessRecipe; +import net.momirealms.craftengine.core.item.recipe.vanilla.impl.VanillaRecipeReader1_20; +import net.momirealms.craftengine.core.item.recipe.vanilla.impl.VanillaRecipeReader1_20_5; +import net.momirealms.craftengine.core.item.recipe.vanilla.impl.VanillaRecipeReader1_21_2; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.recipe.CraftingBookCategory; +import org.jetbrains.annotations.Nullable; + +import java.io.Reader; +import java.nio.file.Path; +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public class BukkitRecipeManager implements RecipeManager { + private static final Map, org.bukkit.inventory.Recipe>> BUKKIT_RECIPE_CONVERTORS = new HashMap<>(); + + static { + BUKKIT_RECIPE_CONVERTORS.put(RecipeTypes.SHAPED, (key, recipe) -> { + CustomShapedRecipe ceRecipe = (CustomShapedRecipe) recipe; + ShapedRecipe shapedRecipe = new ShapedRecipe(key, new ItemStack(Material.STONE)); + if (ceRecipe.group() != null) { + shapedRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + shapedRecipe.setCategory(CraftingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + shapedRecipe.shape(ceRecipe.pattern().pattern()); + for (Map.Entry> entry : ceRecipe.pattern().ingredients().entrySet()) { + shapedRecipe.setIngredient(entry.getKey(), new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(entry.getValue()))); + } + return shapedRecipe; + }); + BUKKIT_RECIPE_CONVERTORS.put(RecipeTypes.SHAPELESS, (key, recipe) -> { + CustomShapelessRecipe ceRecipe = (CustomShapelessRecipe) recipe; + ShapelessRecipe shapelessRecipe = new ShapelessRecipe(key, new ItemStack(Material.STONE)); + if (ceRecipe.group() != null) { + shapelessRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + shapelessRecipe.setCategory(CraftingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + for (Ingredient ingredient : ceRecipe.ingredients()) { + shapelessRecipe.addIngredient(new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ingredient))); + } + return shapelessRecipe; + }); + } + + private final BukkitCraftEngine plugin; + private final RecipeEventListener recipeEventListener; + private final Map>> recipes; + private final VanillaRecipeReader recipeReader; + private final List injectedDataPackRecipes; + private final List registeredCustomRecipes; + // [internal:xxx] + [custom:custom] + // includes injected vanilla recipes and custom recipes + private final Set customRecipes; + // data pack recipe resource locations [minecraft:xxx] + private final Set dataPackRecipes; + + public BukkitRecipeManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + this.recipeEventListener = new RecipeEventListener(plugin, this, plugin.itemManager()); + this.recipes = new HashMap<>(); + this.injectedDataPackRecipes = new ArrayList<>(); + this.registeredCustomRecipes = new ArrayList<>(); + this.dataPackRecipes = new HashSet<>(); + this.customRecipes = new HashSet<>(); + if (VersionHelper.isVersionNewerThan1_21_2()) { + this.recipeReader = new VanillaRecipeReader1_21_2(); + } else if (VersionHelper.isVersionNewerThan1_20_5()) { + this.recipeReader = new VanillaRecipeReader1_20_5(); + } else { + this.recipeReader = new VanillaRecipeReader1_20(); + } + } + + @Override + public boolean isDataPackRecipe(Key key) { + return this.dataPackRecipes.contains(key); + } + + @Override + public boolean isCustomRecipe(Key key) { + return this.customRecipes.contains(key); + } + + @Override + public void load() { + if (!ConfigManager.enableRecipeSystem()) return; + Bukkit.getPluginManager().registerEvents(this.recipeEventListener, this.plugin.bootstrap()); + } + + @Override + public void unload() { + HandlerList.unregisterAll(this.recipeEventListener); + this.recipes.clear(); + this.dataPackRecipes.clear(); + this.customRecipes.clear(); + for (NamespacedKey key : this.injectedDataPackRecipes) { + Bukkit.removeRecipe(key); + } + this.injectedDataPackRecipes.clear(); + for (NamespacedKey key : this.registeredCustomRecipes) { + Bukkit.removeRecipe(key); + } + this.registeredCustomRecipes.clear(); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + if (!ConfigManager.enableRecipeSystem()) return; + if (this.customRecipes.contains(id)) { + this.plugin.logger().warn(path, "Duplicated recipe " + id); + return; + } + Recipe recipe = RecipeTypes.fromMap(section); + this.recipes.computeIfAbsent(recipe.type(), k -> new ArrayList<>()).add(recipe); + NamespacedKey key = NamespacedKey.fromString(id.toString()); + Bukkit.addRecipe(BUKKIT_RECIPE_CONVERTORS.get(recipe.type()).apply(key, recipe)); + this.registeredCustomRecipes.add(key); + this.customRecipes.add(id); + } + + @Override + public List> getRecipes(Key type) { + return this.recipes.getOrDefault(type, List.of()); + } + + public void addVanillaInternalRecipe(Key id, Recipe recipe) { + this.customRecipes.add(id); + this.recipes.computeIfAbsent(recipe.type(), k -> new ArrayList<>()).add(recipe); + } + + @Nullable + @Override + public Recipe getRecipe(Key type, RecipeInput input) { + List> recipes = this.recipes.get(type); + if (recipes == null) return null; + for (Recipe recipe : recipes) { + if (recipe.matches(input)) { + return recipe; + } + } + return null; + } + + @Override + public void delayedLoad() { + processVanillaRecipes(); + } + + @SuppressWarnings("unchecked") + private void processVanillaRecipes() { + try { + Object fileToIdConverter = Reflections.method$FileToIdConverter$json.invoke(null, VersionHelper.isVersionNewerThan1_21() ? "recipe" : "recipes"); + Object minecraftServer = Reflections.method$MinecraftServer$getServer.invoke(null); + Object packRepository = Reflections.method$MinecraftServer$getPackRepository.invoke(minecraftServer); + List selected = (List) Reflections.field$PackRepository$selected.get(packRepository); + List packResources = new ArrayList<>(); + for (Object pack : selected) { + packResources.add(Reflections.method$Pack$open.invoke(pack)); + } + List bukkitRecipesToRegister = new ArrayList<>(); + try (AutoCloseable resourceManager = (AutoCloseable) Reflections.constructor$MultiPackResourceManager.newInstance(Reflections.instance$PackType$SERVER_DATA, packResources)) { + Map scannedResources = (Map) Reflections.method$FileToIdConverter$listMatchingResources.invoke(fileToIdConverter, resourceManager); + for (Map.Entry entry : scannedResources.entrySet()) { + Key id = extractKeyFromResourceLocation(entry.getKey().toString()); + this.dataPackRecipes.add(id); + // Maybe it's unregistered by other plugins + if (Bukkit.getRecipe(new NamespacedKey(id.namespace(), id.value())) == null) { + continue; + } + Reader reader = (Reader) Reflections.method$Resource$openAsReader.invoke(entry.getValue()); + JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject(); + String type = jsonObject.get("type").getAsString(); + switch (type) { + case "minecraft:crafting_shaped" -> { + VanillaShapedRecipe recipe = this.recipeReader.readShaped(jsonObject); + handleDataPackShapedRecipe(id, recipe, bukkitRecipesToRegister::add); + } + case "minecraft:crafting_shapeless" -> { + VanillaShapelessRecipe recipe = this.recipeReader.readShapeless(jsonObject); + handleDataPackShapelessRecipe(id, recipe, bukkitRecipesToRegister::add); + } + } + } + } + plugin.scheduler().sync().run(() -> { + for (org.bukkit.inventory.Recipe recipe : bukkitRecipesToRegister) { + Bukkit.addRecipe(recipe); + } + }); + } catch (Exception e) { + this.plugin.logger().warn("Failed to inject vanilla recipes", e); + } + } + + private void handleDataPackShapelessRecipe(Key id, VanillaShapelessRecipe recipe, Consumer callback) { + NamespacedKey key = new NamespacedKey("internal", id.value()); + ItemStack result = createResultStack(recipe.result()); + ShapelessRecipe shapelessRecipe = new ShapelessRecipe(key, result); + if (recipe.group() != null) { + shapelessRecipe.setGroup(recipe.group()); + } + if (recipe.category() != null) { + shapelessRecipe.setCategory(CraftingBookCategory.valueOf(recipe.category().name())); + } + + boolean hasCustomItemInTag = false; + List> ingredientList = new ArrayList<>(); + for (List list : recipe.ingredients()) { + Set materials = new HashSet<>(); + Set> holders = new HashSet<>(); + for (String item : list) { + if (item.charAt(0) == '#') { + Key tag = Key.of(item.substring(1)); + materials.addAll(tagToMaterials(tag)); + if (!hasCustomItemInTag) { + if (!plugin.itemManager().tagToCustomItems(tag).isEmpty()) { + hasCustomItemInTag = true; + } + } + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + materials.add(MaterialUtils.getMaterial(item)); + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + shapelessRecipe.addIngredient(new RecipeChoice.MaterialChoice(new ArrayList<>(materials))); + ingredientList.add(Ingredient.of(holders)); + } + + if (hasCustomItemInTag) { + callback.accept(shapelessRecipe); + this.injectedDataPackRecipes.add(key); + } + CustomShapelessRecipe ceRecipe = new CustomShapelessRecipe<>( + recipe.category(), + recipe.group(), + ingredientList, + new CustomRecipeResult<>(new CloneableConstantItem(result), recipe.result().count()) + ); + this.addVanillaInternalRecipe(Key.of("internal", id.value()), ceRecipe); + } + + private void handleDataPackShapedRecipe(Key id, VanillaShapedRecipe recipe, Consumer callback) { + NamespacedKey key = new NamespacedKey("internal", id.value()); + ItemStack result = createResultStack(recipe.result()); + ShapedRecipe shapedRecipe = new ShapedRecipe(key, result); + if (recipe.group() != null) { + shapedRecipe.setGroup(recipe.group()); + } + if (recipe.category() != null) { + shapedRecipe.setCategory(CraftingBookCategory.valueOf(recipe.category().name())); + } + shapedRecipe.shape(recipe.pattern()); + + boolean hasCustomItemInTag = false; + Map> ingredients = new HashMap<>(); + for (Map.Entry> entry : recipe.ingredients().entrySet()) { + Set materials = new HashSet<>(); + Set> holders = new HashSet<>(); + for (String item : entry.getValue()) { + if (item.charAt(0) == '#') { + Key tag = Key.from(item.substring(1)); + materials.addAll(tagToMaterials(tag)); + if (!hasCustomItemInTag) { + if (!plugin.itemManager().tagToCustomItems(tag).isEmpty()) { + hasCustomItemInTag = true; + } + } + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + materials.add(MaterialUtils.getMaterial(item)); + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + shapedRecipe.setIngredient(entry.getKey(), new RecipeChoice.MaterialChoice(new ArrayList<>(materials))); + ingredients.put(entry.getKey(), Ingredient.of(holders)); + } + + if (hasCustomItemInTag) { + callback.accept(shapedRecipe); + this.injectedDataPackRecipes.add(key); + } + CustomShapedRecipe ceRecipe = new CustomShapedRecipe<>( + recipe.category(), + recipe.group(), + new CustomShapedRecipe.Pattern<>(recipe.pattern(), ingredients), + new CustomRecipeResult<>(new CloneableConstantItem(result), recipe.result().count()) + ); + this.addVanillaInternalRecipe(Key.of("internal", id.value()), ceRecipe); + } + + private List tagToMaterials(Key tag) { + Set materials = new HashSet<>(); + List> holders = this.plugin.itemManager().tagToVanillaItems(tag); + if (holders != null) { + for (Holder holder : holders) { + materials.add(MaterialUtils.getMaterial(holder.value())); + } + } + List> customItems = this.plugin.itemManager().tagToCustomItems(tag); + if (customItems != null) { + for (Holder holder : customItems) { + this.plugin.itemManager().getCustomItem(holder.value()).ifPresent(it -> { + materials.add(MaterialUtils.getMaterial(it.material())); + }); + } + } + return new ArrayList<>(materials); + } + + private ItemStack createResultStack(RecipeResult result) { + ItemStack itemStack; + if (result.components() == null) { + itemStack = new ItemStack(Objects.requireNonNull(MaterialUtils.getMaterial(result.id()))); + itemStack.setAmount(result.count()); + } else { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("id", result.id()); + jsonObject.addProperty("count", result.count()); + jsonObject.add("components", result.components()); + Object nmsStack = ItemObject.newItem(TagCompound.newTag(jsonObject.toString())); + try { + itemStack = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, nmsStack); + } catch (Exception e) { + this.plugin.logger().warn("Failed to create ItemStack mirror", e); + return new ItemStack(Material.STICK); + } + } + return itemStack; + } + + private Key extractKeyFromResourceLocation(String input) { + int prefixEndIndex = input.indexOf(':'); + String prefix = input.substring(0, prefixEndIndex); + int lastSlashIndex = input.lastIndexOf('/'); + int lastDotIndex = input.lastIndexOf('.'); + String fileName = input.substring(lastSlashIndex + 1, lastDotIndex); + return Key.of(prefix, fileName); + } + + private static List ingredientToBukkitMaterials(Ingredient ingredient) { + Set materials = new HashSet<>(); + for (Holder holder : ingredient.items()) { + materials.add(getMaterialById(holder.value())); + } + return new ArrayList<>(materials); + } + + private static Material getMaterialById(Key key) { + Material material = MaterialUtils.getMaterial(key); + if (material != null) { + return material; + } + Optional> optionalItem = BukkitItemManager.instance().getCustomItem(key); + return optionalItem.map(itemStackCustomItem -> MaterialUtils.getMaterial(itemStackCustomItem.material())).orElse(null); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java new file mode 100644 index 000000000..675537dcc --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -0,0 +1,137 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.item.recipe.RecipeTypes; +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.inventory.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class RecipeEventListener implements Listener { + private static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); + private final ItemManager itemManager; + private final BukkitRecipeManager recipeManager; + private final BukkitCraftEngine plugin; + + public RecipeEventListener(BukkitCraftEngine plugin, BukkitRecipeManager recipeManager, ItemManager itemManager) { + this.itemManager = itemManager; + this.recipeManager = recipeManager; + this.plugin = plugin; + } + + @EventHandler + public void onCrafting(PrepareItemCraftEvent event) { + org.bukkit.inventory.Recipe recipe = event.getRecipe(); + if (recipe == null) + return; + + // we only handle shaped and shapeless recipes + boolean shapeless = event.getRecipe() instanceof ShapelessRecipe; + boolean shaped = event.getRecipe() instanceof ShapedRecipe; + if (!shaped && !shapeless) return; + + CraftingRecipe craftingRecipe = (CraftingRecipe) recipe; + Key recipeId = Key.of(craftingRecipe.getKey().namespace(), craftingRecipe.getKey().value()); + + CraftingInventory inventory = event.getInventory(); + ItemStack[] ingredients = inventory.getMatrix(); + + // if the recipe is a vanilla one, custom items should never be ingredients + if (this.recipeManager.isDataPackRecipe(recipeId)) { + if (hasCustomItem(ingredients)) { + inventory.setResult(null); + } + return; + } + + // Maybe it's recipe from other plugins, then we ignore it + if (!this.recipeManager.isCustomRecipe(recipeId)) { + return; + } + + List> optimizedIDItems = new ArrayList<>(); + for (ItemStack itemStack : ingredients) { + if (ItemUtils.isEmpty(itemStack)) { + optimizedIDItems.add(EMPTY); + } else { + Item wrappedItem = this.itemManager.wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + // an invalid item is used in recipe, we disallow it + inventory.setResult(null); + return; + } else { + optimizedIDItems.add(new OptimizedIDItem<>(idHolder.get(), itemStack)); + } + } + } + + CraftingInput input; + if (ingredients.length == 9) { + input = CraftingInput.of(3, 3, optimizedIDItems); + } else if (ingredients.length == 4) { + input = CraftingInput.of(2, 2, optimizedIDItems); + } else { + return; + } + + Player player; + try { + player = (Player) Reflections.method$InventoryView$getPlayer.invoke(event.getView()); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get inventory viewer", e); + return; + } + + BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + Recipe lastRecipe = serverPlayer.lastUsedRecipe(); + if (lastRecipe != null && (lastRecipe.type() == RecipeTypes.SHAPELESS || lastRecipe.type() == RecipeTypes.SHAPED )) { + if (lastRecipe.matches(input)) { + inventory.setResult(lastRecipe.getResult(serverPlayer)); + return; + } + } + + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPELESS, input); + if (ceRecipe != null) { + inventory.setResult(ceRecipe.getResult(serverPlayer)); + serverPlayer.setLastUsedRecipe(ceRecipe); + return; + } + ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPED, input); + if (ceRecipe != null) { + inventory.setResult(ceRecipe.getResult(serverPlayer)); + serverPlayer.setLastUsedRecipe(ceRecipe); + return; + } + // clear result if not met + inventory.setResult(null); + } + + private boolean hasCustomItem(ItemStack[] stack) { + for (ItemStack itemStack : stack) { + if (!ItemUtils.isEmpty(itemStack)) { + if (this.itemManager.wrap(itemStack).customId().isPresent()) { + return true; + } + } + } + return false; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java new file mode 100644 index 000000000..449ce79e9 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -0,0 +1,357 @@ +package net.momirealms.craftengine.bukkit.plugin; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.block.behavior.BukkitBlockBehaviors; +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.behavior.BukkitItemBehaviors; +import net.momirealms.craftengine.bukkit.item.recipe.BukkitRecipeManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitSenderFactory; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager; +import net.momirealms.craftengine.bukkit.plugin.papi.ImageExpansion; +import net.momirealms.craftengine.bukkit.plugin.papi.ShiftExpansion; +import net.momirealms.craftengine.bukkit.plugin.scheduler.BukkitSchedulerAdapter; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.PlaceholderAPIUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.classpath.ReflectionClassPathAppender; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.plugin.dependency.Dependency; +import net.momirealms.craftengine.core.plugin.logger.JavaPluginLogger; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.*; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; + +public class BukkitCraftEngine extends CraftEngine { + private static BukkitCraftEngine instance; + private final JavaPlugin bootstrap; + private SchedulerTask tickTask; + private boolean successfullyLoaded = false; + private boolean requiresRestart = false; + private boolean hasMod = false; + + public BukkitCraftEngine(JavaPlugin bootstrap) { + instance = this; + this.bootstrap = bootstrap; + super.classPathAppender = new ReflectionClassPathAppender(this); + super.scheduler = new BukkitSchedulerAdapter(this); + super.logger = new JavaPluginLogger(bootstrap.getLogger()); + Class modClass = ReflectionUtils.getClazz("net.momirealms.craftengine.mod.CraftEnginePlugin"); + if (modClass != null) { + Field isSuccessfullyRegistered = ReflectionUtils.getDeclaredField(modClass, "isSuccessfullyRegistered"); + try { + assert isSuccessfullyRegistered != null; + requiresRestart = !(boolean) isSuccessfullyRegistered.get(null); + hasMod = true; + } catch (Exception ignore) { + } + } + } + + @Override + public void load() { + super.load(); + VersionHelper.init(serverVersion()); + Reflections.init(); + BukkitInjector.init(); + super.networkManager = new BukkitNetworkManager(this); + super.networkManager.init(); + // load mappings and inject blocks + super.blockManager = new BukkitBlockManager(this); + super.furnitureManager = new BukkitFurnitureManager(this); + this.successfullyLoaded = true; + } + + @Override + protected List platformDependencies() { + return List.of( + Dependencies.BSTATS_BUKKIT, + Dependencies.CLOUD_BUKKIT, Dependencies.CLOUD_PAPER, Dependencies.CLOUD_BRIGADIER, Dependencies.CLOUD_MINECRAFT_EXTRAS + ); + } + + @Override + public void enable() { + if (this.hasMod && this.requiresRestart) { + logger().warn(" "); + logger().warn(" "); + logger().warn(" "); + logger().warn("This is the first time you have installed CraftEngine. A restart is required to apply the changes."); + logger().warn(" "); + logger().warn(" "); + logger().warn(" "); + Bukkit.getServer().shutdown(); + return; + } + if (!this.successfullyLoaded) { + logger().severe(" "); + logger().severe(" "); + logger().severe(" "); + logger().severe("Failed to enable CraftEngine. Please check the log on loading stage."); + logger().severe("To reduce the loss caused by plugin not loaded, now shutting down the server"); + logger().severe(" "); + logger().severe(" "); + logger().severe(" "); + Bukkit.getServer().shutdown(); + return; + } + BukkitBlockBehaviors.init(); + BukkitItemBehaviors.init(); + super.senderFactory = new BukkitSenderFactory(this); + super.itemManager = new BukkitItemManager(this); + super.recipeManager = new BukkitRecipeManager(this); + super.commandManager = new BukkitCommandManager(this); + super.worldManager = new BukkitWorldManager(this); + super.enable(); + // tick task + if (VersionHelper.isFolia()) { + this.tickTask = this.scheduler().sync().runRepeating(() -> { + furnitureManager().tick(); + for (BukkitServerPlayer serverPlayer : networkManager().onlineUsers()) { + org.bukkit.entity.Player player = serverPlayer.platformPlayer(); + Location location = player.getLocation(); + scheduler().sync().run(serverPlayer::tick, player.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + }, 1, 1); + } else { + this.tickTask = this.scheduler().sync().runRepeating(() -> { + furnitureManager().tick(); + for (BukkitServerPlayer serverPlayer : networkManager().onlineUsers()) { + serverPlayer.tick(); + } + }, 1, 1); + } + // compatibility + // register expansion + if (this.isPluginEnabled("PlaceholderAPI")) { + new ShiftExpansion(this).register(); + new ImageExpansion(this).register(); + } + // WorldEdit + if (this.isPluginEnabled("FastAsyncWorldEdit")) { + this.blockManager().initFastAsyncWorldEditHook(); + } else if (this.isPluginEnabled("WorldEdit")) { + this.blockManager().initWorldEditHook(); + } + } + + @Override + public void disable() { + super.disable(); + if (this.tickTask != null) this.tickTask.cancel(); + } + + @Override + protected void registerParsers() { + // register template parser + this.packManager.registerConfigSectionParser(this.templateManager); + // register font parser + this.packManager.registerConfigSectionParser(this.fontManager); + // register item parser + this.packManager.registerConfigSectionParser(this.itemManager); + // register block parser + this.packManager.registerConfigSectionParser(this.blockManager); + // register recipe parser + this.packManager.registerConfigSectionParser(this.recipeManager); + } + + @Override + public InputStream resourceStream(String filePath) { + return bootstrap.getResource(filePath.replace("\\", "/")); + } + + @Override + public File dataFolderFile() { + return bootstrap().getDataFolder(); + } + + @Override + public Path dataFolderPath() { + return bootstrap().getDataFolder().toPath().toAbsolutePath(); + } + + @SuppressWarnings("deprecation") + @Override + public String pluginVersion() { + return bootstrap().getDescription().getVersion(); + } + + @Override + public String serverVersion() { + return Bukkit.getServer().getBukkitVersion().split("-")[0]; + } + + @SuppressWarnings("unchecked") + @Override + public SchedulerAdapter scheduler() { + return (SchedulerAdapter) scheduler; + } + + @SuppressWarnings("unchecked") + @Override + public ItemManager itemManager() { + return (ItemManager) itemManager; + } + + @Override + public BukkitBlockManager blockManager() { + return (BukkitBlockManager) blockManager; + } + + @Override + public BukkitFurnitureManager furnitureManager() { + return (BukkitFurnitureManager) furnitureManager; + } + + @SuppressWarnings("unchecked") + @Override + public SenderFactory senderFactory() { + return (SenderFactory) senderFactory; + } + + public JavaPlugin bootstrap() { + return bootstrap; + } + + public static BukkitCraftEngine instance() { + return instance; + } + + @Override + public boolean isPluginEnabled(String plugin) { + return Bukkit.getPluginManager().isPluginEnabled(plugin); + } + + @Override + public String parse(Player player, String text) { + return PlaceholderAPIUtils.parse((org.bukkit.entity.Player) player.platformPlayer(), text); + } + + @Override + public BukkitNetworkManager networkManager() { + return (BukkitNetworkManager) networkManager; + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Override + public void saveResource(String resourcePath) { + if (resourcePath.isEmpty()) { + throw new IllegalArgumentException("ResourcePath cannot be null or empty"); + } + + resourcePath = resourcePath.replace('\\', '/'); + InputStream in = resourceStream(resourcePath); + if (in == null) { + return; + } + + File outFile = new File(dataFolderFile(), resourcePath); + int lastIndex = resourcePath.lastIndexOf('/'); + File outDir = new File(dataFolderFile(), resourcePath.substring(0, Math.max(lastIndex, 0))); + + if (!outDir.exists()) { + outDir.mkdirs(); + } + + try { + if (!outFile.exists()) { + OutputStream out = new FileOutputStream(outFile); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + out.close(); + in.close(); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public YamlDocument loadYamlConfig(String filePath, GeneralSettings generalSettings, LoaderSettings loaderSettings, DumperSettings dumperSettings, UpdaterSettings updaterSettings) { + try (InputStream inputStream = new FileInputStream(resolveConfig(filePath).toFile())) { + return YamlDocument.create(inputStream, resourceStream(filePath), generalSettings, loaderSettings, dumperSettings, updaterSettings); + } catch (IOException e) { + logger.severe("Failed to load config " + filePath, e); + return null; + } + } + + @Override + public YamlDocument loadYamlData(File file) { + try (InputStream inputStream = new FileInputStream(file)) { + return YamlDocument.create(inputStream); + } catch (IOException e) { + logger.severe("Failed to load config " + file, e); + return null; + } + } + + @Override + public Path resolveConfig(String filePath) { + if (filePath == null || filePath.isEmpty()) { + throw new IllegalArgumentException("ResourcePath cannot be null or empty"); + } + filePath = filePath.replace('\\', '/'); + Path configFile = dataFolderPath().resolve(filePath); + // if the config doesn't exist, create it based on the template in the resources dir + if (!Files.exists(configFile)) { + try { + Files.createDirectories(configFile.getParent()); + } catch (IOException ignored) { + } + try (InputStream is = resourceStream(filePath)) { + if (is == null) { + throw new IllegalArgumentException("The embedded resource '" + filePath + "' cannot be found"); + } + Files.copy(is, configFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return configFile; + } + + public BukkitServerPlayer adapt(org.bukkit.entity.Player player) { + if (player == null) return null; + return Optional.ofNullable((BukkitServerPlayer) networkManager().getOnlineUser(player)).orElseGet( + () -> (BukkitServerPlayer) networkManager().getUser(player) + ); + } + + public boolean hasMod() { + return hasMod; + } + + public boolean requiresRestart() { + return requiresRestart; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandFeature.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandFeature.java new file mode 100644 index 000000000..6078fe16b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandFeature.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.bukkit.plugin.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.AbstractCommandFeature; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.util.Pair; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.incendo.cloud.bukkit.data.Selector; + +import java.util.Collection; + +public abstract class BukkitCommandFeature extends AbstractCommandFeature { + + public BukkitCommandFeature(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + public Pair resolveSelector(Selector selector, TranslatableComponent.Builder single, TranslatableComponent.Builder multiple) { + Collection entities = selector.values(); + if (entities.size() == 1) { + return Pair.of(single, Component.text(entities.iterator().next().getName())); + } else { + return Pair.of(multiple, Component.text(entities.size())); + } + } + + public Pair resolveSelector(Collection selector, TranslatableComponent.Builder single, TranslatableComponent.Builder multiple) { + if (selector.size() == 1) { + return Pair.of(single, Component.text(selector.iterator().next().getName())); + } else { + return Pair.of(multiple, Component.text(selector.size())); + } + } + + @Override + public BukkitCraftEngine plugin() { + return (BukkitCraftEngine) super.plugin(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java new file mode 100644 index 000000000..6a641d74d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.bukkit.plugin.command; + +import net.kyori.adventure.util.Index; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.command.feature.*; +import net.momirealms.craftengine.core.plugin.command.AbstractCommandManager; +import net.momirealms.craftengine.core.plugin.command.CommandFeature; +import net.momirealms.craftengine.core.plugin.command.parser.BlockStateParser; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.bukkit.CloudBukkitCapabilities; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.paper.LegacyPaperCommandManager; +import org.incendo.cloud.setting.ManagerSetting; + +import java.util.List; + +public class BukkitCommandManager extends AbstractCommandManager { + private final BukkitCraftEngine plugin; + private final Index> INDEX; + + public BukkitCommandManager(BukkitCraftEngine plugin) { + super(plugin, new LegacyPaperCommandManager<>( + plugin.bootstrap(), + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.identity() + )); + this.plugin = plugin; + this.INDEX = Index.create(CommandFeature::getFeatureID, List.of( + new ReloadCommand(this, plugin), + new GetItemCommand(this, plugin), + new DebugStateCommand(this, plugin), + new TestCommand(this, plugin), + new SetBlockCommand(this, plugin) + )); + final LegacyPaperCommandManager manager = (LegacyPaperCommandManager) getCommandManager(); + manager.settings().set(ManagerSetting.ALLOW_UNSAFE_REGISTRATION, true); + manager.parserRegistry().registerParser(BlockStateParser.blockStateParser()); + if (manager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + manager.registerBrigadier(); + manager.brigadierManager().setNativeNumberSuggestions(true); + } else if (manager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { + manager.registerAsynchronousCompletions(); + } + } + + @Override + protected Sender wrapSender(CommandSender sender) { + return plugin.senderFactory().wrap(sender); + } + + @Override + public Index> features() { + return INDEX; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java new file mode 100644 index 000000000..57985118a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.plugin.command; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.util.Tristate; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.command.RemoteConsoleCommandSender; +import org.bukkit.entity.Player; + +import java.util.UUID; + +public class BukkitSenderFactory extends SenderFactory { + private final BukkitAudiences audiences; + + public BukkitSenderFactory(BukkitCraftEngine plugin) { + super(plugin); + this.audiences = BukkitAudiences.create(plugin.bootstrap()); + } + + @Override + protected String name(CommandSender sender) { + if (sender instanceof Player) { + return sender.getName(); + } + return Sender.CONSOLE_NAME; + } + + @Override + protected UUID uniqueId(CommandSender sender) { + if (sender instanceof Player) { + return ((Player) sender).getUniqueId(); + } + return Sender.CONSOLE_UUID; + } + + @Override + public Audience audience(CommandSender sender) { + return this.audiences.sender(sender); + } + + @Override + protected void sendMessage(CommandSender sender, Component message) { + // we can safely send async for players and the console - otherwise, send it sync + if (sender instanceof Player || sender instanceof ConsoleCommandSender || sender instanceof RemoteConsoleCommandSender) { + audience(sender).sendMessage(message); + } else { + plugin().scheduler().executeSync(() -> audience(sender).sendMessage(message)); + } + } + + @Override + protected Tristate permissionState(CommandSender sender, String node) { + if (sender.hasPermission(node)) { + return Tristate.TRUE; + } else if (sender.isPermissionSet(node)) { + return Tristate.FALSE; + } else { + return Tristate.UNDEFINED; + } + } + + @Override + protected boolean hasPermission(CommandSender sender, String node) { + return sender.hasPermission(node); + } + + @Override + protected void performCommand(CommandSender sender, String command) { + plugin().bootstrap().getServer().dispatchCommand(sender, command); + } + + @Override + protected boolean isConsole(CommandSender sender) { + return sender instanceof ConsoleCommandSender || sender instanceof RemoteConsoleCommandSender; + } + + @Override + public void close() { + super.close(); + this.audiences.close(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugStateCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugStateCommand.java new file mode 100644 index 000000000..d04caf821 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugStateCommand.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import org.bukkit.Bukkit; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; +import org.incendo.cloud.parser.standard.StringParser; + +public class DebugStateCommand extends BukkitCommandFeature { + + public DebugStateCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .required("state", StringParser.greedyStringParser()) + .handler(context -> { + String state = context.get("state"); + BlockData blockData = Bukkit.createBlockData(state); + int id = BlockStateUtils.blockDataToId(blockData); + context.sender().sendMessage(String.valueOf(id)); + Object o1 = BlockStateUtils.blockDataToBlockState(blockData); + Object o2 = BlockStateUtils.idToBlockState(id); + }); + } + + @Override + public String getFeatureID() { + return "debug_state"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java new file mode 100644 index 000000000..c48445fcc --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java @@ -0,0 +1,71 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.PlayerUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +public class GetItemCommand extends BukkitCommandFeature { + + public GetItemCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .flag(FlagKeys.SILENT_FLAG) + .flag(FlagKeys.TO_INVENTORY_FLAG) + .required("id", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().itemManager().items().stream().map(it -> Suggestion.suggestion(it.toString())).toList()); + } + })) + .optional("amount", IntegerParser.integerParser(1, 6400)) + .handler(context -> { + Player player = context.sender(); + int amount = context.getOrDefault("amount", 1); + boolean toInv = context.flags().hasFlag(FlagKeys.TO_INVENTORY); + NamespacedKey namespacedKey = context.get("id"); + Key key = Key.of(namespacedKey.namespace(), namespacedKey.value()); + ItemStack builtItem = plugin().itemManager().buildCustomItemStack(key, plugin().adapt(context.sender())); + if (builtItem == null) return; + int amountToGive = amount; + int maxStack = builtItem.getMaxStackSize(); + while (amountToGive > 0) { + int perStackSize = Math.min(maxStack, amountToGive); + amountToGive -= perStackSize; + ItemStack more = builtItem.clone(); + more.setAmount(perStackSize); + if (toInv) { + PlayerUtils.putItemsToInventory(player.getInventory(), more, more.getAmount()); + } else { + PlayerUtils.dropItem(player, more, false, true, false); + } + } + }); + } + + @Override + public String getFeatureID() { + return "get_item"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java new file mode 100644 index 000000000..b8f8af41e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.Command; + +public class ReloadCommand extends BukkitCommandFeature { + + public ReloadCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .flag(manager.flagBuilder("silent").withAliases("s")) + .handler(context -> { + long time1 = System.currentTimeMillis(); + plugin().reload(); + handleFeedback(context, MessageConstants.COMMAND_RELOAD_SUCCESS, Component.text(System.currentTimeMillis() - time1)); + }); + } + + @Override + public String getFeatureID() { + return "reload"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetBlockCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetBlockCommand.java new file mode 100644 index 000000000..ad88f08ad --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetBlockCommand.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.block.BlockStateParser; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.bukkit.parser.location.LocationParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +public class SetBlockCommand extends BukkitCommandFeature { + + public SetBlockCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .flag(FlagKeys.SILENT_FLAG) + .required("location", LocationParser.locationParser()) + .required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().blockManager().cachedSuggestions()); + } + })) + .handler(context -> { + String data = context.get("id"); + ImmutableBlockState state = BlockStateParser.deserialize(data); + if (state == null) return; + Location location = context.get("location"); + CraftEngineBlocks.place(location, state, UpdateOption.UPDATE_ALL); + }); + } + + @Override + public String getFeatureID() { + return "setblock"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java new file mode 100644 index 000000000..0aa002af8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.Command; + +import java.util.List; + +public class TestCommand extends BukkitCommandFeature { + + public TestCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .handler(context -> { + List> holders = plugin().itemManager().tagToItems(Key.of("minecraft:planks")); + for (Holder holder : holders) { + context.sender().sendMessage(holder.registeredName()); + } + }); + } + + @Override + public String getFeatureID() { + return "debug_test"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java new file mode 100644 index 000000000..9132383ce --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -0,0 +1,471 @@ +package net.momirealms.craftengine.bukkit.plugin.injector; + +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.ClassFileVersion; +import net.bytebuddy.description.modifier.Visibility; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy; +import net.bytebuddy.implementation.FieldAccessor; +import net.bytebuddy.implementation.FixedValue; +import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.implementation.bind.annotation.*; +import net.bytebuddy.matcher.ElementMatchers; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.block.BukkitBlockShape; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.NoteBlockChainUpdateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.BlockKeys; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.StatePredicate; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.SectionPosUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.SectionPos; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.craftengine.shared.ObjectHolder; +import net.momirealms.craftengine.shared.block.*; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.Callable; + +public class BukkitInjector { + private static final ByteBuddy byteBuddy = new ByteBuddy(ClassFileVersion.JAVA_V17); + private static final BukkitBlockShape STONE_SHAPE = new BukkitBlockShape(Reflections.instance$Blocks$STONE$defaultState); + + private static Class clazz$InjectedPalettedContainer; + private static Field field$InjectedPalettedContainer$target; + private static Field field$InjectedPalettedContainer$section; + private static Field field$InjectedPalettedContainer$world; + private static Field field$InjectedPalettedContainer$pos; + + private static Class clazz$OptimizedItemDisplay; + private static Constructor constructor$OptimizedItemDisplay; + + private static Class clazz$OptimizedItemDisplayFatory; + private static Object instance$OptimizedItemDisplayFactory; + + private static Class clazz$CraftEngineBlock; + private static MethodHandle constructor$CraftEngineBlock; + private static Field field$CraftEngineBlock$behavior; + private static Field field$CraftEngineBlock$shape; + private static Field field$CraftEngineBlock$isNoteBlock; + + public static void init() { + try { + // Paletted Container + clazz$InjectedPalettedContainer = byteBuddy + .subclass(Reflections.clazz$PalettedContainer) + .name("net.minecraft.world.level.chunk.InjectedPalettedContainer") + .defineField("target", Reflections.clazz$PalettedContainer, Visibility.PRIVATE) + .defineField("cesection", CESection.class, Visibility.PRIVATE) + .defineField("ceworld", CEWorld.class, Visibility.PRIVATE) + .defineField("cepos", SectionPos.class, Visibility.PRIVATE) + .method(ElementMatchers.any()) + .intercept(MethodDelegation.to(PalettedContainerMethodInterceptor.INSTANCE)) + .method(ElementMatchers.takesArguments(4) + .and(ElementMatchers.takesArgument(0, int.class)) + .and(ElementMatchers.takesArgument(1, int.class)) + .and(ElementMatchers.takesArgument(2, int.class)) + .and(ElementMatchers.named("getAndSet").or(ElementMatchers.named("a"))) + ) + .intercept(MethodDelegation.to(GetAndSetInterceptor.INSTANCE)) + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + field$InjectedPalettedContainer$target = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "target"); + field$InjectedPalettedContainer$section = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "cesection"); + field$InjectedPalettedContainer$world = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "ceworld"); + field$InjectedPalettedContainer$pos = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "cepos"); + // State Predicate + DynamicType.Unloaded alwaysTrue = byteBuddy + .subclass(Reflections.clazz$StatePredicate) + .method(ElementMatchers.named("test")) + .intercept(FixedValue.value(true)) + .make(); + Class alwaysTrueClass = alwaysTrue.load(BukkitInjector.class.getClassLoader()).getLoaded(); + DynamicType.Unloaded alwaysFalse = byteBuddy + .subclass(Reflections.clazz$StatePredicate) + .method(ElementMatchers.named("test")) + .intercept(FixedValue.value(false)) + .make(); + Class alwaysFalseClass = alwaysFalse.load(BukkitInjector.class.getClassLoader()).getLoaded(); + StatePredicate.init(alwaysTrueClass.getDeclaredConstructor().newInstance(), alwaysFalseClass.getDeclaredConstructor().newInstance()); + // Optimized Item Display + clazz$OptimizedItemDisplay = byteBuddy + .subclass(Reflections.clazz$Display$ItemDisplay, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .name("net.minecraft.world.entity.OptimizedItemDisplay") + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + constructor$OptimizedItemDisplay = ReflectionUtils.getConstructor(clazz$OptimizedItemDisplay, Reflections.clazz$EntityType, Reflections.clazz$Level); + clazz$OptimizedItemDisplayFatory = byteBuddy + .subclass(Object.class, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .name("net.momirealms.craftengine.bukkit.entity.OptimizedItemDisplayFactory") + .implement(Reflections.clazz$EntityType$EntityFactory) + .method(ElementMatchers.named("create")) + .intercept(MethodDelegation.to(OptimizedItemDisplayMethodInterceptor.INSTANCE)) + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + instance$OptimizedItemDisplayFactory = Objects.requireNonNull(ReflectionUtils.getConstructor(clazz$OptimizedItemDisplayFatory, 0)).newInstance(); + + String packageWithName = BukkitInjector.class.getName(); + String generatedClassName = packageWithName.substring(0, packageWithName.lastIndexOf('.')) + ".CraftEngineBlock"; + DynamicType.Builder builder = byteBuddy + .subclass(Reflections.clazz$Block, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .name(generatedClassName) + .defineField("behaviorHolder", ObjectHolder.class, Visibility.PUBLIC) + .defineField("shapeHolder", ObjectHolder.class, Visibility.PUBLIC) + .defineField("isClientSideNoteBlock", boolean.class, Visibility.PUBLIC) + // should always implement this interface + .implement(Reflections.clazz$Fallable) + // duck + .implement(BehaviorHolder.class) + .implement(ShapeHolder.class) + .implement(NoteBlockIndicator.class) + .method(ElementMatchers.named("getBehaviorHolder")) + .intercept(FieldAccessor.ofField("behaviorHolder")) + .method(ElementMatchers.named("getShapeHolder")) + .intercept(FieldAccessor.ofField("shapeHolder")) + .method(ElementMatchers.named("isNoteBlock")) + .intercept(FieldAccessor.ofField("isClientSideNoteBlock")) + // getShape + .method(ElementMatchers.returns(Reflections.clazz$VoxelShape) + .and(ElementMatchers.takesArguments(4)) + .and(ElementMatchers.named("getShape").or(ElementMatchers.named("a")))) + .intercept(MethodDelegation.to(GetShapeInterceptor.INSTANCE)) + // tick + .method(ElementMatchers.takesArguments(4) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$ServerLevel)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockPos)) + .and(ElementMatchers.takesArgument(3, Reflections.clazz$RandomSource)) + .and(ElementMatchers.named("tick").or(ElementMatchers.named("a"))) + ) + .intercept(MethodDelegation.to(TickInterceptor.INSTANCE)) + // random tick + .method(ElementMatchers.takesArguments(4) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$ServerLevel)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockPos)) + .and(ElementMatchers.takesArgument(3, Reflections.clazz$RandomSource)) + .and(ElementMatchers.named("randomTick").or(ElementMatchers.named("b"))) + ) + .intercept(MethodDelegation.to(RandomTickInterceptor.INSTANCE)) + // onPlace + .method(ElementMatchers.takesArguments(5) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$Level)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockPos)) + .and(ElementMatchers.takesArgument(3, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(4, boolean.class)) + .and(ElementMatchers.named("onPlace").or(ElementMatchers.named("a"))) + ) + .intercept(MethodDelegation.to(OnPlaceInterceptor.INSTANCE)) + // onBrokenAfterFall + .method(ElementMatchers.takesArguments(3) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$Level)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$BlockPos)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$FallingBlockEntity)) + ) + .intercept(MethodDelegation.to(OnBrokenAfterFallInterceptor.INSTANCE)) + // canSurvive + .method(ElementMatchers.takesArguments(3) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$LevelReader)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockPos)) + ) + .intercept(MethodDelegation.to(CanSurviveInterceptor.INSTANCE)) + // updateShape + .method(ElementMatchers.returns(Reflections.clazz$BlockState) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + // LevelReader 1.21.3+ // 1.20-1.12.2 + .and(ElementMatchers.takesArgument(1, Reflections.clazz$LevelReader).or(ElementMatchers.takesArgument(1, Reflections.clazz$Direction))) + .and(ElementMatchers.named("updateShape").or(ElementMatchers.named("a")))) + .intercept(MethodDelegation.to(UpdateShapeInterceptor.INSTANCE)) + // getFluidState + .method(ElementMatchers.returns(Reflections.clazz$FluidState) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState))) + .intercept(MethodDelegation.to(FluidStateInterceptor.INSTANCE)); + clazz$CraftEngineBlock = builder.make().load(BukkitInjector.class.getClassLoader()).getLoaded(); + + constructor$CraftEngineBlock = MethodHandles.publicLookup().in(clazz$CraftEngineBlock) + .findConstructor(clazz$CraftEngineBlock, MethodType.methodType(void.class, Reflections.clazz$BlockBehaviour$Properties)) + .asType(MethodType.methodType(Reflections.clazz$Block, Reflections.clazz$BlockBehaviour$Properties)); + + field$CraftEngineBlock$behavior = clazz$CraftEngineBlock.getField("behaviorHolder"); + field$CraftEngineBlock$shape = clazz$CraftEngineBlock.getField("shapeHolder"); + field$CraftEngineBlock$isNoteBlock = clazz$CraftEngineBlock.getField("isClientSideNoteBlock"); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to init injector", e); + } + } + + public static Object getOptimizedItemDisplayFactory() { + return instance$OptimizedItemDisplayFactory; + } + + public static class OptimizedItemDisplayMethodInterceptor { + public static final OptimizedItemDisplayMethodInterceptor INSTANCE = new OptimizedItemDisplayMethodInterceptor(); + + @RuntimeType + public Object intercept(@AllArguments Object[] args) throws Exception { + return constructor$OptimizedItemDisplay.newInstance(args[0], args[1]); + } + } + + public static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEWorld ceWorld, SectionPos pos) { + try { + Object container = Reflections.field$LevelChunkSection$states.get(targetSection); + if (!clazz$InjectedPalettedContainer.isInstance(container)) { + Object injectedObject = Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); + field$InjectedPalettedContainer$target.set(injectedObject, container); + field$InjectedPalettedContainer$section.set(injectedObject, ceSection); + field$InjectedPalettedContainer$world.set(injectedObject, ceWorld); + field$InjectedPalettedContainer$pos.set(injectedObject, pos); + Reflections.field$PalettedContainer$data.set(injectedObject, Reflections.field$PalettedContainer$data.get(container)); + Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject); + } + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to inject chunk section", e); + } + } + + public static void uninjectLevelChunkSection(Object section) { + try { + Object states = Reflections.field$LevelChunkSection$states.get(section); + if (clazz$InjectedPalettedContainer.isInstance(states)) { + Reflections.field$LevelChunkSection$states.set(section, field$InjectedPalettedContainer$target.get(states)); + } + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to inject chunk section", e); + } + } + + public static class PalettedContainerMethodInterceptor { + public static final PalettedContainerMethodInterceptor INSTANCE = new PalettedContainerMethodInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @Origin Method method) throws Exception { + Object target = field$InjectedPalettedContainer$target.get(thisObj); + return method.invoke(target, args); + } + } + + public static class GetAndSetInterceptor { + public static final GetAndSetInterceptor INSTANCE = new GetAndSetInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @Origin Method method) throws Exception { + Object targetStates = field$InjectedPalettedContainer$target.get(thisObj); + Object previousState = method.invoke(targetStates, args); + try { + int x = (int) args[0]; + int y = (int) args[1]; + int z = (int) args[2]; + Object newState = args[3]; + int stateId = BlockStateUtils.blockStateToId(newState); + CESection section = (CESection) field$InjectedPalettedContainer$section.get(thisObj); + if (BlockStateUtils.isVanillaBlock(stateId)) { + section.setBlockState(x, y, z, EmptyBlock.INSTANCE.getDefaultState()); + if (ConfigManager.enableLightSystem() && ConfigManager.forceUpdateLight()) { + updateLightIfChanged(thisObj, previousState, newState, null, y, z, x); + } + } else { + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); + section.setBlockState(x, y, z, immutableBlockState); + if (ConfigManager.enableLightSystem()) { + updateLightIfChanged(thisObj, previousState, newState, immutableBlockState.vanillaBlockState().handle(), y, z, x); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to intercept setBlockState", e); + } + return previousState; + } + + private void updateLightIfChanged(@This Object thisObj, Object previousBlockState, Object newState, @Nullable Object clientSideNewState, int y, int z, int x) throws ReflectiveOperationException { + int previousLight = BlockStateUtils.getLightEmission(previousBlockState); + int newLight = BlockStateUtils.getLightEmission(newState); + if (previousLight != newLight || (clientSideNewState != null && (BlockStateUtils.isOcclude(newState) != BlockStateUtils.isOcclude(clientSideNewState)))) { + CEWorld world = (CEWorld) field$InjectedPalettedContainer$world.get(thisObj); + SectionPos sectionPos = (SectionPos) field$InjectedPalettedContainer$pos.get(thisObj); + Set posSet = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight)); + world.sectionLightUpdated(posSet); + } + } + } + + public static Object generateBlock(Key replacedBlock, Object ownerBlock, Object properties) throws Throwable { + Object ownerProperties = Reflections.field$BlockBehaviour$properties.get(ownerBlock); + Reflections.field$BlockBehaviour$Properties$hasCollision.set(properties, Reflections.field$BlockBehaviour$Properties$hasCollision.get(ownerProperties)); + + ObjectHolder behaviorHolder = new ObjectHolder<>(EmptyBlockBehavior.INSTANCE); + ObjectHolder shapeHolder = new ObjectHolder<>(STONE_SHAPE); + + Object newBlockInstance = constructor$CraftEngineBlock.invoke(properties); + field$CraftEngineBlock$behavior.set(newBlockInstance, behaviorHolder); + field$CraftEngineBlock$shape.set(newBlockInstance, shapeHolder); + field$CraftEngineBlock$isNoteBlock.set(newBlockInstance, replacedBlock.equals(BlockKeys.NOTE_BLOCK)); + return newBlockInstance; + } + + public static class FluidStateInterceptor { + public static final FluidStateInterceptor INSTANCE = new FluidStateInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().getFluidState(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run getFluidState", e); + return args[0]; + } + } + } + + public static class UpdateShapeInterceptor { + public static final UpdateShapeInterceptor INSTANCE = new UpdateShapeInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + if (((NoteBlockIndicator) thisObj).isNoteBlock()) { + startNoteBlockChain(args); + } + try { + return holder.value().updateShape(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run updateShape", e); + return args[0]; + } + } + } + + private static void startNoteBlockChain(Object[] args) throws ReflectiveOperationException { + Object direction; + Object serverLevel; + Object blockPos; + if (VersionHelper.isVersionNewerThan1_21_2()) { + direction = args[4]; + serverLevel = args[1]; + blockPos = args[3]; + } else { + direction = args[1]; + serverLevel = args[3]; + blockPos = args[4]; + } + int id = (int) Reflections.field$Direction$data3d.get(direction); + // Y axis + if (id == 0 || id == 1) { + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(serverLevel); + Reflections.method$ServerChunkCache$blockChanged.invoke(chunkSource, blockPos); + if (id == 1) { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$DOWN, blockPos, 0); + } else { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$UP, blockPos, 0); + } + } + } + + public static class GetShapeInterceptor { + public static final GetShapeInterceptor INSTANCE = new GetShapeInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((ShapeHolder) thisObj).getShapeHolder(); + try { + return holder.value().getShape(thisObj, args); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run getShape", e); + return superMethod.call(); + } + } + } + + public static class RandomTickInterceptor { + public static final RandomTickInterceptor INSTANCE = new RandomTickInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().randomTick(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run randomTick", e); + } + } + } + + public static class TickInterceptor { + public static final TickInterceptor INSTANCE = new TickInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().tick(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run tick", e); + } + } + } + + public static class OnPlaceInterceptor { + public static final OnPlaceInterceptor INSTANCE = new OnPlaceInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().onPlace(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run onPlace", e); + } + } + } + + public static class OnBrokenAfterFallInterceptor { + public static final OnBrokenAfterFallInterceptor INSTANCE = new OnBrokenAfterFallInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().onBrokenAfterFall(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run onBrokenAfterFall", e); + } + } + } + + public static class CanSurviveInterceptor { + public static final CanSurviveInterceptor INSTANCE = new CanSurviveInterceptor(); + + @RuntimeType + public boolean intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().canSurvive(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run canSurvive", e); + return true; + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java new file mode 100644 index 000000000..995f1d960 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -0,0 +1,570 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.*; +import io.netty.handler.codec.MessageToMessageDecoder; +import io.netty.handler.codec.MessageToMessageEncoder; +import io.netty.util.internal.logging.InternalLogger; +import io.netty.util.internal.logging.InternalLoggerFactory; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.network.impl.*; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.ListMonitor; +import net.momirealms.craftengine.core.util.TriConsumer; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiConsumer; + +public class BukkitNetworkManager implements NetworkManager, Listener { + private static BukkitNetworkManager instance; + private static final Map, TriConsumer> nmsPacketFunctions = new HashMap<>(); + private static final Map> byteBufPacketFunctions = new HashMap<>(); + + private static void registerNMSPacketConsumer(final TriConsumer function, @Nullable Class packet) { + if (packet == null) return; + nmsPacketFunctions.put(packet, function); + } + + private static void registerByteBufPacketConsumer(final BiConsumer function, int id) { + byteBufPacketFunctions.put(id, function); + } + + private final BiConsumer> packetsConsumer; + private final BiConsumer delayedPacketConsumer; + private final BiConsumer immediatePacketConsumer; + private final BukkitCraftEngine plugin; + + private final Map users = new ConcurrentHashMap<>(); + private final Map onlineUsers = new ConcurrentHashMap<>(); + private final HashSet injectedChannels = new HashSet<>(); + + private final PacketIds packetIds; + + private static final String CONNECTION_HANDLER_NAME = "craftengine_connection_handler"; + private static final String SERVER_CHANNEL_HANDLER_NAME = "craftengine_server_channel_handler"; + private static final String PLAYER_CHANNEL_HANDLER_NAME = "craftengine_player_packet_handler"; + private static final String PACKET_ENCODER = "craftengine_encoder"; + private static final String PACKET_DECODER = "craftengine_decoder"; + + private boolean active; + private boolean init; + + public BukkitNetworkManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + if (VersionHelper.isVersionNewerThan1_21_2()) { + this.packetIds = new PacketIds1_21_2(); + } else if (VersionHelper.isVersionNewerThan1_20_5()) { + this.packetIds = new PacketIds1_20_5(); + } else if (VersionHelper.isVersionNewerThan1_20_3()) { + this.packetIds = new PacketIds1_20_3(); + } else if (VersionHelper.isVersionNewerThan1_20_2()) { + this.packetIds = new PacketIds1_20_2(); + } else { + this.packetIds = new PacketIds1_20(); + } + this.registerConsumers(); + this.packetsConsumer = ((serverPlayer, packets) -> { + try { + Object bundle = Reflections.constructor$ClientboundBundlePacket.newInstance(packets); + Reflections.method$ServerGamePacketListenerImpl$sendPacket.invoke( + Reflections.field$ServerPlayer$connection.get(serverPlayer), bundle); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to create bundle packet", e); + } + }); + this.delayedPacketConsumer = (serverPlayer, packet) -> { + try { + Reflections.method$ServerGamePacketListenerImpl$sendPacket.invoke( + Reflections.field$ServerPlayer$connection.get(serverPlayer), packet); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to invoke send packet", e); + } + }; + this.immediatePacketConsumer = (serverPlayer, packet) -> { + try { + Reflections.method$Connection$sendPacketImmediate.invoke(Reflections.field$ServerCommonPacketListenerImpl$connection.get(Reflections.field$ServerPlayer$connection.get(serverPlayer)), + packet, null, true + ); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to invoke send packet", e); + } + }; + this.active = true; + instance = this; + } + + private void registerConsumers() { + registerNMSPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, Reflections.clazz$ClientboundLevelChunkWithLightPacket); + registerNMSPacketConsumer(PacketConsumers.PLAYER_ACTION, Reflections.clazz$ServerboundPlayerActionPacket); + registerNMSPacketConsumer(PacketConsumers.SWING_HAND, Reflections.clazz$ServerboundSwingPacket); + registerNMSPacketConsumer(PacketConsumers.USE_ITEM_ON, Reflections.clazz$ServerboundUseItemOnPacket); + registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_BLOCK, Reflections.clazz$ServerboundPickItemFromBlockPacket); + registerNMSPacketConsumer(PacketConsumers.SET_CREATIVE_SLOT, Reflections.clazz$ServerboundSetCreativeModeSlotPacket); + registerNMSPacketConsumer(PacketConsumers.ADD_ENTITY, Reflections.clazz$ClientboundAddEntityPacket); + registerNMSPacketConsumer(PacketConsumers.LOGIN, Reflections.clazz$ClientboundLoginPacket); + registerNMSPacketConsumer(PacketConsumers.RESPAWN, Reflections.clazz$ClientboundRespawnPacket); + registerNMSPacketConsumer(PacketConsumers.INTERACT_ENTITY, Reflections.clazz$ServerboundInteractPacket); + registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); + registerNMSPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, Reflections.clazz$ClientboundEntityPositionSyncPacket); + registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$Pos); + registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket); + registerNMSPacketConsumer(PacketConsumers.SOUND, Reflections.clazz$ClientboundSoundPacket); + registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); + registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); + registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); + } + + public static BukkitNetworkManager instance() { + return instance; + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + BukkitServerPlayer user = (BukkitServerPlayer) getUser(player); + if (user != null) { + user.setPlayer(player); + this.onlineUsers.put(player.getUniqueId(), user); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + Channel channel = getChannel(player); + NetWorkUser user = removeUser(channel); + if (user == null) return; + handleDisconnection(channel); + this.onlineUsers.remove(player.getUniqueId()); + } + + @Override + public Collection onlineUsers() { + return onlineUsers.values(); + } + + @Override + public void init() { + if (init) return; + try { + Object server = Reflections.method$MinecraftServer$getServer.invoke(null); + Object serverConnection = Reflections.field$MinecraftServer$connection.get(server); + @SuppressWarnings("unchecked") + List channels = (List) Reflections.field$ServerConnectionListener$channels.get(serverConnection); + ListMonitor monitor = new ListMonitor<>(channels, (future) -> { + if (!active) return; + Channel channel = future.channel(); + injectServerChannel(channel); + injectedChannels.add(channel); + }, (object) -> {}); + Reflections.field$ServerConnectionListener$channels.set(serverConnection, monitor); + init = true; + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to init server connection", e); + } + } + + @Override + public void enable() { + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + } + + @Override + public void shutdown() { + HandlerList.unregisterAll(this); + for (Channel channel : injectedChannels) { + uninjectServerChannel(channel); + } + for (Player player : Bukkit.getOnlinePlayers()) { + handleDisconnection(getChannel(player)); + } + injectedChannels.clear(); + active = false; + } + + @Override + public void setUser(Channel channel, NetWorkUser user) { + ChannelPipeline pipeline = channel.pipeline(); + users.put(pipeline, (BukkitServerPlayer) user); + } + + @Override + public NetWorkUser getUser(Channel channel) { + ChannelPipeline pipeline = channel.pipeline(); + return users.get(pipeline); + } + + @Override + public NetWorkUser removeUser(Channel channel) { + ChannelPipeline pipeline = channel.pipeline(); + return users.remove(pipeline); + } + + @Override + public Channel getChannel(net.momirealms.craftengine.core.entity.player.Player player) { + return getChannel((Player) player.platformPlayer()); + } + + public NetWorkUser getUser(Player player) { + return getUser(getChannel(player)); + } + + public NetWorkUser getOnlineUser(Player player) { + return onlineUsers.get(player.getUniqueId()); + } + + public Channel getChannel(Player player) { + try { + return (Channel) Reflections.field$Channel.get( + Reflections.field$NetworkManager.get( + Reflections.field$ServerPlayer$connection.get( + Reflections.method$CraftPlayer$getHandle.invoke(player) + ) + ) + ); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public void sendPacket(@NotNull Player player, @NotNull Object packet) { + try { + Object serverPlayer = Reflections.method$CraftPlayer$getHandle.invoke(player); + this.immediatePacketConsumer.accept(serverPlayer, packet); + } catch (Exception e) { + this.plugin.logger().warn("Failed to send packet", e); + } + } + + public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) { + if (immediately) { + this.immediatePacketConsumer.accept(player.serverPlayer(), packet); + } else { + this.delayedPacketConsumer.accept(player.serverPlayer(), packet); + } + } + + public void sendPackets(@NotNull NetWorkUser player, List packet) { + this.packetsConsumer.accept(player.serverPlayer(), packet); + } + + private void injectServerChannel(Channel serverChannel) { + ChannelPipeline pipeline = serverChannel.pipeline(); + ChannelHandler connectionHandler = pipeline.get(CONNECTION_HANDLER_NAME); + if (connectionHandler != null) { + pipeline.remove(CONNECTION_HANDLER_NAME); + } + if (pipeline.get("SpigotNettyServerChannelHandler#0") != null) { + pipeline.addAfter("SpigotNettyServerChannelHandler#0", CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } else if (pipeline.get("floodgate-init") != null) { + pipeline.addAfter("floodgate-init", CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } else if (pipeline.get("MinecraftPipeline#0") != null) { + pipeline.addAfter("MinecraftPipeline#0", CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } else { + pipeline.addFirst(CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } + + for (Player player : Bukkit.getOnlinePlayers()) { + Channel channel = getChannel(player); + NetWorkUser user = getUser(player); + if (user == null) { + user = new BukkitServerPlayer(plugin, channel); + ((BukkitServerPlayer) user).setPlayer(player); + injectChannel(channel, ConnectionState.PLAY); + } + } + } + + private void uninjectServerChannel(Channel channel) { + if (channel.pipeline().get(CONNECTION_HANDLER_NAME) != null) { + channel.pipeline().remove(CONNECTION_HANDLER_NAME); + } + } + + public void handleDisconnection(Channel channel) { + NetWorkUser user = removeUser(channel); + if (user == null) return; + if (channel.pipeline().get(PLAYER_CHANNEL_HANDLER_NAME) != null) { + channel.pipeline().remove(PLAYER_CHANNEL_HANDLER_NAME); + } + if (channel.pipeline().get(PACKET_ENCODER) != null) { + channel.pipeline().remove(PACKET_ENCODER); + } + if (channel.pipeline().get(PACKET_DECODER) != null) { + channel.pipeline().remove(PACKET_DECODER); + } + } + + public class ServerChannelHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(@NotNull ChannelHandlerContext context, @NotNull Object c) throws Exception { + Channel channel = (Channel) c; + channel.pipeline().addLast(SERVER_CHANNEL_HANDLER_NAME, new PreChannelInitializer()); + super.channelRead(context, c); + } + } + + public class PreChannelInitializer extends ChannelInboundHandlerAdapter { + + private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelInitializer.class); + + @Override + public void channelRegistered(ChannelHandlerContext context) { + try { + injectChannel(context.channel(), ConnectionState.HANDSHAKING); + } catch (Throwable t) { + exceptionCaught(context, t); + } finally { + ChannelPipeline pipeline = context.pipeline(); + if (pipeline.context(this) != null) { + pipeline.remove(this); + } + } + context.pipeline().fireChannelRegistered(); + } + + @Override + public void exceptionCaught(ChannelHandlerContext context, Throwable t) { + PreChannelInitializer.logger.warn("Failed to inject channel: " + context.channel(), t); + context.close(); + } + } + + public void injectChannel(Channel channel, ConnectionState state) { + if (isFakeChannel(channel)) { + return; + } + + BukkitServerPlayer user = new BukkitServerPlayer(plugin, channel); + if (channel.pipeline().get("splitter") == null) { + channel.close(); + return; + } + + ChannelPipeline pipeline = channel.pipeline(); + if (pipeline.get(PACKET_ENCODER) != null) { + pipeline.remove(PACKET_ENCODER); + } + if (pipeline.get(PACKET_DECODER) != null) { + pipeline.remove(PACKET_DECODER); + } + for (Map.Entry entry : pipeline.toMap().entrySet()) { + if (Reflections.clazz$Connection.isAssignableFrom(entry.getValue().getClass())) { + pipeline.addBefore(entry.getKey(), PLAYER_CHANNEL_HANDLER_NAME, new PluginChannelHandler(user)); + break; + } + } + + String decoderName = pipeline.names().contains("inbound_config") ? "inbound_config" : "decoder"; + pipeline.addBefore(decoderName, PACKET_DECODER, new PluginChannelDecoder(user)); + String encoderName = pipeline.names().contains("outbound_config") ? "outbound_config" : "encoder"; + pipeline.addBefore(encoderName, PACKET_ENCODER, new PluginChannelEncoder(user)); + + channel.closeFuture().addListener((ChannelFutureListener) future -> handleDisconnection(user.nettyChannel())); + setUser(channel, user); + } + + public static boolean isFakeChannel(Object channel) { + return channel.getClass().getSimpleName().equals("FakeChannel") + || channel.getClass().getSimpleName().equals("SpoofedChannel"); + } + + public class PluginChannelHandler extends ChannelDuplexHandler { + + private final NetWorkUser player; + + public PluginChannelHandler(NetWorkUser player) { + this.player = player; + } + + @Override + public void write(ChannelHandlerContext context, Object packet, ChannelPromise channelPromise) throws Exception { + try { + NMSPacketEvent event = new NMSPacketEvent(packet); + onNMSPacketSend(player, event, packet); + if (event.isCancelled()) return; + super.write(context, packet, channelPromise); + channelPromise.addListener((p) -> { + for (Runnable task : event.getDelayedTasks()) { + task.run(); + } + }); + } catch (Throwable e) { + plugin.logger().severe("An error occurred when reading packets", e); + super.write(context, packet, channelPromise); + } + } + + @Override + public void channelRead(@NotNull ChannelHandlerContext context, @NotNull Object packet) throws Exception { + NMSPacketEvent event = new NMSPacketEvent(packet); + onNMSPacketReceive(player, event, packet); + if (event.isCancelled()) return; + super.channelRead(context, packet); + } + } + + public class PluginChannelEncoder extends MessageToMessageEncoder { + private final NetWorkUser player; + private boolean handledCompression = false; + + public PluginChannelEncoder(NetWorkUser player) { + this.player = player; + } + + public PluginChannelEncoder(PluginChannelEncoder encoder) { + this.player = encoder.player; + this.handledCompression = encoder.handledCompression; + } + + @Override + protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) { + boolean needCompression = !handledCompression && handleCompression(channelHandlerContext, byteBuf); + this.onByteBufSend(byteBuf); + if (needCompression) { + compress(channelHandlerContext, byteBuf); + } + if (byteBuf.isReadable()) { + list.add(byteBuf.retain()); + } + } + + private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { + if (handledCompression) return false; + int compressIndex = ctx.pipeline().names().indexOf("compress"); + if (compressIndex == -1) return false; + handledCompression = true; + int encoderIndex = ctx.pipeline().names().indexOf(PACKET_ENCODER); + if (encoderIndex == -1) return false; + if (compressIndex > encoderIndex) { + decompress(ctx, buffer, buffer); + PluginChannelEncoder encoder = (PluginChannelEncoder) ctx.pipeline().remove(PACKET_ENCODER); + String encoderName = ctx.pipeline().names().contains("outbound_config") ? "outbound_config" : "encoder"; + ctx.pipeline().addBefore(encoderName, PACKET_ENCODER, new PluginChannelEncoder(encoder)); + return true; + } + return false; + } + + private void onByteBufSend(ByteBuf buffer) { + // I don't care packets before PLAY for the moment + if (player.encoderState() != ConnectionState.PLAY) return; + int size = buffer.readableBytes(); + if (size != 0) { + FriendlyByteBuf buf = new FriendlyByteBuf(buffer); + int preProcessIndex = buf.readerIndex(); + int packetId = buf.readVarInt(); + ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf); + BukkitNetworkManager.this.handleByteBufPacket(this.player, event); + if (event.isCancelled()) { + buf.clear(); + } else if (!event.changed()) { + buf.readerIndex(preProcessIndex); + } + } + } + } + + public class PluginChannelDecoder extends MessageToMessageDecoder { + private final NetWorkUser player; + + public PluginChannelDecoder(NetWorkUser player) { + this.player = player; + } + + @Override + protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List list) { + if (byteBuf.isReadable()) { + list.add(byteBuf.retain()); + } + } + } + + private void onNMSPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + handleNMSPacket(user, event, packet); + } + + @SuppressWarnings("unchecked") + private void onNMSPacketSend(NetWorkUser player, NMSPacketEvent event, Object packet) throws ReflectiveOperationException { + if (Reflections.clazz$ClientboundBundlePacket.isInstance(packet)) { + Iterable packets = (Iterable) Reflections.field$BundlePacket$packets.get(packet); + for (Object p : packets) { + onNMSPacketSend(player, event, p); + } + } else { + handleNMSPacket(player, event, packet); + } + } + + protected void handleNMSPacket(NetWorkUser user, NMSPacketEvent event, Object packet) { + Optional.ofNullable(nmsPacketFunctions.get(packet.getClass())) + .ifPresent(function -> function.accept(user, event, packet)); + } + + protected void handleByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { + int packetID = event.packetID(); + Optional.ofNullable(byteBufPacketFunctions.get(packetID)) + .ifPresent(function -> function.accept(user, event)); + } + + private void compress(ChannelHandlerContext ctx, ByteBuf input) { + ChannelHandler compressor = ctx.pipeline().get("compress"); + ByteBuf temp = ctx.alloc().buffer(); + try { + if (compressor != null) { + callEncode(compressor, ctx, input, temp); + } + } finally { + input.clear().writeBytes(temp); + temp.release(); + } + } + + private void decompress(ChannelHandlerContext ctx, ByteBuf input, ByteBuf output) { + ChannelHandler decompressor = ctx.pipeline().get("decompress"); + if (decompressor != null) { + ByteBuf temp = (ByteBuf) callDecode(decompressor, ctx, input).get(0); + try { + output.clear().writeBytes(temp); + } finally { + temp.release(); + } + } + } + + private static void callEncode(Object encoder, ChannelHandlerContext ctx, ByteBuf msg, ByteBuf output) { + try { + Reflections.method$messageToByteEncoder$encode.invoke(encoder, ctx, msg, output); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to call encode", e); + } + } + + public static List callDecode(Object decoder, Object ctx, Object input) { + List output = new ArrayList<>(); + try { + Reflections.method$byteToMessageDecoder$decode.invoke(decoder, ctx, input, output); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to call decode", e); + } + return output; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java new file mode 100644 index 000000000..023bb5b94 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import net.momirealms.craftengine.core.util.Cancellable; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class ByteBufPacketEvent implements Cancellable { + private boolean cancelled; + private List delayedTasks = null; + private final FriendlyByteBuf buf; + private boolean changed; + private final int packetID; + + public ByteBufPacketEvent(int packetID, FriendlyByteBuf buf) { + this.buf = buf; + this.packetID = packetID; + } + + public int packetID() { + return packetID; + } + + public FriendlyByteBuf getBuffer() { + return buf; + } + + public void setChanged(boolean dirty) { + this.changed = dirty; + } + + public boolean changed() { + return changed; + } + + public void addDelayedTask(Runnable task) { + if (delayedTasks == null) { + delayedTasks = new ArrayList<>(); + } + delayedTasks.add(task); + } + + public List getDelayedTasks() { + return Optional.ofNullable(delayedTasks).orElse(Collections.emptyList()); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java new file mode 100644 index 000000000..bce61806f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import net.momirealms.craftengine.core.util.Cancellable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class NMSPacketEvent implements Cancellable { + private boolean cancelled; + private List delayedTasks = null; + private final Object packet; + + public NMSPacketEvent(Object packet) { + this.packet = packet; + } + + public Object getPacket() { + return packet; + } + + public void addDelayedTask(Runnable task) { + if (delayedTasks == null) { + delayedTasks = new ArrayList<>(); + } + delayedTasks.add(task); + } + + public List getDelayedTasks() { + return Optional.ofNullable(delayedTasks).orElse(Collections.emptyList()); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java new file mode 100644 index 000000000..f6e4ed33d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -0,0 +1,600 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.*; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.chunk.Palette; +import net.momirealms.craftengine.core.world.chunk.PalettedContainer; +import net.momirealms.craftengine.core.world.chunk.packet.MCSection; +import org.bukkit.*; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.util.RayTraceResult; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.function.BiConsumer; + +public class PacketConsumers { + private static int[] mappings; + private static IntIdentityList BLOCK_LIST; + private static IntIdentityList BIOME_LIST; + + public static void init(Map map, int registrySize) { + mappings = new int[registrySize]; + Arrays.fill(mappings, -1); + for (int i = 0; i < registrySize; i++) { + mappings[i] = i; + } + for (Map.Entry entry : map.entrySet()) { + mappings[entry.getKey()] = entry.getValue(); + } + BLOCK_LIST = new IntIdentityList(registrySize); + BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize()); + } + + public static int remap(int stateId) { + return mappings[stateId]; + } + + public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { + try { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); + byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); + ByteBuf buf = Unpooled.copiedBuffer(buffer); + FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); + FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); + for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { + try { + MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); + mcSection.readPacket(friendlyByteBuf); + PalettedContainer container = mcSection.blockStateContainer(); + Palette palette = container.data().palette(); + if (palette.canRemap()) { + palette.remap(PacketConsumers::remap); + } else { + for (int j = 0; j < 4096; j ++) { + int state = container.get(j); + int newState = remap(state); + if (newState != state) { + container.set(j, newState); + } + } + } + mcSection.writePacket(newBuf); + } catch (Exception e) { + break; + } + } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelChunkWithLightPacket", e); + } + }; + + public static final BiConsumer SECTION_BLOCK_UPDATE = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + long pos = buf.readLong(); + int blocks = buf.readVarInt(); + short[] positions = new short[blocks]; + int[] states = new int[blocks]; + for (int i = 0; i < blocks; i++) { + long k = buf.readVarLong(); + positions[i] = (short) ((int) (k & 4095L)); + states[i] = remap((int) (k >>> 12)); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeLong(pos); + buf.writeVarInt(blocks); + for (int i = 0; i < blocks; i ++) { + buf.writeVarLong((long) states[i] << 12 | positions[i]); + } + event.setChanged(true); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSectionBlocksUpdatePacket", e); + } + }; + + public static final BiConsumer BLOCK_UPDATE = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + BlockPos pos = buf.readBlockPos(buf); + int before = buf.readVarInt(); + int state = remap(before); + if (state == before) { + return; + } + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeBlockPos(pos); + buf.writeVarInt(state); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundBlockUpdatePacket", e); + } + }; + + public static final BiConsumer LEVEL_PARTICLE = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + Object mcByteBuf; + Method writeMethod; + if (VersionHelper.isVersionNewerThan1_20_5()) { + mcByteBuf = Reflections.constructor$RegistryFriendlyByteBuf.newInstance(buf, Reflections.instance$registryAccess); + writeMethod = Reflections.method$ClientboundLevelParticlesPacket$write; + } else { + mcByteBuf = Reflections.constructor$FriendlyByteBuf.newInstance(event.getBuffer().source()); + writeMethod = Reflections.method$Packet$write; + } + Object packet = Reflections.constructor$ClientboundLevelParticlesPacket.newInstance(mcByteBuf); + Object option = Reflections.field$ClientboundLevelParticlesPacket$particle.get(packet); + if (option == null) return; + if (!Reflections.clazz$BlockParticleOption.isInstance(option)) return; + Object blockState = Reflections.field$BlockParticleOption$blockState.get(option); + int id = BlockStateUtils.blockStateToId(blockState); + int remapped = remap(id); + if (remapped == id) return; + Reflections.field$BlockParticleOption$blockState.set(option, BlockStateUtils.idToBlockState(remapped)); + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + writeMethod.invoke(packet, mcByteBuf); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelParticlesPacket", e); + } + }; + + public static final TriConsumer PLAYER_ACTION = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object action = Reflections.field$ServerboundPlayerActionPacket$action.get(packet); + if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK) { + Object blockPos = Reflections.field$ServerboundPlayerActionPacket$pos.get(packet); + BlockPos pos = new BlockPos( + (int) Reflections.field$Vec3i$x.get(blockPos), + (int) Reflections.field$Vec3i$y.get(blockPos), + (int) Reflections.field$Vec3i$z.get(blockPos) + ); + Player platformPlayer = player.platformPlayer(); + World world = platformPlayer.getWorld(); + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(serverLevel, blockPos); + int stateId = BlockStateUtils.blockStateToId(blockState); + // not a custom block + if (BlockStateUtils.isVanillaBlock(stateId)) { + if (ConfigManager.enableSoundSystem()) { + Object blockOwner = Reflections.field$StateHolder$owner.get(blockState); + if (BukkitBlockManager.instance().isBlockSoundRemoved(blockOwner)) { + player.startMiningBlock(platformPlayer.getWorld(), pos, blockState, false); + return; + } + } + if (player.isMiningBlock() || player.shouldSyncAttribute()) { + player.stopMiningBlock(); + } + return; + } + player.startMiningBlock(platformPlayer.getWorld(), pos, blockState, true); + } else if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$ABORT_DESTROY_BLOCK) { + if (player.isMiningBlock()) { + player.abortMiningBlock(); + } + } else if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$STOP_DESTROY_BLOCK) { + if (player.isMiningBlock()) { + player.stopMiningBlock(); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPlayerActionPacket", e); + } + }; + + public static final TriConsumer SWING_HAND = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + if (!player.isMiningBlock()) return; + Object hand = Reflections.field$ServerboundSwingPacket$hand.get(packet); + if (hand == Reflections.instance$InteractionHand$MAIN_HAND) { + player.onSwingHand(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundSwingPacket", e); + } + }; + + public static final TriConsumer USE_ITEM_ON = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + if (player.isMiningBlock()) { + player.stopMiningBlock(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundUseItemOnPacket", e); + } + }; + + public static final TriConsumer RESPAWN = (user, event, packet) -> { + try { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object dimensionKey; + if (!VersionHelper.isVersionNewerThan1_20_2()) { + dimensionKey = Reflections.field$ClientboundRespawnPacket$dimension.get(packet); + } else { + Object commonInfo = Reflections.field$ClientboundRespawnPacket$commonPlayerSpawnInfo.get(packet); + dimensionKey = Reflections.field$CommonPlayerSpawnInfo$dimension.get(commonInfo); + } + Object location = Reflections.field$ResourceKey$location.get(dimensionKey); + World world = Bukkit.getWorld(Objects.requireNonNull(NamespacedKey.fromString(location.toString()))); + if (world != null) { + int sectionCount = (world.getMaxHeight() - world.getMinHeight()) / 16; + player.setClientSideSectionCount(sectionCount); + player.setClientSideDimension(Key.of(location.toString())); + } else { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRespawnPacket: World " + location + " does not exist"); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRespawnPacket", e); + } + }; + + public static final TriConsumer LOGIN = (user, event, packet) -> { + try { + BukkitServerPlayer player = (BukkitServerPlayer) user; + player.setConnectionState(ConnectionState.PLAY); + Object dimensionKey; + if (!VersionHelper.isVersionNewerThan1_20_2()) { + dimensionKey = Reflections.field$ClientboundLoginPacket$dimension.get(packet); + } else { + Object commonInfo = Reflections.field$ClientboundLoginPacket$commonPlayerSpawnInfo.get(packet); + dimensionKey = Reflections.field$CommonPlayerSpawnInfo$dimension.get(commonInfo); + } + Object location = Reflections.field$ResourceKey$location.get(dimensionKey); + World world = Bukkit.getWorld(Objects.requireNonNull(NamespacedKey.fromString(location.toString()))); + if (world != null) { + int sectionCount = (world.getMaxHeight() - world.getMinHeight()) / 16; + player.setClientSideSectionCount(sectionCount); + player.setClientSideDimension(Key.of(location.toString())); + } else { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginPacket: World " + location + " does not exist"); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginPacket", e); + } + }; + + // 1.21.4- + // We can't find the best solution, we can only keep the feel as good as possible + // When the hotbar is full, the latest creative mode inventory can only be accessed when the player opens the inventory screen. Currently, it is not worth further handling this issue. + public static final TriConsumer SET_CREATIVE_SLOT = (user, event, packet) -> { + try { + if (VersionHelper.isVersionNewerThan1_21_4()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + Player bukkitPlayer = (Player) user.platformPlayer(); + if (bukkitPlayer == null) return; + if (bukkitPlayer.getGameMode() != GameMode.CREATIVE) return; + int slot = VersionHelper.isVersionNewerThan1_20_5() ? Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getShort(packet) : Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getInt(packet); + if (slot < 36 || slot > 44) return; + ItemStack item = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, Reflections.field$ServerboundSetCreativeModeSlotPacket$itemStack.get(packet)); + if (ItemUtils.isEmpty(item)) return; + if (slot - 36 != bukkitPlayer.getInventory().getHeldItemSlot()) { + return; + } + double interactionRange = player.getInteractionRange(); + // do ray trace to get current block + RayTraceResult result = bukkitPlayer.rayTraceBlocks(interactionRange, FluidCollisionMode.NEVER); + if (result == null) return; + org.bukkit.block.Block hitBlock = result.getHitBlock(); + if (hitBlock == null) return; + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(hitBlock.getBlockData())); + // not a custom block + if (state == null || state.isEmpty()) return; + Key itemId = state.settings().itemId(); + // no item available + if (itemId == null) return; + BlockData data = (BlockData) Reflections.method$CraftBlockData$createData.invoke(null, state.vanillaBlockState().handle()); + // compare item + if (data == null || !data.getMaterial().equals(item.getType())) return; + ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, (BukkitServerPlayer) user); + if (ItemUtils.isEmpty(itemStack)) { + CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); + return; + } + PlayerInventory inventory = bukkitPlayer.getInventory(); + int sameItemSlot = -1; + int emptySlot = -1; + for (int i = 0; i < 9 + 27; i++) { + ItemStack invItem = inventory.getItem(i); + if (ItemUtils.isEmpty(invItem)) { + if (emptySlot == -1 && i < 9) emptySlot = i; + continue; + } + if (invItem.getType().equals(itemStack.getType()) && invItem.getItemMeta().equals(itemStack.getItemMeta())) { + if (sameItemSlot == -1) sameItemSlot = i; + } + } + if (sameItemSlot != -1) { + if (sameItemSlot < 9) { + inventory.setHeldItemSlot(sameItemSlot); + ItemStack previousItem = inventory.getItem(slot - 36); + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> inventory.setItem(slot - 36, previousItem)); + } else { + ItemStack sameItem = inventory.getItem(sameItemSlot); + int finalSameItemSlot = sameItemSlot; + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> { + inventory.setItem(finalSameItemSlot, new ItemStack(Material.AIR)); + inventory.setItem(slot - 36, sameItem); + }); + } + } else { + if (item.getAmount() == 1) { + if (ItemUtils.isEmpty(inventory.getItem(slot - 36))) { + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> inventory.setItem(slot - 36, itemStack)); + return; + } + if (emptySlot != -1) { + inventory.setHeldItemSlot(emptySlot); + inventory.setItem(emptySlot, itemStack); + } else { + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> inventory.setItem(slot - 36, itemStack)); + } + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundSetCreativeModeSlotPacket", e); + } + }; + + // 1.21.4+ + public static final TriConsumer PICK_ITEM_FROM_BLOCK = (user, event, packet) -> { + try { + Player player = (Player) user.platformPlayer(); + if (player == null) return; + Object pos = Reflections.field$ServerboundPickItemFromBlockPacket$pos.get(packet); + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(player.getWorld()); + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(serverLevel, pos); + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (state == null) return; + PlayerInventory inventory = player.getInventory(); + Key itemId = state.settings().itemId(); + if (itemId == null) return; + ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, (BukkitServerPlayer) user); + if (itemStack == null) { + CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); + return; + } + int matchingSlot = InventoryUtils.findMatchingItemSlot(inventory, itemStack); + int targetSlot = (matchingSlot < 9) && (matchingSlot >= 0) ? matchingSlot : InventoryUtils.getSuitableHotbarSlot(inventory); + if (matchingSlot != -1) { + if (matchingSlot < 9 && targetSlot >= 0) { + inventory.setHeldItemSlot(targetSlot); + } else { + ItemStack picked = inventory.getItem(matchingSlot); + if (picked == null) return; + inventory.setHeldItemSlot(targetSlot); + ItemStack previous = inventory.getItem(targetSlot); + inventory.setItem(targetSlot, picked.clone()); + if (previous != null) { + inventory.setItem(matchingSlot, previous); + } else { + picked.setAmount(0); + } + } + } else if (player.getGameMode() == GameMode.CREATIVE) { + inventory.setHeldItemSlot(targetSlot); + ItemStack previous = inventory.getItem(targetSlot); + inventory.setItem(targetSlot, itemStack); + if (previous != null) { + for (int j = 1; j <= 3; j++) { + for (int i = j * 9; i < j * 9 + 9; i++) { + ItemStack itemInSlot = inventory.getItem(i); + if (ItemUtils.isEmpty(itemInSlot)) { + inventory.setItem(i, previous); + return; + } + } + } + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromBlockPacket", e); + } + }; + + // 1.21.4+ + public static final TriConsumer PICK_ITEM_FROM_ENTITY = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ServerboundPickItemFromEntityPacket$id.get(packet); + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByInteractionEntityId(entityId); + if (furniture == null) return; + Player player = (Player) user.platformPlayer(); + if (player == null) return; + Key itemId = furniture.behavior().itemId(); + ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, (BukkitServerPlayer) user); + PlayerInventory inventory = player.getInventory(); + if (itemStack == null) { + CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); + return; + } + int matchingSlot = InventoryUtils.findMatchingItemSlot(inventory, itemStack); + int targetSlot = (matchingSlot < 9) && (matchingSlot >= 0) ? matchingSlot : InventoryUtils.getSuitableHotbarSlot(inventory); + if (matchingSlot != -1) { + if (matchingSlot < 9 && targetSlot >= 0) { + inventory.setHeldItemSlot(targetSlot); + } else { + ItemStack picked = inventory.getItem(matchingSlot); + if (picked == null) return; + inventory.setHeldItemSlot(targetSlot); + ItemStack previous = inventory.getItem(targetSlot); + inventory.setItem(targetSlot, picked.clone()); + if (previous != null) { + inventory.setItem(matchingSlot, previous); + } else { + picked.setAmount(0); + } + } + } else if (player.getGameMode() == GameMode.CREATIVE) { + inventory.setHeldItemSlot(targetSlot); + ItemStack previous = inventory.getItem(targetSlot); + inventory.setItem(targetSlot, itemStack); + if (previous != null) { + for (int j = 1; j <= 3; j++) { + for (int i = j * 9; i < j * 9 + 9; i++) { + ItemStack itemInSlot = inventory.getItem(i); + if (ItemUtils.isEmpty(itemInSlot)) { + inventory.setItem(i, previous); + return; + } + } + } + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromEntityPacket", e); + } + }; + + public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { + try { + Object entityType = Reflections.field$ClientboundAddEntityPacket$type.get(packet); + // Falling blocks + if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { + int data = Reflections.field$ClientboundAddEntityPacket$data.getInt(packet); + int remapped = remap(data); + if (remapped != data) { + Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); + } + } else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { + // Furnitures + int entityId = (int) Reflections.field$ClientboundAddEntityPacket$entityId.get(packet); + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(entityId); + if (furniture != null) { + user.sendPacket(furniture.spawnPacket(), false); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); + } + }; + + public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundEntityPositionSyncPacket$id.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); + } + }; + + public static final TriConsumer MOVE_ENTITY = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundMoveEntityPacket$Pos", e); + } + }; + + public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { + try { + IntList intList = (IntList) Reflections.field$ClientboundRemoveEntitiesPacket$entityIds.get(packet); + for (int i = 0, size = intList.size(); i < size; i++) { + int[] entities = BukkitFurnitureManager.instance().getSubEntityIdsByBaseEntityId(intList.getInt(i)); + if (entities == null) continue; + for (int entityId : entities) { + intList.add(entityId); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRemoveEntitiesPacket", e); + } + }; + + public static final TriConsumer INTERACT_ENTITY = (user, event, packet) -> { + try { + Player player = (Player) user.platformPlayer(); + if (player == null) return; + int entityId = (int) Reflections.field$ServerboundInteractPacket$entityId.get(packet); + Object action = Reflections.field$ServerboundInteractPacket$action.get(packet); + Object actionType = Reflections.method$ServerboundInteractPacket$Action$getType.invoke(action); + if (actionType == null) return; + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByInteractionEntityId(entityId); + if (furniture == null) return; + Location location = furniture.baseEntity().getLocation(); + BukkitServerPlayer serverPlayer = (BukkitServerPlayer) user; + if (serverPlayer.isSpectatorMode()) return; + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$ATTACK) { + if (furniture.isValid()) { + furniture.onPlayerDestroy(serverPlayer); + } + } else if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$INTERACT_AT) { + if (player.isSneaking()) { + return; + } + furniture.getAvailableSeat(entityId).ifPresent(seatPos -> { + if (furniture.occupySeat(seatPos)) { + furniture.mountSeat(Objects.requireNonNull(player.getPlayer()), seatPos); + } + }); + } + }, player.getWorld(), location.getBlockX() >> 4,location.getBlockZ() >> 4); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundInteractPacket", e); + } + }; + + public static final TriConsumer SOUND = (user, event, packet) -> { + try { + Object sound = Reflections.field$ClientboundSoundPacket$sound.get(packet); + Object soundEvent = Reflections.method$Holder$value.invoke(sound); + Key mapped = BukkitBlockManager.instance().replaceSoundIfExist(Key.of(Reflections.field$SoundEvent$location.get(soundEvent).toString())); + if (mapped != null) { + event.setCancelled(true); + Object newId = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, mapped.namespace(), mapped.value()); + Object newSoundEvent = VersionHelper.isVersionNewerThan1_21_2() ? + Reflections.constructor$SoundEvent.newInstance(newId, Reflections.field$SoundEvent$fixedRange.get(soundEvent)) : + Reflections.constructor$SoundEvent.newInstance(newId, Reflections.field$SoundEvent$range.get(soundEvent), Reflections.field$SoundEvent$newSystem.get(soundEvent)); + Object newSoundPacket = Reflections.constructor$ClientboundSoundPacket.newInstance( + Reflections.method$Holder$direct.invoke(null, newSoundEvent), + Reflections.field$ClientboundSoundPacket$source.get(packet), + (double) Reflections.field$ClientboundSoundPacket$x.getInt(packet) / 8, + (double) Reflections.field$ClientboundSoundPacket$y.getInt(packet) / 8, + (double) Reflections.field$ClientboundSoundPacket$z.getInt(packet) / 8, + Reflections.field$ClientboundSoundPacket$volume.get(packet), + Reflections.field$ClientboundSoundPacket$pitch.get(packet), + Reflections.field$ClientboundSoundPacket$seed.get(packet) + ); + user.sendPacket(newSoundPacket, true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSoundPacket", e); + } + }; +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java new file mode 100644 index 000000000..7a96e02a0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +public interface PacketIds { + + int clientboundBlockUpdatePacket(); + + int clientboundSectionBlocksUpdatePacket(); + + int clientboundLevelParticlesPacket(); + + int clientboundAddEntityPacket(); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java new file mode 100644 index 000000000..2282f640b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 10; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 67; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 38; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java new file mode 100644 index 000000000..2e405b807 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20_2 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 69; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 39; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java new file mode 100644 index 000000000..07936876d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20_3 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 71; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 39; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java new file mode 100644 index 000000000..77426ebf6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20_5 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 73; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 41; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java new file mode 100644 index 000000000..ea90a8c31 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_21_2 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 78; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 42; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ImageExpansion.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ImageExpansion.java new file mode 100644 index 000000000..c1168dfc7 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ImageExpansion.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.plugin.papi; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.craftengine.core.font.BitmapImage; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FormatUtils; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class ImageExpansion extends PlaceholderExpansion { + private final CraftEngine plugin; + + public ImageExpansion(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "image"; + } + + @Override + public @NotNull String getAuthor() { + return "XiaoMoMi"; + } + + @Override + public @NotNull String getVersion() { + return "1.0"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + String[] split = params.split("_", 2); + if (split.length != 2) return null; + String[] param = split[1].split(":", 4); + if (param.length < 2) return null; + Key key; + try { + key = Key.of(param[0], param[1]); + } catch (IllegalArgumentException e) { + plugin.logger().warn("Invalid image namespaced key: " + param[0] + ":" + param[1]); + return null; + } + Optional optional = plugin.fontManager().bitmapImageByImageId(key); + if (optional.isEmpty()) { + return null; + } + BitmapImage image = optional.get(); + int codepoint; + if (param.length == 4) { + codepoint = image.codepointAt(Integer.parseInt(param[2]), Integer.parseInt(param[3])); + } else if (param.length == 2) { + codepoint = image.codepointAt(0,0); + } else { + return null; + } + try { + switch (split[0]) { + case "mm", "minimessage", "mini" -> { + return FormatUtils.miniMessageFont(new String(Character.toChars(codepoint)), image.font().toString()); + } + case "md", "minedown" -> { + return FormatUtils.mineDownFont(new String(Character.toChars(codepoint)), image.font().toString()); + } + case "raw" -> { + return new String(Character.toChars(codepoint)); + } + default -> { + return null; + } + } + } catch (IndexOutOfBoundsException e) { + return null; + } + } +} + diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ShiftExpansion.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ShiftExpansion.java new file mode 100644 index 000000000..738014a3d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ShiftExpansion.java @@ -0,0 +1,75 @@ +package net.momirealms.craftengine.bukkit.plugin.papi; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ShiftExpansion extends PlaceholderExpansion { + private final CraftEngine plugin; + + public ShiftExpansion(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "shift"; + } + + @Override + public @NotNull String getAuthor() { + return "XiaoMoMi"; + } + + @Override + public @NotNull String getVersion() { + return "1.0"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + String[] split = params.split("_", 2); + switch (split[0]) { + case "mini", "minimessage", "mm" -> { + if (split.length != 2) return null; + try { + return plugin.fontManager().createMiniMessageOffsets(Integer.parseInt(split[1])); + } catch (NumberFormatException e) { + return null; + } + } + case "md", "minedown" -> { + if (split.length != 2) return null; + try { + return plugin.fontManager().createMineDownOffsets(Integer.parseInt(split[1])); + } catch (NumberFormatException e) { + return null; + } + } + case "raw" -> { + if (split.length != 2) return null; + try { + return plugin.fontManager().createRawOffsets(Integer.parseInt(split[1])); + } catch (NumberFormatException e) { + return null; + } + } + default -> { + if (split.length != 1) return null; + try { + return plugin.fontManager().createRawOffsets(Integer.parseInt(split[0])); + } catch (NumberFormatException e) { + return null; + } + } + } + } +} + diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/BukkitSchedulerAdapter.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/BukkitSchedulerAdapter.java new file mode 100644 index 000000000..169b9f3fb --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/BukkitSchedulerAdapter.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.scheduler.impl.BukkitExecutor; +import net.momirealms.craftengine.bukkit.plugin.scheduler.impl.FoliaExecutor; +import net.momirealms.craftengine.core.plugin.scheduler.AbstractJavaScheduler; +import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.World; + +public class BukkitSchedulerAdapter extends AbstractJavaScheduler { + protected RegionExecutor sync; + + public BukkitSchedulerAdapter(BukkitCraftEngine plugin) { + super(plugin); + if (VersionHelper.isFolia()) { + this.sync = new FoliaExecutor(plugin.bootstrap()); + } else { + this.sync = new BukkitExecutor(plugin.bootstrap()); + } + } + + @Override + public RegionExecutor sync() { + return this.sync; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitExecutor.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitExecutor.java new file mode 100644 index 000000000..5270e29ea --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitExecutor.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import net.momirealms.craftengine.core.plugin.scheduler.DummyTask; +import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class BukkitExecutor implements RegionExecutor { + private final Plugin plugin; + + public BukkitExecutor(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void run(Runnable runnable, World world, int x, int z) { + execute(runnable); + } + + @Override + public void runDelayed(Runnable r, World world, int x, int z) { + Bukkit.getScheduler().runTask(plugin, r); + } + + @Override + public SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period) { + return new BukkitTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, period)); + } + + @Override + public SchedulerTask runAsyncLater(Runnable runnable, long delay) { + return new BukkitTask(Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay)); + } + + @Override + public SchedulerTask runLater(Runnable runnable, long delay, World world, int x, int z) { + if (delay <= 0) { + if (Bukkit.isPrimaryThread()) { + runnable.run(); + return new DummyTask(); + } else { + return new BukkitTask(Bukkit.getScheduler().runTask(plugin, runnable)); + } + } + return new BukkitTask(Bukkit.getScheduler().runTaskLater(plugin, runnable, delay)); + } + + @Override + public SchedulerTask runRepeating(Runnable runnable, long delay, long period, World world, int x, int z) { + return new BukkitTask(Bukkit.getScheduler().runTaskTimer(plugin, runnable, delay, period)); + } + + @Override + public void execute(@NotNull Runnable runnable) { + if (Bukkit.isPrimaryThread()) { + runnable.run(); + return; + } + Bukkit.getScheduler().runTask(plugin, runnable); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitTask.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitTask.java new file mode 100644 index 000000000..edb4842df --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitTask.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; + +public class BukkitTask implements SchedulerTask { + private final org.bukkit.scheduler.BukkitTask bukkitTask; + + public BukkitTask(org.bukkit.scheduler.BukkitTask bukkitTask) { + this.bukkitTask = bukkitTask; + } + + @Override + public void cancel() { + this.bukkitTask.cancel(); + } + + @Override + public boolean cancelled() { + return bukkitTask.isCancelled(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaExecutor.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaExecutor.java new file mode 100644 index 000000000..420c04d1d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaExecutor.java @@ -0,0 +1,72 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class FoliaExecutor implements RegionExecutor { + private final Plugin plugin; + + public FoliaExecutor(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void run(Runnable runnable, World world, int x, int z) { + Optional.ofNullable(world).ifPresentOrElse(w -> + Bukkit.getRegionScheduler().execute(plugin, w, x, z, runnable), + () -> Bukkit.getGlobalRegionScheduler().execute(plugin, runnable) + ); + } + + @Override + public void runDelayed(Runnable runnable, World world, int x, int z) { + run(runnable, world, x, z); + } + + @Override + public SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period) { + return runRepeating(runnable, delay, period, null, 0, 0); + } + + @Override + public SchedulerTask runAsyncLater(Runnable runnable, long delay) { + return runLater(runnable, delay, null, 0, 0); + } + + @Override + public SchedulerTask runLater(Runnable runnable, long delay, World world, int x, int z) { + if (world == null) { + if (delay <= 0) { + return new FoliaTask(Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> runnable.run(), delay)); + } else { + return new FoliaTask(Bukkit.getGlobalRegionScheduler().run(plugin, scheduledTask -> runnable.run())); + } + } else { + if (delay <= 0) { + return new FoliaTask(Bukkit.getRegionScheduler().run(plugin, world, x, z, scheduledTask -> runnable.run())); + } else { + return new FoliaTask(Bukkit.getRegionScheduler().runDelayed(plugin, world, x, z, scheduledTask -> runnable.run(), delay)); + } + } + } + + @Override + public SchedulerTask runRepeating(Runnable runnable, long delay, long period, World world, int x, int z) { + if (world == null) { + return new FoliaTask(Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, scheduledTask -> runnable.run(), delay, period)); + } else { + return new FoliaTask(Bukkit.getRegionScheduler().runAtFixedRate(plugin, world, x, z, scheduledTask -> runnable.run(), delay, period)); + } + } + + @Override + public void execute(@NotNull Runnable runnable) { + Bukkit.getGlobalRegionScheduler().execute(plugin, runnable); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaTask.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaTask.java new file mode 100644 index 000000000..397739261 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaTask.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import io.papermc.paper.threadedregions.scheduler.ScheduledTask; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; + +public class FoliaTask implements SchedulerTask { + private final ScheduledTask task; + + public FoliaTask(ScheduledTask task) { + this.task = task; + } + + @Override + public void cancel() { + this.task.cancel(); + } + + @Override + public boolean cancelled() { + return task.isCancelled(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java new file mode 100644 index 000000000..a0acc9767 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -0,0 +1,544 @@ +package net.momirealms.craftengine.bukkit.plugin.user; + +import com.google.common.collect.Lists; +import io.netty.channel.Channel; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; +import org.bukkit.FluidCollisionMode; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.util.RayTraceResult; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.UUID; + +public class BukkitServerPlayer extends Player { + private final Channel channel; + private final BukkitCraftEngine plugin; + + private ConnectionState decoderState; + private ConnectionState encoderState; + + private Reference playerRef; + private Reference serverPlayerRef; + + private int sectionCount; + private int lastSuccessfulInteraction; + private long lastAttributeSyncTime; + private Key clientSideDimension; + + private int lastSentState = -1; + private int lastHitBlockTime; + private BlockPos destroyPos; + private Object destroyedState; + private boolean isDestroyingBlock; + private boolean isDestroyingCustomBlock; + private boolean swingHandAck; + private float miningProgress; + + private int resentSoundTick; + private int resentSwingTick; + + private Recipe lastUsedRecipe = null; + + public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { + this.channel = channel; + this.plugin = plugin; + } + + public void setPlayer(org.bukkit.entity.Player player) { + playerRef = new WeakReference<>(player); + try { + serverPlayerRef = new WeakReference<>(Reflections.method$CraftPlayer$getHandle.invoke(player)); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + @Override + public Channel nettyChannel() { + return channel; + } + + @Override + public CraftEngine plugin() { + return plugin; + } + + @Override + public boolean isMiningBlock() { + return destroyPos != null; + } + + public void setDestroyedState(Object destroyedState) { + this.destroyedState = destroyedState; + } + + public void setDestroyPos(BlockPos destroyPos) { + this.destroyPos = destroyPos; + } + + @Override + public boolean shouldSyncAttribute() { + long current = System.currentTimeMillis(); + if (current - this.lastAttributeSyncTime > 10000) { + this.lastAttributeSyncTime = current; + return true; + } + return false; + } + + @Override + public boolean isSneaking() { + return platformPlayer().isSneaking(); + } + + @Override + public boolean isCreativeMode() { + return platformPlayer().getGameMode() == GameMode.CREATIVE; + } + + @Override + public boolean isSpectatorMode() { + return platformPlayer().getGameMode() == GameMode.SPECTATOR; + } + + @Override + public void sendActionBar(Component text) { + try { + Object packet = Reflections.constructor$ClientboundSetActionBarTextPacket.newInstance(ComponentUtils.adventureToMinecraft(text)); + sendPacket(packet, false); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to send action bar", e); + } + } + + @Override + public boolean updateLastSuccessfulInteractionTick(int tick) { + if (lastSuccessfulInteraction != tick) { + lastSuccessfulInteraction = tick; + return true; + } else { + return false; + } + } + + @Override + public int gameTicks() { + try { + Object serverPlayer = serverPlayer(); + Object gameMode = Reflections.field$ServerPlayer$gameMode.get(serverPlayer); + return (int) Reflections.field$ServerPlayerGameMode$gameTicks.get(gameMode); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to get current tick", e); + } + } + + @Override + public void swingHand(InteractionHand hand) { + platformPlayer().swingHand(hand == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); + } + + @Override + public boolean hasPermission(String permission) { + return platformPlayer().hasPermission(permission); + } + + @Override + public boolean canInstabuild() { + try { + Object abilities = Reflections.field$Player$abilities.get(serverPlayer()); + return (boolean) Reflections.field$Abilities$instabuild.get(abilities); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to get canInstabuild for " + name(), e); + return false; + } + } + + @Override + public String name() { + return platformPlayer().getName(); + } + + @Override + public void sendPacket(Object packet, boolean immediately) { + this.plugin.networkManager().sendPacket(this, packet, immediately); + } + + @Override + public ConnectionState decoderState() { + return decoderState; + } + + @Override + public ConnectionState encoderState() { + return encoderState; + } + + @Override + public int clientSideSectionCount() { + return sectionCount; + } + + public void setClientSideSectionCount(int sectionCount) { + this.sectionCount = sectionCount; + } + + @Override + public Key clientSideDimension() { + return clientSideDimension; + } + + public void setClientSideDimension(Key clientSideDimension) { + this.clientSideDimension = clientSideDimension; + } + + public void setConnectionState(ConnectionState connectionState) { + this.encoderState = connectionState; + this.decoderState = connectionState; + } + + public void setDecoderState(ConnectionState decoderState) { + this.decoderState = decoderState; + } + + public void setEncoderState(ConnectionState encoderState) { + this.encoderState = encoderState; + } + + @Override + public void tick() { + // not fully online + if (serverPlayer() == null) return; + if (this.isDestroyingBlock) { + this.tickBlockDestroy(); + } + } + + @Override + public float getDestroyProgress(Object blockState, BlockPos pos) { + try { + Object serverPlayer = serverPlayer(); + Object blockPos = Reflections.constructor$BlockPos.newInstance(pos.x(), pos.y(), pos.z()); + return (float) Reflections.method$BlockStateBase$getDestroyProgress.invoke(blockState, serverPlayer, Reflections.method$Entity$level.invoke(serverPlayer), blockPos); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get destroy progress for player " + platformPlayer().getName()); + return 0f; + } + } + + public void startMiningBlock(org.bukkit.World world, BlockPos pos, Object state, boolean custom) { + // instant break + if (getDestroyProgress(state, pos) >= 1f) { + ParticleUtils.addBlockBreakParticles(world, LocationUtils.toBlockPos(pos), state); + return; + } + setCanBreakBlock(!custom); + setDestroyPos(pos); + setDestroyedState(state); + setIsDestroyingBlock(true, custom); + } + + private void setCanBreakBlock(boolean canBreak) { + try { + if (canBreak) { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object serverPlayer = serverPlayer(); + Object attributeInstance = Reflections.method$ServerPlayer$getAttribute.invoke(serverPlayer, Reflections.instance$Holder$Attribute$block_break_speed); + Object newPacket = Reflections.constructor$ClientboundUpdateAttributesPacket0.newInstance(entityID(), Lists.newArrayList(attributeInstance)); + sendPacket(newPacket, true); + } else { + resetEffect(Reflections.instance$MobEffecr$mining_fatigue); + resetEffect(Reflections.instance$MobEffecr$haste); + } + } else { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object attributeModifier = VersionHelper.isVersionNewerThan1_21() ? + Reflections.constructor$AttributeModifier.newInstance(Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, "craftengine", "custom_hardness"), -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE) : + Reflections.constructor$AttributeModifier.newInstance(UUID.randomUUID(), "craftengine:custom_hardness", -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE); + Object attributeSnapshot = Reflections.constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot.newInstance(Reflections.instance$Holder$Attribute$block_break_speed, 1d, Lists.newArrayList(attributeModifier)); + Object newPacket = Reflections.constructor$ClientboundUpdateAttributesPacket1.newInstance(entityID(), Lists.newArrayList(attributeSnapshot)); + sendPacket(newPacket, true); + } else { + Object fatiguePacket = MobEffectUtils.createPacket(Reflections.instance$MobEffecr$mining_fatigue, entityID(), (byte) 9, -1, false, false, false); + Object hastePacket = MobEffectUtils.createPacket(Reflections.instance$MobEffecr$haste, entityID(), (byte) 0, -1, false, false, false); + sendPacket(fatiguePacket, true); + sendPacket(hastePacket, true); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to set attribute for player " + platformPlayer().getName(), e); + } + } + + @Override + public void stopMiningBlock() { + setCanBreakBlock(true); + setIsDestroyingBlock(false, false); + } + + private void resetEffect(Object mobEffect) throws ReflectiveOperationException { + Object effectInstance = Reflections.method$ServerPlayer$getEffect.invoke(serverPlayer(), mobEffect); + Object packet; + if (effectInstance != null) { + packet = Reflections.constructor$ClientboundUpdateMobEffectPacket.newInstance(entityID(), effectInstance); + } else { + packet = Reflections.constructor$ClientboundRemoveMobEffectPacket.newInstance(entityID(), mobEffect); + } + sendPacket(packet, true); + } + + @Override + public void abortMiningBlock() { + abortDestroyProgress(); + } + + private void tickBlockDestroy() { + // prevent server from taking over breaking blocks + if (this.isDestroyingCustomBlock) { + try { + Object serverPlayer = serverPlayer(); + Object gameMode = Reflections.field$ServerPlayer$gameMode.get(serverPlayer); + Reflections.field$ServerPlayerGameMode$isDestroyingBlock.set(gameMode, false); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + if (!this.swingHandAck) return; + this.swingHandAck = false; + try { + org.bukkit.entity.Player player = platformPlayer(); + double range = getInteractionRange(); + RayTraceResult result = player.rayTraceBlocks(range, FluidCollisionMode.NEVER); + if (result == null) return; + Block hitBlock = result.getHitBlock(); + if (hitBlock == null) return; + Location location = hitBlock.getLocation(); + BlockPos hitPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + if (!hitPos.equals(this.destroyPos)) { + return; + } + Object blockPos = LocationUtils.toBlockPos(hitPos); + Object serverPlayer = serverPlayer(); + Object gameMode = Reflections.field$ServerPlayer$gameMode.get(serverPlayer); + int currentTick = (int) Reflections.field$ServerPlayerGameMode$gameTicks.get(gameMode); + if (currentTick - this.lastHitBlockTime > 3) { + Object blockOwner = Reflections.field$StateHolder$owner.get(this.destroyedState); + Object soundType = Reflections.field$BlockBehaviour$soundType.get(blockOwner); + Object soundEvent = Reflections.field$SoundType$hitSound.get(soundType); + Object soundId = Reflections.field$SoundEvent$location.get(soundEvent); + level().playBlockSound(new Vec3d(this.destroyPos.x(), this.destroyPos.y(), this.destroyPos.z()), Key.of(soundId.toString()), 0.5F, 0.5F); + this.lastHitBlockTime = currentTick; + } + + // accumulate progress (custom blocks only) + if (this.isDestroyingCustomBlock) { + Item item = this.getItemInHand(InteractionHand.MAIN_HAND); + if (item != null) { + Material itemMaterial = item.getItem().getType(); + if (canInstabuild() && (itemMaterial == Material.DEBUG_STICK + || itemMaterial == Material.TRIDENT + || (VersionHelper.isVersionNewerThan1_20_5() && itemMaterial == MaterialUtils.MACE) + || item.is(Key.of("minecraft:swords")))) { + return; + } + } + this.miningProgress = (float) Reflections.method$BlockStateBase$getDestroyProgress.invoke(this.destroyedState, serverPlayer, Reflections.method$Entity$level.invoke(serverPlayer), blockPos) + miningProgress; + int packetStage = (int) (this.miningProgress * 10.0F); + if (packetStage != this.lastSentState) { + this.lastSentState = packetStage; + broadcastDestroyProgress(player, hitPos, blockPos, packetStage); + } + if (this.miningProgress >= 1f) { + Reflections.method$ServerPlayerGameMode$destroyBlock.invoke(gameMode, blockPos); + ParticleUtils.addBlockBreakParticles(location.getWorld(), blockPos, this.destroyedState); + this.stopMiningBlock(); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to tick destroy for player " + platformPlayer().getName(), e); + } + } + + private void broadcastDestroyProgress(org.bukkit.entity.Player player, BlockPos hitPos, Object blockPos, int stage) throws ReflectiveOperationException { + Object packet = Reflections.constructor$ClientboundBlockDestructionPacket.newInstance(Integer.MAX_VALUE - entityID(), blockPos, stage); + for (org.bukkit.entity.Player other : player.getWorld().getPlayers()) { + Location otherLocation = other.getLocation(); + double d0 = (double) hitPos.x() - otherLocation.getX(); + double d1 = (double) hitPos.y() - otherLocation.getY(); + double d2 = (double) hitPos.z() - otherLocation.getZ(); + if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { + plugin.networkManager().sendPacket(other, packet); + } + } + } + + @Override + public double getInteractionRange() { + try { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object attributeInstance = Reflections.method$ServerPlayer$getAttribute.invoke(serverPlayer(), Reflections.instance$Holder$Attribute$block_interaction_range); + if (attributeInstance == null) return 4.5d; + return (double) Reflections.method$AttributeInstance$getValue.invoke(attributeInstance); + } else { + return 4.5d; + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get interaction range for player " + platformPlayer().getName(), e); + return 4.5d; + } + } + + public void setIsDestroyingBlock(boolean value, boolean custom) { + if (value) { + this.isDestroyingBlock = true; + this.isDestroyingCustomBlock = custom; + this.swingHandAck = true; + this.miningProgress = 0; + } else { + this.isDestroyingBlock = false; + this.swingHandAck = false; + if (this.destroyPos != null) { + try { + this.broadcastDestroyProgress(platformPlayer(), this.destroyPos, LocationUtils.toBlockPos(this.destroyPos), -1); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to set isDestroyingCustomBlock", e); + } + } + this.destroyPos = null; + this.miningProgress = 0; + this.destroyedState = null; + this.isDestroyingCustomBlock = false; + } + } + + @Override + public void abortDestroyProgress() { + this.swingHandAck = false; + this.miningProgress = 0; + if (this.destroyPos == null) return; + try { + this.broadcastDestroyProgress(platformPlayer(), this.destroyPos, LocationUtils.toBlockPos(this.destroyPos), -1); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to abort destroyProgress", e); + } + } + + @Override + public void onSwingHand() { + this.swingHandAck = true; + } + + @Override + public int entityID() { + return platformPlayer().getEntityId(); + } + + @Override + public boolean isOnline() { + org.bukkit.entity.Player player = platformPlayer(); + if (player == null) return false; + return player.isOnline(); + } + + @Override + public float getYRot() { + return platformPlayer().getLocation().getPitch(); + } + + @Override + public float getXRot() { + return platformPlayer().getLocation().getYaw(); + } + + @Override + public boolean isSecondaryUseActive() { + return isSneaking(); + } + + @Override + public Direction getDirection() { + return DirectionUtils.toDirection(platformPlayer().getFacing()); + } + + @Override + public Item getItemInHand(InteractionHand hand) { + PlayerInventory inventory = platformPlayer().getInventory(); + return BukkitItemManager.instance().wrap(hand == InteractionHand.MAIN_HAND ? inventory.getItemInMainHand() : inventory.getItemInOffHand()); + } + + @Override + public World level() { + return new BukkitWorld(platformPlayer().getWorld()); + } + + @Override + public double x() { + return platformPlayer().getLocation().getX(); + } + + @Override + public double y() { + return platformPlayer().getLocation().getY(); + } + + @Override + public double z() { + return platformPlayer().getLocation().getZ(); + } + + @Override + public Object serverPlayer() { + return serverPlayerRef.get(); + } + + @Override + public org.bukkit.entity.Player platformPlayer() { + return playerRef.get(); + } + + public void setResendSound() { + resentSoundTick = gameTicks(); + } + + public void setResendSwing() { + resentSwingTick = gameTicks(); + } + + public boolean shouldResendSound() { + return resentSoundTick == gameTicks(); + } + + public boolean shouldResendSwing() { + return resentSwingTick == gameTicks(); + } + + public Recipe lastUsedRecipe() { + return lastUsedRecipe; + } + + public void setLastUsedRecipe(Recipe lastUsedRecipe) { + this.lastUsedRecipe = lastUsedRecipe; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java new file mode 100644 index 000000000..3d9236aa6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AttributeUtils.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.bukkit.util; + +public class AttributeUtils { +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java new file mode 100644 index 000000000..0325671bc --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java @@ -0,0 +1,172 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.block.PushReaction; +import net.momirealms.craftengine.core.util.Instrument; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MapColor; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.block.BlockPhysicsEvent; + +import java.util.IdentityHashMap; + +public class BlockStateUtils { + public static final IdentityHashMap CLIENT_SIDE_NOTE_BLOCKS = new IdentityHashMap<>(); + private static int vanillaStateSize; + private static boolean hasInit; + + public static void init(int size) { + if (hasInit) { + throw new IllegalStateException("BlockStateUtils has already been initialized"); + } + vanillaStateSize = size; + hasInit = true; + } + + public static int blockDataToId(BlockData blockData) { + try { + Object blockState = Reflections.field$CraftBlockData$data.get(blockData); + return (int) Reflections.method$IdMapper$getId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, blockState); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Key getRealBlockId(Block block) { + BlockData data = block.getBlockData(); + Object blockState = blockDataToBlockState(data); + Object owner = getBlockOwner(blockState); + String id = owner.toString(); + int first = id.indexOf('{'); + int last = id.indexOf('}'); + if (first != -1 && last != -1 && last > first) { + String blockId = id.substring(first + 1, last); + return Key.of(blockId); + } else { + throw new IllegalArgumentException("Invalid block ID format: " + id); + } + } + + public static Object blockDataToBlockState(BlockData blockData) { + try { + return Reflections.field$CraftBlockData$data.get(blockData); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Object idToBlockState(int id) { + try { + return Reflections.method$IdMapper$byId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, id); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static int blockStateToId(Object blockState) { + try { + return (int) Reflections.method$IdMapper$getId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, blockState); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Object getBlockOwner(Object blockState) { + try { + return Reflections.field$StateHolder$owner.get(blockState); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static int physicsEventToId(BlockPhysicsEvent event) throws ReflectiveOperationException { + Object blockData = Reflections.field$BlockPhysicsEvent$changed.get(event); + Object blockState = Reflections.field$CraftBlockData$data.get(blockData); + return (int) Reflections.method$IdMapper$getId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, blockState); + } + + public static Object physicsEventToState(BlockPhysicsEvent event) throws ReflectiveOperationException { + Object blockData = Reflections.field$BlockPhysicsEvent$changed.get(event); + return Reflections.field$CraftBlockData$data.get(blockData); + } + + public static void setLightEmission(Object state, int emission) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$lightEmission.set(state, emission); + } + + public static int getLightEmission(Object state) throws ReflectiveOperationException { + return (int) Reflections.field$BlockStateBase$lightEmission.get(state); + } + + public static void setMapColor(Object state, MapColor color) throws ReflectiveOperationException { + Object mcMapColor = Reflections.method$MapColor$byId.invoke(null, color.id); + Reflections.field$BlockStateBase$mapColor.set(state, mcMapColor); + } + + public static void setInstrument(Object state, Instrument instrument) throws ReflectiveOperationException { + Object mcInstrument = ((Object[]) Reflections.method$NoteBlockInstrument$values.invoke(null))[instrument.ordinal()]; + Reflections.field$BlockStateBase$instrument.set(state, mcInstrument); + } + + public static void setHardness(Object state, float hardness) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$hardness.set(state, hardness); + } + + public static void setBurnable(Object state, boolean burnable) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$burnable.set(state, burnable); + } + + public static void setPushReaction(Object state, PushReaction reaction) throws ReflectiveOperationException { + Object pushReaction = ((Object[]) Reflections.method$PushReaction$values.invoke(null))[reaction.ordinal()]; + Reflections.field$BlockStateBase$pushReaction.set(state, pushReaction); + } + + public static void setIsRandomlyTicking(Object state, boolean randomlyTicking) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isRandomlyTicking.set(state, randomlyTicking); + } + + public static void setReplaceable(Object state, boolean replaceable) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$replaceable.set(state, replaceable); + } + + public static boolean isReplaceable(Object state) throws ReflectiveOperationException { + return (boolean) Reflections.field$BlockStateBase$replaceable.get(state); + } + + public static void setCanOcclude(Object state, boolean canOcclude) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$canOcclude.set(state, canOcclude); + } + + public static boolean isOcclude(Object state) throws ReflectiveOperationException { + return (boolean) Reflections.field$BlockStateBase$canOcclude.get(state); + } + + public static void setIsRedstoneConductor(Object state, Object predicate) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isRedstoneConductor.set(state, predicate); + } + + public static void setIsSuffocating(Object state, Object predicate) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isSuffocating.set(state, predicate); + } + + public static void setIsViewBlocking(Object state, Object predicate) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isViewBlocking.set(state, predicate); + } + + public static boolean isClientSideNoteBlock(Object state) { + return CLIENT_SIDE_NOTE_BLOCKS.containsKey(state); + } + + public static boolean isVanillaBlock(Object state) { + int id = blockStateToId(state); + return id >= 0 && id < vanillaStateSize; + } + + public static boolean isVanillaBlock(int id) { + return id >= 0 && id < vanillaStateSize; + } + + public static int vanillaStateSize() { + return vanillaStateSize; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java new file mode 100644 index 000000000..309379562 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.HashMap; +import java.util.Map; + +public class BlockTags { + private static final Map CACHE = new HashMap<>(); + + public static Object getOrCreate(Key key) { + Object value = CACHE.get(key); + if (value == null) { + try { + value = Reflections.method$TagKey$create.invoke(null, Reflections.instance$Registries$BLOCK, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value())); + CACHE.put(key, value); + return value; + } catch (Exception e) { + throw new RuntimeException("Failed to create block tag: " + key, e); + } + } else { + return value; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java new file mode 100644 index 000000000..6ed052ede --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java @@ -0,0 +1,70 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.ReflectionUtils; +import org.bukkit.Bukkit; + +import java.lang.reflect.Method; +import java.util.Objects; + +public final class BukkitReflectionUtils { + private static final String PREFIX_MC = "net.minecraft."; + private static final String PREFIX_CRAFTBUKKIT = "org.bukkit.craftbukkit"; + private static final String CRAFT_SERVER = "CraftServer"; + private static final String CB_PKG_VERSION; + public static final int MAJOR_REVISION; + + private BukkitReflectionUtils() { + } + + static { + final Class serverClass; + if (Bukkit.getServer() == null) { + // Paper plugin Bootstrapper 1.20.6+ + serverClass = Objects.requireNonNull(ReflectionUtils.getClazz("org.bukkit.craftbukkit.CraftServer")); + } else { + serverClass = Bukkit.getServer().getClass(); + } + final String pkg = serverClass.getPackage().getName(); + final String nmsVersion = pkg.substring(pkg.lastIndexOf(".") + 1); + if (!nmsVersion.contains("_")) { + int fallbackVersion = -1; + if (Bukkit.getServer() != null) { + try { + final Method getMinecraftVersion = serverClass.getDeclaredMethod("getMinecraftVersion"); + fallbackVersion = Integer.parseInt(getMinecraftVersion.invoke(Bukkit.getServer()).toString().split("\\.")[1]); + } catch (final Exception ignored) { + } + } else { + // Paper plugin bootstrapper 1.20.6+ + try { + final Class sharedConstants = Objects.requireNonNull(ReflectionUtils.getClazz("net.minecraft.SharedConstants")); + final Method getCurrentVersion = sharedConstants.getDeclaredMethod("getCurrentVersion"); + final Object currentVersion = getCurrentVersion.invoke(null); + final Method getName = currentVersion.getClass().getDeclaredMethod("getName"); + final String versionName = (String) getName.invoke(currentVersion); + try { + fallbackVersion = Integer.parseInt(versionName.split("\\.")[1]); + } catch (final Exception ignored) { + } + } catch (final ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + MAJOR_REVISION = fallbackVersion; + } else { + MAJOR_REVISION = Integer.parseInt(nmsVersion.split("_")[1]); + } + String name = serverClass.getName(); + name = name.substring(PREFIX_CRAFTBUKKIT.length()); + name = name.substring(0, name.length() - CRAFT_SERVER.length()); + CB_PKG_VERSION = name; + } + + public static String assembleCBClass(String className) { + return PREFIX_CRAFTBUKKIT + CB_PKG_VERSION + className; + } + + public static String assembleMCClass(String className) { + return PREFIX_MC + className; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java new file mode 100644 index 000000000..6311420ab --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.VersionHelper; + +public class ComponentUtils { + + public static Object adventureToMinecraft(Component component) { + String json = AdventureHelper.componentToJson(component); + if (VersionHelper.isVersionNewerThan1_20_5()) { + try { + return Reflections.method$Component$Serializer$fromJson.invoke(null, json, Reflections.instance$MinecraftRegistry); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } else { + try { + return Reflections.method$CraftChatMessage$fromJSON.invoke(null, json); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java new file mode 100644 index 000000000..c94f41da0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Direction; +import org.bukkit.block.BlockFace; + +public class DirectionUtils { + + public static Direction toDirection(BlockFace face) { + return switch (face) { + case UP -> Direction.UP; + case DOWN -> Direction.DOWN; + case NORTH -> Direction.NORTH; + case SOUTH -> Direction.SOUTH; + case WEST -> Direction.WEST; + case EAST -> Direction.EAST; + default -> throw new IllegalStateException("Unexpected value: " + face); + }; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java new file mode 100644 index 000000000..ff4ac4ef0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.bukkit.util; + +import it.unimi.dsi.fastutil.objects.Object2IntMap; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class EnchantmentUtils { + + @SuppressWarnings("unchecked") + public static Map toMap(Object itemEnchantments) throws ReflectiveOperationException { + Map map = new HashMap<>(); + for (Object2IntMap.Entry entry : (Set>) Reflections.method$ItemEnchantments$entrySet.invoke(itemEnchantments)) { + Object holder = entry.getKey(); + String name = (String) Reflections.method$Holder$getRegisteredName.invoke(holder); + int level = entry.getIntValue(); + map.put(name, level); + } + return map; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java new file mode 100644 index 000000000..dc4bafc43 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java @@ -0,0 +1,84 @@ +package net.momirealms.craftengine.bukkit.util; + +public class EntityDataUtils { + + private EntityDataUtils() {} + + private static final int HAS_SHADOW = 0x01; // 1 + private static final int IS_SEE_THROUGH = 0x02; // 2 + private static final int USE_DEFAULT_BACKGROUND = 0x04; // 4 + private static final int LEFT_ALIGNMENT = 0x08; // 8 + private static final int RIGHT_ALIGNMENT = 0x10; // 16 + + public static byte encodeTextDisplayMask(boolean hasShadow, boolean isSeeThrough, boolean useDefaultBackground, int alignment) { + int bitMask = 0; + if (hasShadow) { + bitMask |= HAS_SHADOW; + } + if (isSeeThrough) { + bitMask |= IS_SEE_THROUGH; + } + if (useDefaultBackground) { + bitMask |= USE_DEFAULT_BACKGROUND; + } + switch (alignment) { + case 0: // CENTER + break; + case 1: // LEFT + bitMask |= LEFT_ALIGNMENT; + break; + case 2: // RIGHT + bitMask |= RIGHT_ALIGNMENT; + break; + default: + throw new IllegalArgumentException("Invalid alignment value"); + } + return (byte) bitMask; + } + + private static final int IS_ON_FIRE = 0x01; // 1 + private static final int IS_CROUCHING = 0x02; // 2 + private static final int UNUSED = 0x04; // 4 + private static final int IS_SPRINTING = 0x08; // 8 + private static final int IS_SWIMMING = 0x10; // 16 + private static final int IS_INVISIBLE = 0x20; // 32 + private static final int HAS_GLOWING_EFFECT = 0x40; // 64 + private static final int IS_FLYING_WITH_ELYTRA = 0x80; // 128 + + public static byte encodeCommonMask(boolean isOnFire, boolean isCrouching, boolean isUnused, + boolean isSprinting, boolean isSwimming, boolean isInvisible, + boolean hasGlowingEffect, boolean isFlyingWithElytra) { + int bitMask = 0; + + if (isOnFire) { + bitMask |= IS_ON_FIRE; + } + if (isCrouching) { + bitMask |= IS_CROUCHING; + } + if (isUnused) { + bitMask |= UNUSED; + } + if (isSprinting) { + bitMask |= IS_SPRINTING; + } + if (isSwimming) { + bitMask |= IS_SWIMMING; + } + if (isInvisible) { + bitMask |= IS_INVISIBLE; + } + if (hasGlowingEffect) { + bitMask |= HAS_GLOWING_EFFECT; + } + if (isFlyingWithElytra) { + bitMask |= IS_FLYING_WITH_ELYTRA; + } + + return (byte) bitMask; + } + + public static boolean isCrouching(byte mask) { + return (mask & IS_CROUCHING) != 0; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java new file mode 100644 index 000000000..7dba40e20 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class EntityUtils { + + public static BlockPos getOnPos(Player player) { + try { + Object serverPlayer = Reflections.method$CraftPlayer$getHandle.invoke(player); + Object blockPos = Reflections.method$Entity$getOnPos.invoke(serverPlayer, 1.0E-5F); + return new BlockPos( + (int) Reflections.field$Vec3i$x.get(blockPos), + (int) Reflections.field$Vec3i$y.get(blockPos), + (int) Reflections.field$Vec3i$z.get(blockPos) + ); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + @SuppressWarnings("deprecation") + public static Entity spawnEntity(World world, Location loc, EntityType type, org.bukkit.util.Consumer function) { + try { + return (Entity) Reflections.method$World$spawnEntity.invoke(world, loc, type, CreatureSpawnEvent.SpawnReason.CUSTOM, function); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to spawn entity", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java new file mode 100644 index 000000000..0e4895c95 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.Bukkit; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; + +public class EventUtils { + + public static void fireAndForget(Event event) { + Bukkit.getPluginManager().callEvent(event); + } + + public static boolean fireAndCheckCancel(Event event) { + if (!(event instanceof Cancellable cancellable)) + throw new IllegalArgumentException("Only cancellable events are allowed here"); + Bukkit.getPluginManager().callEvent(event); + return cancellable.isCancelled(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java new file mode 100644 index 000000000..55abc8abe --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -0,0 +1,263 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.block.BlockKeys; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.QuadFunction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Bell; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; + +public class InteractUtils { + private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); + private static final Key NOTE_BLOCK_TOP_INSTRUMENTS = Key.of("minecraft:noteblock_top_instruments"); + + static { + register(BlockKeys.NOTE_BLOCK, (player, item, blockState, result) -> result.getDirection() != Direction.UP || !item.is(NOTE_BLOCK_TOP_INSTRUMENTS)); + register(BlockKeys.CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.WHITE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.ORANGE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.MAGENTA_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.LIGHT_BLUE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.YELLOW_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.LIME_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.PINK_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.GRAY_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.LIGHT_GRAY_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.CYAN_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.PURPLE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BLUE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BROWN_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.GREEN_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.RED_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BLACK_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BELL, (player, item, blockState, result) -> { + Direction direction = result.getDirection(); + BlockPos pos = result.getBlockPos(); + if (blockState instanceof Bell bell) { + double y = result.getLocation().y() - pos.y(); + if (direction.axis() != Direction.Axis.Y && y <= 0.8123999834060669D) { + Direction facing = DirectionUtils.toDirection(bell.getFacing()); + Bell.Attachment attachment = bell.getAttachment(); + switch (attachment) { + case FLOOR -> { + return facing.axis() == direction.axis(); + } + case DOUBLE_WALL, SINGLE_WALL -> { + return facing.axis() != direction.axis(); + } + case CEILING -> { + return true; + } + default -> { + return false; + } + } + } + } + return false; + }); + register(BlockKeys.HOPPER, (player, item, blockState, result) -> true); + register(BlockKeys.DISPENSER, (player, item, blockState, result) -> true); + register(BlockKeys.DROPPER, (player, item, blockState, result) -> true); + register(BlockKeys.CRAFTER, (player, item, blockState, result) -> true); + register(BlockKeys.REPEATER, (player, item, blockState, result) -> true); + register(BlockKeys.COMPARATOR, (player, item, blockState, result) -> true); + register(BlockKeys.DAYLIGHT_DETECTOR, (player, item, blockState, result) -> true); + register(BlockKeys.LECTERN, (player, item, blockState, result) -> true); + register(BlockKeys.CHEST, (player, item, blockState, result) -> true); + register(BlockKeys.ENDER_CHEST, (player, item, blockState, result) -> true); + register(BlockKeys.TRAPPED_CHEST, (player, item, blockState, result) -> true); + register(BlockKeys.BEACON, (player, item, blockState, result) -> true); + register(BlockKeys.ENCHANTING_TABLE, (player, item, blockState, result) -> true); + register(BlockKeys.BREWING_STAND, (player, item, blockState, result) -> true); + register(BlockKeys.GRINDSTONE, (player, item, blockState, result) -> true); + register(BlockKeys.ANVIL, (player, item, blockState, result) -> true); + register(BlockKeys.CHIPPED_ANVIL, (player, item, blockState, result) -> true); + register(BlockKeys.DAMAGED_ANVIL, (player, item, blockState, result) -> true); + register(BlockKeys.FURNACE, (player, item, blockState, result) -> true); + register(BlockKeys.CRAFTING_TABLE, (player, item, blockState, result) -> true); + register(BlockKeys.STONECUTTER, (player, item, blockState, result) -> true); + register(BlockKeys.SMITHING_TABLE, (player, item, blockState, result) -> true); + register(BlockKeys.LOOM, (player, item, blockState, result) -> true); + register(BlockKeys.BARREL, (player, item, blockState, result) -> true); + register(BlockKeys.SMOKER, (player, item, blockState, result) -> true); + register(BlockKeys.BLAST_FURNACE, (player, item, blockState, result) -> true); + register(BlockKeys.LEVER, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.EXPOSED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OXIDIZED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WEATHERED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_EXPOSED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_OXIDIZED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_WEATHERED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.EXPOSED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OXIDIZED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WEATHERED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_EXPOSED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_WEATHERED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.WHITE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.ORANGE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.MAGENTA_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_BLUE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.YELLOW_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.LIME_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.PINK_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.GRAY_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_GRAY_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.CYAN_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.PURPLE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.BLUE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.BROWN_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.GREEN_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.RED_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.BLACK_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.WHITE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.ORANGE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.MAGENTA_BED, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_BLUE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.YELLOW_BED, (player, item, blockState, result) -> true); + register(BlockKeys.LIME_BED, (player, item, blockState, result) -> true); + register(BlockKeys.PINK_BED, (player, item, blockState, result) -> true); + register(BlockKeys.GRAY_BED, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_GRAY_BED, (player, item, blockState, result) -> true); + register(BlockKeys.CYAN_BED, (player, item, blockState, result) -> true); + register(BlockKeys.PURPLE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.BLUE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.BROWN_BED, (player, item, blockState, result) -> true); + register(BlockKeys.GREEN_BED, (player, item, blockState, result) -> true); + register(BlockKeys.RED_BED, (player, item, blockState, result) -> true); + register(BlockKeys.BLACK_BED, (player, item, blockState, result) -> true); + register(BlockKeys.DRAGON_EGG, (player, item, blockState, result) -> true); + register(BlockKeys.REPEATING_COMMAND_BLOCK, (player, item, blockState, result) -> true); + register(BlockKeys.CHAIN_COMMAND_BLOCK, (player, item, blockState, result) -> true); + register(BlockKeys.COMMAND_BLOCK, (player, item, blockState, result) -> true); + } + + private static void register(Key key, QuadFunction, BlockData, BlockHitResult, Boolean> function) { + var previous = INTERACTIONS.put(key, function); + if (previous != null) { + CraftEngine.instance().logger().warn("Duplicated interaction check: " + key); + } + } + + public static boolean isInteractable(Key block, org.bukkit.entity.Player player, BlockData state, BlockHitResult hit, Item item) { + if (INTERACTIONS.containsKey(block)) { + return INTERACTIONS.get(block).apply(player, item, state, hit); + } else { + return false; + } + } + + private static boolean canEat(Player player, boolean ignoreHunger) { + return ignoreHunger || player.isInvulnerable() || player.getFoodLevel() < 20; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java new file mode 100644 index 000000000..40c84192f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class InventoryUtils { + + public static int getSuitableHotbarSlot(PlayerInventory inventory) { + int selectedSlot = inventory.getHeldItemSlot(); + int i; + int j; + for (j = 0; j < 9; ++j) { + i = (selectedSlot + j) % 9; + if (ItemUtils.isEmpty(inventory.getItem(i))) { + return i; + } + } + for (j = 0; j < 9; ++j) { + i = (selectedSlot + j) % 9; + ItemStack item = inventory.getItem(i); + if (ItemUtils.isEmpty(item) || item.getEnchantments().isEmpty()) { + return i; + } + } + return selectedSlot; + } + + public static int findMatchingItemSlot(PlayerInventory inventory, ItemStack itemStack) { + ItemStack[] items = inventory.getStorageContents(); + for (int i = 0; i < items.length; ++i) { + ItemStack stack = items[i]; + if (ItemUtils.isEmpty(stack)) continue; + if (stack.isSimilar(itemStack)) { + return i; + } + } + return -1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java new file mode 100644 index 000000000..4b6667aa1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.HashMap; +import java.util.Map; + +public class ItemTags { + private static final Map CACHE = new HashMap<>(); + + public static Object getOrCreate(Key key) { + Object value = CACHE.get(key); + if (value == null) { + try { + value = Reflections.method$TagKey$create.invoke(null, Reflections.instance$Registries$ITEM, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value())); + CACHE.put(key, value); + return value; + } catch (Exception e) { + throw new RuntimeException("Failed to create block tag: " + key, e); + } + } else { + return value; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java new file mode 100644 index 000000000..c88a13ee5 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; + +public class ItemUtils { + + @Contract("null -> true") + public static boolean isEmpty(final ItemStack item) { + if (item == null) return true; + if (item.getType() == Material.AIR) return true; + return item.getAmount() == 0; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java new file mode 100644 index 000000000..2549288c6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; + +public class KeyUtils { + + public static Key namespacedKey2Key(NamespacedKey key) { + return Key.of(key.namespace(), key.value()); + } + + public static Key adventureKey2Key(net.kyori.adventure.key.Key key) { + return Key.of(key.namespace(), key.value()); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java new file mode 100644 index 000000000..1b71588ba --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.bukkit.World; + +import java.util.BitSet; +import java.util.List; +import java.util.Map; + +public class LightUtils { + + public static void updateChunkLight(World world, Map sectionPosSet) { + try { + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(serverLevel); + for (Map.Entry entry : sectionPosSet.entrySet()) { + long chunkKey = entry.getKey(); + Object chunkHolder = Reflections.method$ServerChunkCache$getVisibleChunkIfPresent.invoke(chunkSource, chunkKey); + if (chunkHolder == null) continue; + @SuppressWarnings("unchecked") + List players = (List) Reflections.method$ChunkHolder$getPlayers.invoke(chunkHolder, false); + if (players.isEmpty()) continue; + Object lightEngine = Reflections.field$ChunkHolder$lightEngine.get(chunkHolder); + BitSet blockChangedLightSectionFilter = (BitSet) Reflections.field$ChunkHolder$blockChangedLightSectionFilter.get(chunkHolder); + blockChangedLightSectionFilter.or(entry.getValue()); + BitSet skyChangedLightSectionFilter = (BitSet) Reflections.field$ChunkHolder$skyChangedLightSectionFilter.get(chunkHolder); + Object chunkPos = Reflections.constructor$ChunkPos.newInstance((int) chunkKey, (int) (chunkKey >> 32)); + Object lightPacket = Reflections.constructor$ClientboundLightUpdatePacket.newInstance(chunkPos, lightEngine, skyChangedLightSectionFilter, blockChangedLightSectionFilter); + Reflections.method$ChunkHolder$broadcast.invoke(chunkHolder, players, lightPacket); + blockChangedLightSectionFilter.clear(); + skyChangedLightSectionFilter.clear(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Could not update light for world " + world.getName()); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java new file mode 100644 index 000000000..65c7bfa32 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java @@ -0,0 +1,71 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; + +public class LocationUtils { + + public static Object toBlockPos(BlockPos pos) { + try { + return Reflections.constructor$BlockPos.newInstance(pos.x(), pos.y(), pos.z()); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to create BlockPos", e); + } + } + + public static Object toBlockPos(int x, int y, int z) { + try { + return Reflections.constructor$BlockPos.newInstance(x, y, z); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to create BlockPos", e); + } + } + + + public static BlockPos toBlockPos(Location pos) { + return new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); + } + + public static BlockPos fromBlockPos(Object pos) throws ReflectiveOperationException { + return new BlockPos( + Reflections.field$Vec3i$x.getInt(pos), + Reflections.field$Vec3i$y.getInt(pos), + Reflections.field$Vec3i$z.getInt(pos) + ); + } + + public static double getDistance(Location location1, Location location2) { + return Math.sqrt(Math.pow(location2.getX() - location1.getX(), 2) + + Math.pow(location2.getY() - location1.getY(), 2) + + Math.pow(location2.getZ() - location1.getZ(), 2) + ); + } + + @NotNull + public static Location toBlockLocation(Location location) { + Location blockLoc = location.clone(); + blockLoc.setX(location.getBlockX()); + blockLoc.setY(location.getBlockY()); + blockLoc.setZ(location.getBlockZ()); + return blockLoc; + } + + @NotNull + public static Location toBlockCenterLocation(Location location) { + Location centerLoc = location.clone(); + centerLoc.setX(location.getBlockX() + 0.5); + centerLoc.setY(location.getBlockY() + 0.5); + centerLoc.setZ(location.getBlockZ() + 0.5); + return centerLoc; + } + + @NotNull + public static Location toSurfaceCenterLocation(Location location) { + Location centerLoc = location.clone(); + centerLoc.setX(location.getBlockX() + 0.5); + centerLoc.setZ(location.getBlockZ() + 0.5); + centerLoc.setY(location.getBlockY()); + return centerLoc; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java new file mode 100644 index 000000000..c36efe7f9 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; + +import javax.annotation.Nullable; +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; + +public class MaterialUtils { + + public static Material MACE; + + static { + try { + MACE = Material.valueOf("MACE"); + } catch (Exception ignore) { + MACE = null; + } + } + + @Nullable + public static Material getMaterial(String name) { + if (name == null || name.isEmpty()) return null; + if (name.contains(":")) return Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(name))); + NamespacedKey key = NamespacedKey.minecraft(name.toLowerCase(Locale.ENGLISH)); + return Optional.ofNullable(Registry.MATERIAL.get(key)).orElseGet(() -> { + try { + return Material.valueOf(name.toUpperCase(Locale.ENGLISH)); + } catch (IllegalArgumentException e) { + return null; + } + }); + } + + public static Material getMaterial(Key key) { + return Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(key.toString()))); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java new file mode 100644 index 000000000..ad8e78149 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.bukkit.util; + +public class MobEffectUtils { + + public static byte pack(boolean isAmbient, boolean isVisible, boolean showIcon) { + byte b = 0; + if (isAmbient) { + b = (byte) (b | 1); + } + if (isVisible) { + b = (byte) (b | 2); + } + if (showIcon) { + b = (byte) (b | 4); + } + return b; + } + + public static Object createPacket(Object mobEffect, int entityId, byte amplifier, int duration, boolean isAmbient, boolean isVisible, boolean showIcon) { + try { + Object packet = Reflections.allocateClientboundUpdateMobEffectPacketInstance(); + Reflections.field$ClientboundUpdateMobEffectPacket$entityId.set(packet, entityId); + Reflections.field$ClientboundUpdateMobEffectPacket$duration.set(packet, duration); + Reflections.field$ClientboundUpdateMobEffectPacket$amplifier.set(packet, amplifier); + Reflections.field$ClientboundUpdateMobEffectPacket$effect.set(packet, mobEffect); + byte flags = pack(isAmbient, isVisible, showIcon); + Reflections.field$ClientboundUpdateMobEffectPacket$flags.set(packet, flags); + return packet; + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java new file mode 100644 index 000000000..494fb7261 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.plugin.config.ConfigManager; + +public class NoteBlockChainUpdateUtils { + + public static void noteBlockChainUpdate(Object level, Object chunkSource, Object direction, Object blockPos, int times) throws ReflectiveOperationException { + if (times >= ConfigManager.maxChainUpdate()) return; + Object relativePos = Reflections.method$BlockPos$relative.invoke(blockPos, direction); + Object state = Reflections.method$BlockGetter$getBlockState.invoke(level, relativePos); + if (BlockStateUtils.isClientSideNoteBlock(state)) { + Reflections.method$ServerChunkCache$blockChanged.invoke(chunkSource, relativePos); + noteBlockChainUpdate(level, chunkSource, direction, relativePos, times+1); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java new file mode 100644 index 000000000..cafc0a949 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java @@ -0,0 +1,67 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.MCUtils; +import org.bukkit.Particle; + +public class ParticleUtils { + private static Particle BLOCK_CRACK; + + static { + try { + BLOCK_CRACK = Particle.valueOf("BLOCK_CRACK"); + } catch (IllegalArgumentException e) { + BLOCK_CRACK = Particle.BLOCK; + } + } + + private ParticleUtils() {} + + public static void addBlockBreakParticles(org.bukkit.World bukkitWorld, Object pos, Object state) { + try { + Object world = Reflections.field$CraftWorld$ServerLevel.get(bukkitWorld); + Object shape = Reflections.method$BlockState$getShape.invoke(state, world, pos, Reflections.method$CollisionContext$empty.invoke(null)); + Object aabb = Reflections.method$VoxelShape$bounds.invoke(shape); + double minX = Reflections.field$AABB$minX.getDouble(aabb); + double minY = Reflections.field$AABB$minY.getDouble(aabb); + double minZ = Reflections.field$AABB$minZ.getDouble(aabb); + double maxX = Reflections.field$AABB$maxX.getDouble(aabb); + double maxY = Reflections.field$AABB$maxY.getDouble(aabb); + double maxZ = Reflections.field$AABB$maxZ.getDouble(aabb); + + double d = Math.min(1.0, maxX - minX); + double e = Math.min(1.0, maxY - minY); + double f = Math.min(1.0, maxZ - minZ); + int i = Math.max(2, MCUtils.ceil(d / 0.25)); + int j = Math.max(2, MCUtils.ceil(e / 0.25)); + int k = Math.max(2, MCUtils.ceil(f / 0.25)); + + Object data = Reflections.method$CraftBlockData$createData.invoke(null, state); + for (int l = 0; l < i; ++l) { + for (int m = 0; m < j; ++m) { + for (int n = 0; n < k; ++n) { + double g = ((double) l + 0.5) / (double) i; + double h = ((double) m + 0.5) / (double) j; + double o = ((double) n + 0.5) / (double) k; + double p = g * d + minX; + double q = h * e + minY; + double r = o * f + minZ; + bukkitWorld.spawnParticle(BLOCK_CRACK, + (double) Reflections.field$Vec3i$x.getInt(pos) + p, + (double) Reflections.field$Vec3i$y.getInt(pos) + q, + (double) Reflections.field$Vec3i$z.getInt(pos) + r, + 1, + 0, + 0, + 0, + 0, + data + ); + } + } + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to add block break particles", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java new file mode 100644 index 000000000..3e5c9ce07 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.bukkit.util; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.OfflinePlayer; + +public class PlaceholderAPIUtils { + + public static String parse(OfflinePlayer player, String text) { + return PlaceholderAPI.setPlaceholders(player, text); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java new file mode 100644 index 000000000..698413bc6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java @@ -0,0 +1,141 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.RandomUtils; +import org.bukkit.Location; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; + +import static java.util.Objects.requireNonNull; + +public class PlayerUtils { + + public static void dropItem(@NotNull Player player, @NotNull ItemStack itemStack, boolean retainOwnership, boolean noPickUpDelay, boolean throwRandomly) { + requireNonNull(player, "player"); + requireNonNull(itemStack, "itemStack"); + Location location = player.getLocation().clone(); + Item item = player.getWorld().dropItem(player.getEyeLocation().clone().subtract(new Vector(0,0.3,0)), itemStack); + item.setPickupDelay(noPickUpDelay ? 0 : 40); + item.setOwner(player.getUniqueId()); + if (retainOwnership) { + item.setThrower(player.getUniqueId()); + } + if (throwRandomly) { + double d1 = RandomUtils.generateRandomDouble(0,1) * 0.5f; + double d2 = RandomUtils.generateRandomDouble(0,1) * (Math.PI * 2); + item.setVelocity(new Vector(-Math.sin(d2) * d1, 0.2f, Math.cos(d2) * d1)); + } else { + double d1 = Math.sin(location.getPitch() * (Math.PI/180)); + double d2 = RandomUtils.generateRandomDouble(0, 0.02); + double d3 = RandomUtils.generateRandomDouble(0,1) * (Math.PI * 2); + Vector vector = location.getDirection().multiply(0.3).setY(-d1 * 0.3 + 0.1 + (RandomUtils.generateRandomDouble(0,1) - RandomUtils.generateRandomDouble(0,1)) * 0.1); + vector.add(new Vector(Math.cos(d3) * d2, 0, Math.sin(d3) * d2)); + item.setVelocity(vector); + } + } + + public static int putItemsToInventory(Inventory inventory, ItemStack itemStack, int amount) { + ItemMeta meta = itemStack.getItemMeta(); + int maxStackSize = itemStack.getMaxStackSize(); + for (ItemStack other : inventory.getStorageContents()) { + if (other != null) { + if (other.getType() == itemStack.getType() && other.getItemMeta().equals(meta)) { + if (other.getAmount() < maxStackSize) { + int delta = maxStackSize - other.getAmount(); + if (amount > delta) { + other.setAmount(maxStackSize); + amount -= delta; + } else { + other.setAmount(amount + other.getAmount()); + return 0; + } + } + } + } + } + + if (amount > 0) { + for (ItemStack other : inventory.getStorageContents()) { + if (other == null) { + if (amount > maxStackSize) { + amount -= maxStackSize; + ItemStack cloned = itemStack.clone(); + cloned.setAmount(maxStackSize); + inventory.addItem(cloned); + } else { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(amount); + inventory.addItem(cloned); + return 0; + } + } + } + } + + return amount; + } + + public static int giveItem(Player player, ItemStack itemStack, int amount) { + PlayerInventory inventory = player.getInventory(); + ItemMeta meta = itemStack.getItemMeta(); + int maxStackSize = itemStack.getMaxStackSize(); + if (amount > maxStackSize * 100) { + amount = maxStackSize * 100; + } + int actualAmount = amount; + for (ItemStack other : inventory.getStorageContents()) { + if (other != null) { + if (other.getType() == itemStack.getType() && other.getItemMeta().equals(meta)) { + if (other.getAmount() < maxStackSize) { + int delta = maxStackSize - other.getAmount(); + if (amount > delta) { + other.setAmount(maxStackSize); + amount -= delta; + } else { + other.setAmount(amount + other.getAmount()); + return actualAmount; + } + } + } + } + } + if (amount > 0) { + for (ItemStack other : inventory.getStorageContents()) { + if (other == null) { + if (amount > maxStackSize) { + amount -= maxStackSize; + ItemStack cloned = itemStack.clone(); + cloned.setAmount(maxStackSize); + inventory.addItem(cloned); + } else { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(amount); + inventory.addItem(cloned); + return actualAmount; + } + } + } + } + + if (amount > 0) { + for (int i = 0; i < amount / maxStackSize; i++) { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(maxStackSize); + player.getWorld().dropItem(player.getLocation(), cloned); + } + int left = amount % maxStackSize; + if (left != 0) { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(left); + player.getWorld().dropItem(player.getLocation(), cloned); + } + } + + return actualAmount; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java new file mode 100644 index 000000000..9e624a7ef --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -0,0 +1,3804 @@ +package net.momirealms.craftengine.bukkit.util; + +import com.google.common.collect.ImmutableList; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToByteEncoder; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.inventory.ItemStack; +import sun.misc.Unsafe; + +import java.io.BufferedReader; +import java.lang.reflect.*; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import static java.util.Objects.requireNonNull; + +public class Reflections { + + public static void init() { + } + + public static final Unsafe UNSAFE; + + static { + try { + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + UNSAFE = (Unsafe) unsafeField.get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$CraftChatMessage = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("util.CraftChatMessage") + ) + ); + + public static final Method method$CraftChatMessage$fromJSON = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftChatMessage, + new String[]{"fromJSON"}, + String.class + ) + ); + + public static final Class clazz$Component = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.Component"), + BukkitReflectionUtils.assembleMCClass("network.chat.IChatBaseComponent") + ) + ); + + public static final Class clazz$ClientboundSetActionBarTextPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetActionBarTextPacket") + ) + ); + + public static final Field field$ClientboundSetActionBarTextPacket$text = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetActionBarTextPacket, clazz$Component, 0 + ) + ); + + public static final Constructor constructor$ClientboundSetActionBarTextPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundSetActionBarTextPacket, clazz$Component + ) + ); + + public static final Class clazz$ComponentContents = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.ComponentContents") + ) + ); + + public static final Method method$Component$getContents = requireNonNull( + ReflectionUtils.getMethods( + clazz$Component, clazz$ComponentContents + ).get(0) + ); + + public static final Class clazz$ScoreContents = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.contents.ScoreContents") + ) + ); + + public static final Field field$ScoreContents$name = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ScoreContents, String.class, 0 + ) + ); + + public static final Class clazz$ClientboundSystemChatPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSystemChatPacket") + ) + ); + + public static final Constructor constructor$ClientboundSystemChatPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundSystemChatPacket, clazz$Component, boolean.class + ) + ); + + public static final Field field$ClientboundSystemChatPacket$overlay = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSystemChatPacket, boolean.class, 0 + ) + ); + + public static final Class clazz$LevelWriter = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LevelWriter"), + BukkitReflectionUtils.assembleMCClass("world.level.IWorldWriter") + ) + ); + + public static final Class clazz$LevelReader = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LevelReader"), + BukkitReflectionUtils.assembleMCClass("world.level.IWorldReader") + ) + ); + + public static final Class clazz$DimensionType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.dimension.DimensionType"), + BukkitReflectionUtils.assembleMCClass("world.level.dimension.DimensionManager") + ) + ); + + public static final Method method$$LevelReader$dimensionType = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelReader, clazz$DimensionType + ) + ); + + public static final Field field$DimensionType$minY = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$DimensionType, int.class, 0 + ) + ); + + public static final Field field$DimensionType$height = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$DimensionType, int.class, 1 + ) + ); + + public static final Field field$ClientboundSystemChatPacket$component = + ReflectionUtils.getDeclaredField( + clazz$ClientboundSystemChatPacket, clazz$Component, 0 + ); + + public static final Field field$ClientboundSystemChatPacket$text = + ReflectionUtils.getDeclaredField( + clazz$ClientboundSystemChatPacket, String.class, 0 + ); + + public static final Class clazz$ClientboundBossEventPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss") + ) + ); + + public static final Class clazz$ClientboundBossEventPacket$Operation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket$Operation"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss$Action") + ) + ); + + public static final Constructor constructor$ClientboundBossEventPacket = requireNonNull( + ReflectionUtils.getDeclaredConstructor( + clazz$ClientboundBossEventPacket, + UUID.class, clazz$ClientboundBossEventPacket$Operation + ) + ); + + public static final Class clazz$ClientboundBossEventPacket$AddOperation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket$AddOperation"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss$a") + ) + ); + + + public static final Class clazz$BossEvent$BossBarColor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.BossEvent$BossBarColor"), + BukkitReflectionUtils.assembleMCClass("world.BossBattle$BarColor") + ) + ); + + public static final Method method$BossEvent$BossBarColor$valueOf = requireNonNull( + ReflectionUtils.getMethod( + clazz$BossEvent$BossBarColor, + new String[]{"valueOf"}, + String.class + ) + ); + + public static final Class clazz$BossEvent$BossBarOverlay = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.BossEvent$BossBarOverlay"), + BukkitReflectionUtils.assembleMCClass("world.BossBattle$BarStyle") + ) + ); + + public static final Method method$BossEvent$BossBarOverlay$valueOf = requireNonNull( + ReflectionUtils.getMethod( + clazz$BossEvent$BossBarOverlay, + new String[]{"valueOf"}, + String.class + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$name = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 0 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$progress = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 1 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$color = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 2 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$overlay = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 3 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$darkenScreen = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 4 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$playMusic = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 5 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$createWorldFog = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 6 + ) + ); + + public static final Class clazz$ResourceLocation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("resources.ResourceLocation"), + BukkitReflectionUtils.assembleMCClass("resources.MinecraftKey") + ) + ); + + public static Object allocateAddOperationInstance() throws InstantiationException { + return UNSAFE.allocateInstance(clazz$ClientboundBossEventPacket$AddOperation); + } + + public static final Class clazz$ClientboundBossEventPacket$UpdateNameOperation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket$UpdateNameOperation"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss$e") + ) + ); + + public static final Constructor constructor$ClientboundBossEventPacket$UpdateNameOperation = requireNonNull( + ReflectionUtils.getDeclaredConstructor( + clazz$ClientboundBossEventPacket$UpdateNameOperation, + clazz$Component + ) + ); + + public static final Class clazz$SoundEvent = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("sounds.SoundEvent"), + BukkitReflectionUtils.assembleMCClass("sounds.SoundEffect") + ) + ); + + public static final Constructor constructor$SoundEvent = requireNonNull( + VersionHelper.isVersionNewerThan1_21_2() ? + ReflectionUtils.getConstructor( + clazz$SoundEvent, clazz$ResourceLocation, Optional.class + ) : + ReflectionUtils.getDeclaredConstructor( + clazz$SoundEvent, clazz$ResourceLocation, float.class, boolean.class + ) + ); + + // 1.21.2+ + public static final Field field$SoundEvent$fixedRange = ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, Optional.class, 0 + ); + + // 1.21.2- + public static final Field field$SoundEvent$range = ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, float.class, 0 + ); + + public static final Field field$SoundEvent$newSystem = ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, boolean.class, 0 + ); + + public static final Method method$SoundEvent$createVariableRangeEvent = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$SoundEvent, clazz$SoundEvent, clazz$ResourceLocation + ) + ); + + public static final Class clazz$CraftRegistry = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftRegistry") + ); + + public static final Object instance$MinecraftRegistry; + + static { + if (VersionHelper.isVersionNewerThan1_20()) { + try { + Method method = requireNonNull(ReflectionUtils.getMethod(clazz$CraftRegistry, new String[]{"getMinecraftRegistry"})); + instance$MinecraftRegistry = method.invoke(null); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } else { + instance$MinecraftRegistry = null; + } + } + + public static final Class clazz$Component$Serializer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.Component$Serializer"), + BukkitReflectionUtils.assembleMCClass("network.chat.IChatBaseComponent$ChatSerializer") + ) + ); + + public static final Class clazz$HolderLookup$Provider = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.HolderLookup$Provider"), + BukkitReflectionUtils.assembleMCClass("core.HolderLookup$b") + ); + + public static final Method method$Component$Serializer$fromJson = ReflectionUtils.getMethod( + clazz$Component$Serializer, + new String[] { "fromJson" }, + String.class, clazz$HolderLookup$Provider + ); + + public static final Method method$Component$Serializer$toJson = ReflectionUtils.getMethod( + clazz$Component$Serializer, + new String[] { "toJson" }, + clazz$Component, clazz$HolderLookup$Provider + ); + + public static final Class clazz$ClientboundBundlePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBundlePacket") + ) + ); + + public static final Constructor constructor$ClientboundBundlePacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundBundlePacket, Iterable.class) + ); + + public static final Class clazz$Packet = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.Packet") + ) + ); + + public static final Class clazz$ServerPlayer = requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerPlayer"), + BukkitReflectionUtils.assembleMCClass("server.level.EntityPlayer") + )); + + public static final Class clazz$ServerGamePacketListenerImpl = requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.network.ServerGamePacketListenerImpl"), + BukkitReflectionUtils.assembleMCClass("server.network.PlayerConnection") + )); + + public static final Class clazz$ServerCommonPacketListenerImpl = requireNonNull( + clazz$ServerGamePacketListenerImpl.getSuperclass() + ); + + public static final Class clazz$Connection = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.Connection"), + BukkitReflectionUtils.assembleMCClass("network.NetworkManager") + ) + ); + + public static final Field field$ServerCommonPacketListenerImpl$connection = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getDeclaredField( + clazz$ServerCommonPacketListenerImpl, clazz$Connection, 0 + ) : + ReflectionUtils.getDeclaredField( + clazz$ServerGamePacketListenerImpl, clazz$Connection, 0 + ) + ); + + public static final Class clazz$PacketSendListener = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.PacketSendListener") + ) + ); + + public static final Class clazz$CraftPlayer = requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("entity.CraftPlayer") + )); + + public static final Method method$CraftPlayer$getHandle = requireNonNull( + ReflectionUtils.getMethod(clazz$CraftPlayer, new String[] { "getHandle" }) + ); + + public static final Field field$ServerPlayer$connection = requireNonNull( + ReflectionUtils.getInstanceDeclaredField(clazz$ServerPlayer, clazz$ServerGamePacketListenerImpl, 0) + ); + + public static final Method method$ServerGamePacketListenerImpl$sendPacket = requireNonNull( + ReflectionUtils.getMethods(clazz$ServerGamePacketListenerImpl, void.class, clazz$Packet).get(0) + ); + + public static final Method method$Connection$sendPacketImmediate = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getDeclaredMethod( + clazz$Connection, void.class, new String[] {"sendPacket", "b"}, clazz$Packet, clazz$PacketSendListener, boolean.class + ) : + ReflectionUtils.getDeclaredMethod( + clazz$Connection, void.class, new String[] {"sendPacket"}, clazz$Packet, clazz$PacketSendListener, Boolean.class + ) + ); + + public static final Field field$NetworkManager = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getDeclaredField(clazz$ServerGamePacketListenerImpl.getSuperclass(), clazz$Connection, 0) : + ReflectionUtils.getDeclaredField(clazz$ServerGamePacketListenerImpl, clazz$Connection, 0) + ); + + public static final Field field$Channel = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Connection, Channel.class, 0 + ) + ); + + public static final Field field$BundlePacket$packets = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBundlePacket.getSuperclass(), Iterable.class, 0 + ) + ); + + public static final Class clazz$EntityType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.EntityType"), + BukkitReflectionUtils.assembleMCClass("world.entity.EntityTypes") + ) + ); + + public static final Class clazz$EntityType$EntityFactory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.EntityType$EntityFactory"), + BukkitReflectionUtils.assembleMCClass("world.entity.EntityTypes$b") + ) + ); + + public static final Field field$EntityType$factory = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$EntityType, clazz$EntityType$EntityFactory, 0 + ) + ); + + public static final Class clazz$ClientboundAddEntityPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutSpawnEntity"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundAddEntityPacket") + ) + ); + + public static final Class clazz$VoxelShape = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.shapes.VoxelShape") + ) + ); + + public static final Field field$ClientboundAddEntityPacket$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundAddEntityPacket, int.class, 4 + ) + ); + + public static final Field field$ClientboundAddEntityPacket$type = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundAddEntityPacket, clazz$EntityType, 0 + ) + ); + + public static final Class clazz$PacketPlayOutNamedEntitySpawn = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutNamedEntitySpawn") + ); + + public static final Class clazz$ClientboundRemoveEntitiesPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRemoveEntitiesPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityDestroy") + ) + ); + + public static final Field field$ClientboundRemoveEntitiesPacket$entityIds = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundRemoveEntitiesPacket, 0 + ) + ); + + public static final Field field$ClientboundAddEntityPacket$entityId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundAddEntityPacket, int.class, 0 + ) + ); + + public static final Field field$PacketPlayOutNamedEntitySpawn$entityId = clazz$PacketPlayOutNamedEntitySpawn != null ? + ReflectionUtils.getDeclaredField( + clazz$PacketPlayOutNamedEntitySpawn, int.class, 0 + ) : null; + + public static final Class clazz$Vec3 = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.Vec3"), + BukkitReflectionUtils.assembleMCClass("world.phys.Vec3D") + ) + ); + + public static final Constructor constructor$Vec3 = requireNonNull( + ReflectionUtils.getConstructor( + clazz$Vec3, double.class, double.class, double.class + ) + ); + + public static final Constructor constructor$ClientboundAddEntityPacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundAddEntityPacket, + int.class, UUID.class, + double.class, double.class, double.class, + float.class, float.class, + clazz$EntityType, + int.class, clazz$Vec3, double.class + ) + ); + + public static final Constructor constructor$ClientboundRemoveEntitiesPacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundRemoveEntitiesPacket, int[].class) + ); + + public static final Class clazz$ClientboundSetPassengersPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutMount"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPassengersPacket") + ) + ); + + public static final Field field$ClientboundSetPassengersPacket$vehicle = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPassengersPacket, 0 + ) + ); + + public static final Field field$ClientboundSetPassengersPacket$passengers = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPassengersPacket, 1 + ) + ); + + public static Object allocateClientboundSetPassengersPacketInstance() throws InstantiationException { + return UNSAFE.allocateInstance(clazz$ClientboundSetPassengersPacket); + } + + public static final Field field$Vec3$Zero = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Vec3, clazz$Vec3, 0 + ) + ); + + public static final Object instance$Vec3$Zero; + + static { + try { + instance$Vec3$Zero = field$Vec3$Zero.get(null); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Class clazz$ClientboundSetEntityDataPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityMetadata"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetEntityDataPacket") + ) + ); + + public static final Constructor constructor$ClientboundSetEntityDataPacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundSetEntityDataPacket, + int.class, List.class) + ); + + public static final Class clazz$EntityDataSerializers = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.EntityDataSerializers"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcherRegistry") + ) + ); + + public static final Class clazz$EntityDataSerializer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.EntityDataSerializer"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcherSerializer") + ) + ); + + public static final Class clazz$EntityDataAccessor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.EntityDataAccessor"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcherObject") + ) + ); + + public static final Constructor constructor$EntityDataAccessor = requireNonNull( + ReflectionUtils.getConstructor( + clazz$EntityDataAccessor, int.class, clazz$EntityDataSerializer + ) + ); + + public static final Class clazz$SynchedEntityData$DataValue = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.SynchedEntityData$DataValue"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcher$b") + ) + ); + + public static final Method method$SynchedEntityData$DataValue$create = requireNonNull( + ReflectionUtils.getMethod( + clazz$SynchedEntityData$DataValue, clazz$SynchedEntityData$DataValue, clazz$EntityDataAccessor, Object.class + ) + ); + + public static final Method method$Component$empty = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Component, clazz$Component + ) + ); + + public static final Object instance$Component$empty; + + static { + try { + instance$Component$empty = method$Component$empty.invoke(null); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Class clazz$Quaternionf = requireNonNull( + ReflectionUtils.getClazz( + "org.joml.Quaternionf" + ) + ); + + public static final Constructor constructor$Quaternionf = requireNonNull( + ReflectionUtils.getConstructor( + clazz$Quaternionf, float.class, float.class, float.class, float.class + ) + ); + + public static final Object instance$Quaternionf$None; + + static { + try { + instance$Quaternionf$None = constructor$Quaternionf.newInstance(0f, 0f, 0f, 1f); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Class clazz$Vector3f = requireNonNull( + ReflectionUtils.getClazz( + "org.joml.Vector3f" + ) + ); + + public static final Constructor constructor$Vector3f = requireNonNull( + ReflectionUtils.getConstructor( + clazz$Vector3f, float.class, float.class, float.class + ) + ); + + public static final Object instance$Vector3f$None; + public static final Object instance$Vector3f$Normal; + + static { + try { + instance$Vector3f$None = constructor$Vector3f.newInstance(0f, 0f, 0f); + instance$Vector3f$Normal = constructor$Vector3f.newInstance(1f, 1f, 1f); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Field field$ClientboundSetEntityDataPacket$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetEntityDataPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundSetEntityDataPacket$packedItems = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetEntityDataPacket, List.class, 0 + ) + ); + + public static final Field field$SynchedEntityData$DataValue$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SynchedEntityData$DataValue, int.class, 0 + ) + ); + + public static final Field field$SynchedEntityData$DataValue$value = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SynchedEntityData$DataValue, 2 + ) + ); + + public static final Class clazz$ClientboundUpdateAttributesPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundUpdateAttributesPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutUpdateAttributes") + ) + ); + + public static final Class clazz$AttributeInstance = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeInstance"), + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeModifiable") + ) + ); + + public static final Method method$AttributeInstance$getValue = requireNonNull( + ReflectionUtils.getMethod( + clazz$AttributeInstance, double.class, new String[]{"getValue", "f"} + ) + ); + + public static final Class clazz$AttributeModifier = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeModifier") + ) + ); + + public static final Class clazz$AttributeModifier$Operation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeModifier$Operation") + ) + ); + + public static final Method method$AttributeModifier$Operation$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$AttributeModifier$Operation, clazz$AttributeModifier$Operation.arrayType() + ) + ); + + public static final Object instance$AttributeModifier$Operation$ADD_VALUE; + + static { + try { + Object[] values = (Object[]) method$AttributeModifier$Operation$values.invoke(null); + instance$AttributeModifier$Operation$ADD_VALUE = values[0]; + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Constructor constructor$AttributeModifier = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor(clazz$AttributeModifier, String.class, double.class, clazz$AttributeModifier$Operation): + ( + !VersionHelper.isVersionNewerThan1_21() ? + ReflectionUtils.getConstructor(clazz$AttributeModifier, UUID.class, String.class, double.class, clazz$AttributeModifier$Operation) : + ( + ReflectionUtils.getConstructor(clazz$AttributeModifier, clazz$ResourceLocation, double.class, clazz$AttributeModifier$Operation) + ) + ) + ); + + public static final Constructor constructor$ClientboundUpdateAttributesPacket0 = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket, 0 + ) + ); + + public static final Constructor constructor$ClientboundUpdateAttributesPacket1 = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket, 1 + ) + ); + + public static final Field field$ClientboundUpdateAttributesPacket$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundUpdateAttributesPacket$attributes = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket, List.class, 0 + ) + ); + + public static final Class clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundUpdateAttributesPacket$AttributeSnapshot"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutUpdateAttributes$AttributeSnapshot") + ) + ); + + public static final Class clazz$Holder = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Holder") + ) + ); + + // 1.20.6+ + public static final Method method$Holder$getRegisteredName = + ReflectionUtils.getMethod( + clazz$Holder, String.class + ); + + public static final Class clazz$Holder$Reference = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Holder$Reference"), + BukkitReflectionUtils.assembleMCClass("core.Holder$c") + ) + ); + + public static final Field field$ClientboundUpdateAttributesPacket$AttributeSnapshot$attribute = + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Holder, 0 + ); + + public static final Field field$ClientboundUpdateAttributesPacket$AttributeSnapshot$base = + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, double.class, 0 + ); + + public static final Field field$ClientboundUpdateAttributesPacket$AttributeSnapshot$modifiers = + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, Collection.class, 0 + ); + + public static final Method method$Holder$value = requireNonNull( + ReflectionUtils.getMethod( + clazz$Holder, new String[]{"a", "value"} + ) + ); + + public static final Method method$Holder$direct = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Holder, clazz$Holder, Object.class + ) + ); + + public static final Class clazz$Attribute = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.Attribute"), + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeBase") + ) + ); + + public static final Constructor constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Holder, double.class, Collection.class + ) : + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Attribute, double.class, Collection.class + ) + ); + + public static final Field field$Attribute$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Attribute, String.class, 0 + ) + ); + + public static final Field field$AttributeModifier$amount = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AttributeModifier, double.class, 0 + ) + ); + + public static final Class clazz$ClientboundGameEventPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundGameEventPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutGameStateChange") + ) + ); + + public static final Class clazz$ClientboundGameEventPacket$Type = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundGameEventPacket$Type"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutGameStateChange$a") + ) + ); + + public static final Field field$ClientboundGameEventPacket$event = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundGameEventPacket, clazz$ClientboundGameEventPacket$Type, 0 + ) + ); + + public static final Field field$ClientboundGameEventPacket$param = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundGameEventPacket, float.class, 0 + ) + ); + + public static final Field field$ClientboundGameEventPacket$Type$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundGameEventPacket$Type, int.class, 0 + ) + ); + + public static final Class clazz$GameType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.GameType"), + BukkitReflectionUtils.assembleMCClass("world.level.EnumGamemode") + ) + ); + + public static final Method method$GameType$getId = requireNonNull( + ReflectionUtils.getMethod( + clazz$GameType, new String[] { "getId", "a" } + ) + ); + + public static final Class clazz$Biome = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.biome.Biome"), + BukkitReflectionUtils.assembleMCClass("world.level.biome.BiomeBase") + ) + ); + + public static final Class clazz$CraftWorld = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftWorld") + ) + ); + + public static final Class clazz$ServerLevel = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerLevel"), + BukkitReflectionUtils.assembleMCClass("server.level.WorldServer") + ) + ); + + public static final Field field$CraftWorld$ServerLevel = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftWorld, clazz$ServerLevel, 0 + ) + ); + + public static final Method method$ServerLevel$getNoiseBiome = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerLevel, clazz$Holder, int.class, int.class, int.class + ) + ); + + public static final Class clazz$ResourceKey = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("resources.ResourceKey") + ) + ); + + public static final Field field$ResourceKey$registry = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ResourceKey, clazz$ResourceLocation, 0 + ) + ); + + public static final Field field$ResourceKey$location = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ResourceKey, clazz$ResourceLocation, 1 + ) + ); + + public static final Method method$ResourceKey$create = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ResourceKey, clazz$ResourceKey, clazz$ResourceKey, clazz$ResourceLocation + ) + ); + + public static final Class clazz$MinecraftServer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.MinecraftServer") + ) + ); + + public static final Method method$MinecraftServer$getServer = requireNonNull( + ReflectionUtils.getMethod(clazz$MinecraftServer, new String[] { "getServer" }) + ); + + public static final Class clazz$LayeredRegistryAccess = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.LayeredRegistryAccess") + ) + ); + + public static final Field field$MinecraftServer$registries = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MinecraftServer, clazz$LayeredRegistryAccess, 0 + ) + ); + + public static final Class clazz$RegistryAccess$Frozen = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.RegistryAccess$Frozen"), + BukkitReflectionUtils.assembleMCClass("core.IRegistryCustom$Dimension") + ) + ); + + public static final Class clazz$RegistryAccess = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.RegistryAccess"), + BukkitReflectionUtils.assembleMCClass("core.IRegistryCustom") + ) + ); + + public static final Field field$LayeredRegistryAccess$composite = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LayeredRegistryAccess, clazz$RegistryAccess$Frozen, 0 + ) + ); + + public static final Class clazz$Registry = requireNonNull( + requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.WritableRegistry"), + BukkitReflectionUtils.assembleMCClass("core.IRegistryWritable") + )).getInterfaces()[0] + ); + + public static final Method method$RegistryAccess$registryOrThrow = requireNonNull( + ReflectionUtils.getMethod( + clazz$RegistryAccess, clazz$Registry, clazz$ResourceKey + ) + ); + + public static final Method method$Registry$register = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Registry, Object.class, clazz$Registry, clazz$ResourceLocation, Object.class + ) + ); + + public static final Method method$Registry$registerForHolder = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Registry, clazz$Holder$Reference, clazz$Registry, clazz$ResourceLocation, Object.class + ) + ); + + public static final Method method$Holder$Reference$bindValue = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Holder$Reference, void.class, Object.class + ) + ); + + public static final Class clazz$Registries = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.registries.Registries") + ) + ); + + public static final Class clazz$DefaultedRegistry = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.DefaultedRegistry"), + BukkitReflectionUtils.assembleMCClass("core.RegistryBlocks") + ) + ); + + public static final Method method$Registry$getKey = requireNonNull( + ReflectionUtils.getMethod(clazz$Registry, clazz$ResourceLocation, Object.class) + ); + + public static final Method method$Registry$get = requireNonNull( + ReflectionUtils.getMethods( + clazz$Registry, Object.class, clazz$ResourceLocation + ).stream().filter(m -> m.getReturnType() != Optional.class).findAny().orElse(null) + ); + + // use ResourceLocation + public static final Method method$Registry$getHolder0; + // use ResourceKey + public static final Method method$Registry$getHolder1; + + static { + List methods = ReflectionUtils.getMethods( + clazz$Registry, Optional.class, clazz$ResourceLocation + ); + Method theMethod1 = null; + for (Method method : methods) { + Type returnType = method.getGenericReturnType(); + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceLocation) { + if (returnType instanceof ParameterizedType parameterizedType) { + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + if (actualTypeArguments.length == 1) { + if (actualTypeArguments[0] instanceof ParameterizedType) { + theMethod1 = method; + } + } + } + } + } + method$Registry$getHolder0 = theMethod1; + } + + static { + List methods = ReflectionUtils.getMethods( + clazz$Registry, Optional.class, clazz$ResourceKey + ); + Method theMethod1 = null; + for (Method method : methods) { + Type returnType = method.getGenericReturnType(); + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceKey) { + if (returnType instanceof ParameterizedType parameterizedType) { + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + if (actualTypeArguments.length == 1) { + if (actualTypeArguments[0] instanceof ParameterizedType) { + theMethod1 = method; + } + } + } + } + } + method$Registry$getHolder1 = theMethod1; + } + + public static final Class clazz$ClientboundSetPlayerTeamPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPlayerTeamPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutScoreboardTeam") + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$method = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$players = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket, Collection.class, 0 + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$parameters = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket, Optional.class, 0 + ) + ); + + public static final Class clazz$ClientboundSetPlayerTeamPacket$Parameters = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutScoreboardTeam$b") + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$Parameters$nametagVisibility = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket$Parameters, String.class, 0 + ) + ); + + public static final Class clazz$ServerConnectionListener = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.network.ServerConnectionListener"), + BukkitReflectionUtils.assembleMCClass("server.network.ServerConnection") + ) + ); + + public static final Field field$MinecraftServer$connection = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$MinecraftServer, clazz$ServerConnectionListener, 0) + ); + + public static final Field field$ServerConnectionListener$channels; + + static { + Field[] fields = clazz$ServerConnectionListener.getDeclaredFields(); + Field f = null; + for (Field field : fields) { + if (List.class.isAssignableFrom(field.getType())) { + Type genericType = field.getGenericType(); + if (genericType instanceof ParameterizedType paramType) { + Type[] actualTypeArguments = paramType.getActualTypeArguments(); + if (actualTypeArguments.length > 0 && actualTypeArguments[0] == ChannelFuture.class) { + f = ReflectionUtils.setAccessible(field); + break; + } + } + } + } + field$ServerConnectionListener$channels = requireNonNull(f); + } + + public static final Class clazz$ClientboundBlockUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBlockUpdatePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBlockChange") + ) + ); + + public static final Class clazz$ClientboundSectionBlocksUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSectionBlocksUpdatePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutMultiBlockChange") + ) + ); + + public static final Class clazz$BlockPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.BlockPos"), + BukkitReflectionUtils.assembleMCClass("core.BlockPosition") + ) + ); + + public static final Class clazz$SectionPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.SectionPos"), + BukkitReflectionUtils.assembleMCClass("core.SectionPosition") + ) + ); + + public static final Class clazz$Vec3i = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Vec3i"), + BukkitReflectionUtils.assembleMCClass("core.BaseBlockPosition") + ) + ); + + public static final Field field$Vec3i$x = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Vec3i, int.class, 0) + ); + + public static final Field field$Vec3i$y = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Vec3i, int.class, 1) + ); + + public static final Field field$Vec3i$z = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Vec3i, int.class, 2) + ); + + public static final Class clazz$BlockState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockState"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.IBlockData") + ) + ); + + public static final Field field$ClientboundSectionBlocksUpdatePacket$positions = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSectionBlocksUpdatePacket, short[].class, 0 + ) + ); + + public static final Field field$ClientboundSectionBlocksUpdatePacket$states = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSectionBlocksUpdatePacket, clazz$BlockState.arrayType(), 0 + ) + ); + + public static final Field field$ClientboundSectionBlocksUpdatePacket$sectionPos = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSectionBlocksUpdatePacket, clazz$SectionPos, 0 + ) + ); + + public static final Field field$ClientboundBlockUpdatePacket$blockstate = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBlockUpdatePacket, clazz$BlockState, 0 + ) + ); + + public static final Field field$ClientboundBlockUpdatePacket$blockPos = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBlockUpdatePacket, clazz$BlockPos, 0 + ) + ); + + public static final Class clazz$Block = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.Block") + ) + ); + + public static final Class clazz$IdMapper = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.IdMapper"), + BukkitReflectionUtils.assembleMCClass("core.RegistryBlockID") + ) + ); + + public static final Class clazz$IdMap = requireNonNull( + clazz$IdMapper.getInterfaces()[0] + ); + + public static final Method method$IdMap$byId = requireNonNull( + ReflectionUtils.getMethod( + clazz$IdMap, Object.class, int.class + ) + ); + + public static final Method method$IdMap$size = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMap, int.class) + ); + + public static final Method method$IdMapper$size = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMapper, int.class) + ); + + public static final Method method$IdMapper$getId = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMapper, int.class, Object.class) + ); + + public static final Method method$IdMapper$byId = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMapper, Object.class, int.class) + ); + + public static final Field field$BLOCK_STATE_REGISTRY = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Block, clazz$IdMapper, 0) + ); + + public static final Method method$Registry$asHolderIdMap = requireNonNull( + ReflectionUtils.getMethod(clazz$Registry, clazz$IdMap) + ); + + public static final Class clazz$LevelAccessor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LevelAccessor"), + BukkitReflectionUtils.assembleMCClass("world.level.GeneratorAccess") + ) + ); + + public static final Object instance$BLOCK_STATE_REGISTRY; + + static { + try { + instance$BLOCK_STATE_REGISTRY = field$BLOCK_STATE_REGISTRY.get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$Direction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Direction"), + BukkitReflectionUtils.assembleMCClass("core.EnumDirection") + ) + ); + + public static final Method method$Direction$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Direction, clazz$Direction.arrayType() + ) + ); + + public static final Object instance$Direction$DOWN; + public static final Object instance$Direction$UP; + public static final Object[] instance$Directions; + + static { + try { + instance$Directions = (Object[]) method$Direction$values.invoke(null); + instance$Direction$DOWN = instance$Directions[0]; + instance$Direction$UP = instance$Directions[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$CraftBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlock") + ) + ); + + public static final Class clazz$CraftEventFactory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("event.CraftEventFactory") + ) + ); + + public static final Class clazz$CraftBlockStates = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlockStates") + ) + ); + + public static final Class clazz$CraftBlockState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlockState") + ) + ); + + public static final Method method$CraftBlock$at = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlock, clazz$CraftBlock, clazz$LevelAccessor, clazz$BlockPos + ) + ); + + public static final Method method$CraftBlockStates$getBlockState = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlockStates, clazz$CraftBlockState, clazz$LevelAccessor, clazz$BlockPos + ) + ); + + public static final Class clazz$CraftBlockData = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.data.CraftBlockData") + ) + ); + + public static final Field field$CraftBlockData$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftBlockData, clazz$BlockState, 0 + ) + ); + + public static final Method method$CraftBlockData$createData = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlockData, new String[]{"createData"}, clazz$CraftBlockData, clazz$BlockState + ) + ); + + public static final Method method$CraftBlockData$fromData = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlockData, new String[]{"fromData"}, clazz$CraftBlockData, clazz$BlockState + ) + ); + + public static final Constructor constructor$BlockPos = requireNonNull( + ReflectionUtils.getConstructor( + clazz$BlockPos, int.class, int.class, int.class + ) + ); + + public static final Method method$Vec3i$relative = requireNonNull( + ReflectionUtils.getMethod( + clazz$Vec3i, clazz$Vec3i, clazz$Direction + ) + ); + + public static final Method method$BlockPos$relative = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockPos, clazz$BlockPos, clazz$Direction + ) + ); + + public static final Constructor constructor$ClientboundBlockUpdatePacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundBlockUpdatePacket, clazz$BlockPos, clazz$BlockState + ) + ); + + public static final Class clazz$FriendlyByteBuf = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.FriendlyByteBuf"), + BukkitReflectionUtils.assembleMCClass("network.PacketDataSerializer") + ) + ); + + public static final Class clazz$RegistryFriendlyByteBuf = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.RegistryFriendlyByteBuf") + ); + + public static final Constructor constructor$RegistryFriendlyByteBuf = Optional.ofNullable(clazz$RegistryFriendlyByteBuf) + .map(it -> ReflectionUtils.getConstructor(it, 0)) + .orElse(null); + + public static final Constructor constructor$FriendlyByteBuf = requireNonNull( + ReflectionUtils.getConstructor( + clazz$FriendlyByteBuf, ByteBuf.class + ) + ); + + public static final Method method$FriendlyByteBuf$writeByte = requireNonNull( + ReflectionUtils.getMethod( + clazz$FriendlyByteBuf, clazz$FriendlyByteBuf, int.class + ) + ); + + public static final Method method$FriendlyByteBuf$writeLongArray = requireNonNull( + ReflectionUtils.getMethod( + clazz$FriendlyByteBuf, clazz$FriendlyByteBuf, long[].class + ) + ); + + public static final Class clazz$PalettedContainer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.PalettedContainer"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPaletteBlock") + ) + ); + + public static final Class clazz$PalettedContainer$Data = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.PalettedContainer$Data"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPaletteBlock$c") + ) + ); + + public static final Class clazz$BitStorage = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("util.BitStorage"), + BukkitReflectionUtils.assembleMCClass("util.DataBits") + ) + ); + + public static final Class clazz$Palette = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.Palette"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPalette") + ) + ); + + public static final Field field$PalettedContainer$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$PalettedContainer, clazz$PalettedContainer$Data, 0 + ) + ); + + public static final Field field$PalettedContainer$Data$storage = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$PalettedContainer$Data, clazz$BitStorage, 0 + ) + ); + + public static final Field field$PalettedContainer$Data$palette = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$PalettedContainer$Data, clazz$Palette, 0 + ) + ); + + public static final Method method$BitStorage$getBits = requireNonNull( + ReflectionUtils.getMethod( + clazz$BitStorage, int.class + ) + ); + + public static final Method method$BitStorage$getRaw = requireNonNull( + ReflectionUtils.getMethod( + clazz$BitStorage, long[].class + ) + ); + + public static final Method method$Palette$write = requireNonNull( + ReflectionUtils.getMethod( + clazz$Palette, void.class, clazz$FriendlyByteBuf + ) + ); + + public static final Class clazz$ClientboundLevelChunkWithLightPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelChunkWithLightPacket") + ) + ); + + public static final Class clazz$ClientboundLevelChunkPacketData = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelChunkPacketData") + ) + ); + + public static final Field field$ClientboundLevelChunkWithLightPacket$chunkData = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkWithLightPacket, clazz$ClientboundLevelChunkPacketData, 0 + ) + ); + + public static final Field field$ClientboundLevelChunkWithLightPacket$x = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkWithLightPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundLevelChunkWithLightPacket$z = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkWithLightPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundLevelChunkPacketData$buffer = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkPacketData, byte[].class, 0 + ) + ); + + public static final Field field$BlockPhysicsEvent$changed = requireNonNull( + ReflectionUtils.getDeclaredField( + BlockPhysicsEvent.class, BlockData.class, 0 + ) + ); + + public static final Class clazz$CraftChunk = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftChunk") + ) + ); + + public static final Field field$CraftChunk$worldServer = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftChunk, clazz$ServerLevel, 0 + ) + ); + + public static final Class clazz$ChunkAccess = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.ChunkAccess"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.IChunkAccess") + ) + ); + + public static final Class clazz$LevelChunk = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.LevelChunk"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.Chunk") + ) + ); + + public static final Class clazz$LevelChunkSection = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.LevelChunkSection"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.ChunkSection") + ) + ); + + public static final Class clazz$ServerChunkCache = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerChunkCache"), + BukkitReflectionUtils.assembleMCClass("server.level.ChunkProviderServer") + ) + ); + + public static final Field field$ServerLevel$chunkSource = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerLevel, clazz$ServerChunkCache, 0 + ) + ); + + public static final Method method$ServerChunkCache$blockChanged = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerChunkCache, void.class, clazz$BlockPos + ) + ); + + public static final Method method$ServerChunkCache$getChunkAtIfLoadedMainThread = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerChunkCache, clazz$LevelChunk, int.class, int.class + ) + ); + + public static final Field field$ChunkAccess$sections = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkAccess, clazz$LevelChunkSection.arrayType(), 0 + ) + ); + + public static final Method method$LevelChunkSection$setBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelChunkSection, clazz$BlockState, int.class, int.class, int.class, clazz$BlockState, boolean.class + ) + ); + + public static final Class clazz$StatePredicate = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$StatePredicate"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase$f") + ) + ); + + public static final Class clazz$BlockBehaviour$Properties = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$Properties"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase$Info") + ) + ); + + public static final Class clazz$BlockBehaviour = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase") + ) + ); + + public static final Method method$BlockBehaviour$Properties$of = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$BlockBehaviour$Properties, clazz$BlockBehaviour$Properties + ) + ); + + public static final Field field$BlockBehaviour$Properties$id = ReflectionUtils.getDeclaredField( + clazz$BlockBehaviour$Properties, clazz$ResourceKey, 0 + ); + + public static final Constructor constructor$Block = requireNonNull( + ReflectionUtils.getConstructor(clazz$Block, clazz$BlockBehaviour$Properties) + ); + + public static final Class clazz$MobEffect = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffectList"), + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffect") + ) + ); + + public static final Class clazz$MobEffectInstance = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffectInstance"), + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffect") + ) + ); + + public static final Class clazz$ParticleType = requireNonNull( + Optional.of(Objects.requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleType")))).map(it -> { + if (it.getSuperclass() != Object.class) { + return it.getSuperclass(); + } + return it; + }).orElseThrow() + ); + + public static final Class clazz$SoundType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.SoundType"), + BukkitReflectionUtils.assembleMCClass("world.level.block.SoundEffectType") + ) + ); + + public static final Constructor constructor$SoundType = requireNonNull( + ReflectionUtils.getConstructor( + clazz$SoundType, float.class, float.class, clazz$SoundEvent, clazz$SoundEvent, clazz$SoundEvent, clazz$SoundEvent, clazz$SoundEvent + ) + ); + + public static final Class clazz$ItemLike = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.ItemLike"), + BukkitReflectionUtils.assembleMCClass("world.level.IMaterial") + ) + ); + + public static final Class clazz$Item = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.Item") + ) + ); + + public static final Class clazz$FluidState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.Fluid"), + BukkitReflectionUtils.assembleMCClass("world.level.material.FluidState") + ) + ); + + public static final Class clazz$Fluid = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.FluidType"), + BukkitReflectionUtils.assembleMCClass("world.level.material.Fluid") + ) + ); + + public static final Object instance$BuiltInRegistries$BLOCK; + public static final Object instance$BuiltInRegistries$ITEM; + public static final Object instance$BuiltInRegistries$ATTRIBUTE; + public static final Object instance$BuiltInRegistries$BIOME; + public static final Object instance$BuiltInRegistries$MOB_EFFECT; + public static final Object instance$BuiltInRegistries$SOUND_EVENT; + public static final Object instance$BuiltInRegistries$PARTICLE_TYPE; + public static final Object instance$BuiltInRegistries$ENTITY_TYPE; + public static final Object instance$BuiltInRegistries$FLUID; + public static final Object instance$InternalRegistries$DIMENSION_TYPE; + + public static final Object instance$Registries$BLOCK; + public static final Object instance$Registries$ITEM; + public static final Object instance$Registries$ATTRIBUTE; + public static final Object instance$Registries$BIOME; + public static final Object instance$Registries$MOB_EFFECT; + public static final Object instance$Registries$SOUND_EVENT; + public static final Object instance$Registries$PARTICLE_TYPE; + public static final Object instance$Registries$ENTITY_TYPE; + public static final Object instance$Registries$DIMENSION_TYPE; + public static final Object instance$Registries$FLUID; + + public static final Object instance$registryAccess; + + static { + Field[] fields = clazz$Registries.getDeclaredFields(); + try { + Object registries$Block = null; + Object registries$Attribute = null; + Object registries$Biome = null; + Object registries$MobEffect = null; + Object registries$SoundEvent = null; + Object registries$DimensionType = null; + Object registries$ParticleType = null; + Object registries$EntityType = null; + Object registries$Item = null; + Object registries$Fluid = null; + for (Field field : fields) { + Type fieldType = field.getGenericType(); + if (fieldType instanceof ParameterizedType paramType) { + if (paramType.getRawType() == clazz$ResourceKey) { + Type[] actualTypeArguments = paramType.getActualTypeArguments(); + if (actualTypeArguments.length == 1 && actualTypeArguments[0] instanceof ParameterizedType registryType) { + Type type = registryType.getActualTypeArguments()[0]; + if (type instanceof ParameterizedType parameterizedType) { + Type rawType = parameterizedType.getRawType(); + if (rawType == clazz$ParticleType) { + registries$ParticleType = field.get(null); + } else if (rawType == clazz$EntityType) { + registries$EntityType = field.get(null); + } + } else { + if (type == clazz$Block) { + registries$Block = field.get(null); + } else if (type == clazz$Attribute) { + registries$Attribute = field.get(null); + } else if (type == clazz$Biome) { + registries$Biome = field.get(null); + } else if (type == clazz$MobEffect) { + registries$MobEffect = field.get(null); + } else if (type == clazz$SoundEvent) { + registries$SoundEvent = field.get(null); + } else if (type == clazz$DimensionType) { + registries$DimensionType = field.get(null); + } else if (type == clazz$Item) { + registries$Item = field.get(null); + } else if (type == clazz$Fluid) { + registries$Fluid = field.get(null); + } + } + } + } + } + } + instance$Registries$BLOCK = requireNonNull(registries$Block); + instance$Registries$ITEM = requireNonNull(registries$Item); + instance$Registries$ATTRIBUTE = requireNonNull(registries$Attribute); + instance$Registries$BIOME = requireNonNull(registries$Biome); + instance$Registries$MOB_EFFECT = requireNonNull(registries$MobEffect); + instance$Registries$SOUND_EVENT = requireNonNull(registries$SoundEvent); + instance$Registries$DIMENSION_TYPE = requireNonNull(registries$DimensionType); + instance$Registries$PARTICLE_TYPE = requireNonNull(registries$ParticleType); + instance$Registries$ENTITY_TYPE = requireNonNull(registries$EntityType); + instance$Registries$FLUID = requireNonNull(registries$Fluid); + Object server = method$MinecraftServer$getServer.invoke(null); + Object registries = field$MinecraftServer$registries.get(server); + instance$registryAccess = field$LayeredRegistryAccess$composite.get(registries); + instance$BuiltInRegistries$BLOCK = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Block); + instance$BuiltInRegistries$ITEM = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Item); + instance$BuiltInRegistries$ATTRIBUTE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Attribute); + instance$BuiltInRegistries$BIOME = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Biome); + instance$BuiltInRegistries$MOB_EFFECT = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$MobEffect); + instance$BuiltInRegistries$SOUND_EVENT = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$SoundEvent); + instance$InternalRegistries$DIMENSION_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$DimensionType); + instance$BuiltInRegistries$PARTICLE_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$ParticleType); + instance$BuiltInRegistries$ENTITY_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$EntityType); + instance$BuiltInRegistries$FLUID = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Fluid); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$ResourceLocation$fromNamespaceAndPath = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ResourceLocation, clazz$ResourceLocation, String.class, String.class + ) + ); + + public static final Object instance$Block$BLOCK_STATE_REGISTRY; + + static { + try { + Field field = ReflectionUtils.getDeclaredField(clazz$Block, clazz$IdMapper, 0); + assert field != null; + instance$Block$BLOCK_STATE_REGISTRY = field.get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$IdMapper$add = requireNonNull( + ReflectionUtils.getMethod( + clazz$IdMapper, void.class, Object.class + ) + ); + + public static final Class clazz$StateDefinition = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.StateDefinition"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockStateList") + ) + ); + + public static final Field field$Block$StateDefinition = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Block, clazz$StateDefinition, 0 + ) + ); + + public static final Field field$StateDefinition$states = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$StateDefinition, ImmutableList.class, 0 + ) + ); + + public static final Class clazz$MappedRegistry = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.MappedRegistry"), + BukkitReflectionUtils.assembleMCClass("core.RegistryMaterials") + ) + ); + + public static final Field field$MappedRegistry$frozen = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MappedRegistry, boolean.class, 0 + ) + ); + + public static final Method method$MappedRegistry$freeze = requireNonNull( + ReflectionUtils.getMethod( + clazz$MappedRegistry, clazz$Registry + ) + ); + + public static final Field field$MappedRegistry$byValue = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MappedRegistry, Map.class, 2 + ) + ); + + public static final Field field$MappedRegistry$unregisteredIntrusiveHolders = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MappedRegistry, Map.class, 5 + ) + ); + + public static final Class clazz$MapColor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.MapColor"), + BukkitReflectionUtils.assembleMCClass("world.level.material.MaterialMapColor") + ) + ); + + public static final Method method$MapColor$byId = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$MapColor, clazz$MapColor, int.class + ) + ); + + public static final Class clazz$PushReaction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.PushReaction"), + BukkitReflectionUtils.assembleMCClass("world.level.material.EnumPistonReaction") + ) + ); + + public static final Method method$PushReaction$values = requireNonNull( + ReflectionUtils.getMethod( + clazz$PushReaction, new String[] { "values" } + ) + ); + + public static final Class clazz$NoteBlockInstrument = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.NoteBlockInstrument"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.BlockPropertyInstrument") + ) + ); + + public static final Method method$NoteBlockInstrument$values = requireNonNull( + ReflectionUtils.getMethod( + clazz$NoteBlockInstrument, new String[] { "values" } + ) + ); + + public static final Class clazz$BlockStateBase = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$BlockStateBase"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase$BlockData") + ) + ); + + public static final Method method$BlockStateBase$initCache = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, void.class, new String[] { "initCache", "a" } + ) + ); + + public static final Field field$BlockStateBase$isRedstoneConductor = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$StatePredicate, 0 + ) + ); + + public static final Field field$BlockStateBase$isSuffocating = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$StatePredicate, 1 + ) + ); + + public static final Field field$BlockStateBase$isViewBlocking = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$StatePredicate, 2 + ) + ); + + public static final Field field$BlockStateBase$pushReaction = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$PushReaction, 0 + ) + ); + + public static final Field field$BlockStateBase$mapColor = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$MapColor, 0 + ) + ); + + public static final Field field$BlockStateBase$instrument = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$NoteBlockInstrument, 0 + ) + ); + + public static final Field field$BlockStateBase$hardness = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, float.class, 0 + ) + ); + + public static final Field field$BlockStateBase$burnable = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 2 + ) + ); + + public static final Field field$BlockStateBase$isRandomlyTicking = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 9 + ) + ); + + public static final Field field$BlockStateBase$canOcclude = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 6 + ) + ); + + public static final Field field$BlockStateBase$replaceable = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 8 + ) + ); + + public static final Field field$BlockStateBase$lightEmission = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, int.class, 0 + ) + ); + + public static final Class clazz$AABB = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.AABB"), + BukkitReflectionUtils.assembleMCClass("world.phys.AxisAlignedBB") + ) + ); + + public static final Field field$AABB$minX = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 0 + ) + ); + + public static final Field field$AABB$minY = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 1 + ) + ); + + public static final Field field$AABB$minZ = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 2 + ) + ); + + public static final Field field$AABB$maxX = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 3 + ) + ); + + public static final Field field$AABB$maxY = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 4 + ) + ); + + public static final Field field$AABB$maxZ = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 5 + ) + ); + + public static final Method method$Block$box = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Block, clazz$VoxelShape, double.class, double.class, double.class, double.class, double.class, double.class + ) + ); + + public static final Class clazz$BlockGetter = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.BlockGetter"), + BukkitReflectionUtils.assembleMCClass("world.level.IBlockAccess") + ) + ); + + public static final Class clazz$StateHolder = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.StateHolder"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.IBlockDataHolder") + ) + ); + + public static final Field field$StateHolder$owner = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$StateHolder, Object.class, 0 + ) + ); + + public static final Class clazz$CollisionContext = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.shapes.CollisionContext"), + BukkitReflectionUtils.assembleMCClass("world.phys.shapes.VoxelShapeCollision") + ) + ); + + public static final Method method$BlockBehaviour$getShape = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$VoxelShape, clazz$BlockState, clazz$BlockGetter, clazz$BlockPos, clazz$CollisionContext + ) + ); + + public static final Method method$BlockGetter$getBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockGetter, clazz$BlockState, clazz$BlockPos + ) + ); + + public static final Method method$LevelAccessor$scheduleTick = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelAccessor, void.class, clazz$BlockPos, clazz$Block, int.class + ) + ); + + public static final Method method$CraftBlock$setTypeAndData = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlock, boolean.class, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockState, clazz$BlockState, boolean.class + ) + ); + + public static final Class clazz$MappedRegistry$TagSet = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.MappedRegistry$TagSet") + //BukkitReflectionUtils.assembleMCClass("core.RegistryMaterials$TagSet") 1.21.2+ + ); + + public static final Field field$MappedRegistry$allTags = Optional.ofNullable(clazz$MappedRegistry$TagSet) + .map(it -> ReflectionUtils.getDeclaredField(clazz$MappedRegistry, it, 0)) + .orElse(null); + + public static final Method method$MappedRegistry$TagSet$unbound = Optional.ofNullable(clazz$MappedRegistry$TagSet) + .map(it -> ReflectionUtils.getStaticMethod(clazz$MappedRegistry$TagSet, clazz$MappedRegistry$TagSet)) + .orElse(null); + + public static final Method method$TagSet$forEach = Optional.ofNullable(clazz$MappedRegistry$TagSet) + .map(it -> ReflectionUtils.getDeclaredMethod(clazz$MappedRegistry$TagSet, void.class, BiConsumer.class)) + .orElse(null); + + public static final Method method$Holder$Reference$bingTags = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Holder$Reference, void.class, Collection.class + ) + ); + + public static final Class clazz$ClientboundLevelParticlesPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelParticlesPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutWorldParticles") + ) + ); + + public static final Constructor constructor$ClientboundLevelParticlesPacket = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getDeclaredConstructor(clazz$ClientboundLevelParticlesPacket, clazz$RegistryFriendlyByteBuf) : + ReflectionUtils.getConstructor(clazz$ClientboundLevelParticlesPacket, clazz$FriendlyByteBuf) + ); + + public static final Class clazz$ParticleOptions = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleOptions"), + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleParam") + ) + ); + + public static final Class clazz$BlockParticleOption = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.particles.BlockParticleOption"), + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleParamBlock") + ) + ); + + public static final Field field$ClientboundLevelParticlesPacket$particle = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelParticlesPacket, clazz$ParticleOptions, 0 + ) + ); + + public static final Field field$BlockParticleOption$blockState = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockParticleOption, clazz$BlockState, 0 + ) + ); + + public static final Class clazz$CraftMagicNumbers = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("util.CraftMagicNumbers") + ) + ); + + public static final Field field$CraftMagicNumbers$BLOCK_MATERIAL = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftMagicNumbers, "BLOCK_MATERIAL" + ) + ); + + public static final Field field$BlockBehaviour$properties = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour, clazz$BlockBehaviour$Properties, 0 + ) + ); + + public static final Field field$BlockBehaviour$explosionResistance = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour, float.class, 0 + ) + ); + + public static final Field field$BlockBehaviour$soundType = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour, clazz$SoundType, 0 + ) + ); + + public static final Field field$SoundType$breakSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 0 + ) + ); + + public static final Field field$SoundType$stepSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 1 + ) + ); + + public static final Field field$SoundType$placeSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 2 + ) + ); + + public static final Field field$SoundType$hitSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 3 + ) + ); + + public static final Field field$SoundType$fallSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 4 + ) + ); + + public static final Field field$SoundEvent$location = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, clazz$ResourceLocation, 0 + ) + ); + + public static final Field field$BlockBehaviour$Properties$hasCollision = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour$Properties, boolean.class, 0 + ) + ); + + public static final Class clazz$ClientboundLightUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLightUpdatePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutLightUpdate") + ) + ); + + public static final Class clazz$ChunkPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.ChunkPos"), + BukkitReflectionUtils.assembleMCClass("world.level.ChunkCoordIntPair") + ) + ); + + public static final Constructor constructor$ChunkPos = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ChunkPos, int.class, int.class + ) + ); + + public static final Class clazz$LevelLightEngine = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.lighting.LevelLightEngine") + ) + ); + + public static final Constructor constructor$ClientboundLightUpdatePacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundLightUpdatePacket, clazz$ChunkPos, clazz$LevelLightEngine, BitSet.class, BitSet.class + ) + ); + + public static final Class clazz$ChunkHolder = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ChunkHolder"), + BukkitReflectionUtils.assembleMCClass("server.level.PlayerChunk") + ) + ); + + public static final Class clazz$ChunkMap = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ChunkMap"), + BukkitReflectionUtils.assembleMCClass("server.level.PlayerChunkMap") + ) + ); + + public static final Method method$ChunkHolder$getPlayers = requireNonNull( + ReflectionUtils.getMethod( + clazz$ChunkHolder, List.class, boolean.class + ) + ); + + public static final Field field$ChunkHolder$lightEngine = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkHolder, clazz$LevelLightEngine, 0 + ) + ); + + public static final Field field$ChunkHolder$blockChangedLightSectionFilter = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkHolder, BitSet.class, 0 + ) + ); + + public static final Field field$ChunkHolder$skyChangedLightSectionFilter = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkHolder, BitSet.class, 1 + ) + ); + + public static final Method method$ChunkHolder$broadcast = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$ChunkHolder, void.class, List.class, clazz$Packet + ) + ); + + public static final Method method$ServerChunkCache$getVisibleChunkIfPresent = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$ServerChunkCache, clazz$ChunkHolder, long.class + ) + ); + + public static final Class clazz$LightLayer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LightLayer"), + BukkitReflectionUtils.assembleMCClass("world.level.EnumSkyBlock") + ) + ); + + public static final Method method$LightLayer$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$LightLayer, clazz$LightLayer.arrayType() + ) + ); + + public static final Object instance$LightLayer$BLOCK; + + static { + try { + instance$LightLayer$BLOCK = ((Object[]) method$LightLayer$values.invoke(null))[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$ChunkHolder$sectionLightChanged = requireNonNull( + VersionHelper.isVersionNewerThan1_21_2() ? + ReflectionUtils.getMethod(clazz$ChunkHolder, boolean.class, clazz$LightLayer, int.class) : + ReflectionUtils.getMethod(clazz$ChunkHolder, void.class, clazz$LightLayer, int.class) + ); + + public static final Class clazz$ServerboundPlayerActionPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPlayerActionPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInBlockDig") + ) + ); + + public static final Class clazz$ServerboundPlayerActionPacket$Action = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPlayerActionPacket$Action"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInBlockDig$EnumPlayerDigType") + ) + ); + + public static final Field field$ServerboundPlayerActionPacket$pos = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundPlayerActionPacket, clazz$BlockPos, 0 + ) + ); + + public static final Field field$ServerboundPlayerActionPacket$action = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundPlayerActionPacket, clazz$ServerboundPlayerActionPacket$Action, 0 + ) + ); + + public static final Method method$ServerboundPlayerActionPacket$Action$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ServerboundPlayerActionPacket$Action, clazz$ServerboundPlayerActionPacket$Action.arrayType() + ) + ); + + public static final Object instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK; + public static final Object instance$ServerboundPlayerActionPacket$Action$ABORT_DESTROY_BLOCK; + public static final Object instance$ServerboundPlayerActionPacket$Action$STOP_DESTROY_BLOCK; + + static { + try { + Object[] values = (Object[]) method$ServerboundPlayerActionPacket$Action$values.invoke(null); + instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK = values[0]; + instance$ServerboundPlayerActionPacket$Action$ABORT_DESTROY_BLOCK = values[1]; + instance$ServerboundPlayerActionPacket$Action$STOP_DESTROY_BLOCK = values[2]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Object instance$Holder$Attribute$block_break_speed; + public static final Object instance$Holder$Attribute$block_interaction_range; + + static { + try { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object block_break_speed = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_break_speed"); + @SuppressWarnings("unchecked") + Optional breakSpeedHolder = (Optional) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_break_speed); + instance$Holder$Attribute$block_break_speed = breakSpeedHolder.orElse(null); + + Object block_interaction_range = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_interaction_range"); + @SuppressWarnings("unchecked") + Optional blockInteractionRangeHolder = (Optional) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_interaction_range); + instance$Holder$Attribute$block_interaction_range = blockInteractionRangeHolder.orElse(null); + } else { + instance$Holder$Attribute$block_break_speed = null; + instance$Holder$Attribute$block_interaction_range = null; + } + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$ServerPlayer$getAttribute = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Holder) : + ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Attribute) + ); + + public static final Class clazz$ServerPlayerGameMode = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerPlayerGameMode"), + BukkitReflectionUtils.assembleMCClass("server.level.PlayerInteractManager") + ) + ); + + public static final Field field$ServerPlayer$gameMode = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayer, clazz$ServerPlayerGameMode, 0 + ) + ); + + public static final Field field$ServerPlayerGameMode$destroyProgressStart = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, int.class, 0 + ) + ); + + public static final Field field$ServerPlayerGameMode$gameTicks = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, int.class, 1 + ) + ); + + public static final Field field$ServerPlayerGameMode$delayedTickStart = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, int.class, 2 + ) + ); + + public static final Field field$ServerPlayerGameMode$isDestroyingBlock = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, boolean.class, 0 + ) + ); + + public static final Field field$ServerPlayerGameMode$hasDelayedDestroy = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, boolean.class, 1 + ) + ); + + public static final Method method$ServerPlayerGameMode$destroyBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerPlayerGameMode, boolean.class, clazz$BlockPos + ) + ); + + public static final Class clazz$Player = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.player.Player"), + BukkitReflectionUtils.assembleMCClass("world.entity.player.EntityHuman") + ) + ); + + public static final Class clazz$Entity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.Entity") + ) + ); + + public static final Field field$Entity$ENTITY_COUNTER = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Entity, AtomicInteger.class, 0 + ) + ); + + public static final AtomicInteger instance$Entity$ENTITY_COUNTER; + + static { + try { + instance$Entity$ENTITY_COUNTER = (AtomicInteger) requireNonNull(field$Entity$ENTITY_COUNTER.get(null)); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$Level = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.Level"), + BukkitReflectionUtils.assembleMCClass("world.level.World") + ) + ); + + public static final Method method$Entity$level = requireNonNull( + ReflectionUtils.getMethod( + clazz$Entity, clazz$Level + ) + ); + + public static final Method method$BlockStateBase$getDestroyProgress = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockStateBase, float.class, clazz$Player, clazz$BlockGetter, clazz$BlockPos + ) + ); + + public static final Class clazz$ClientboundBlockDestructionPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBlockDestructionPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBlockBreakAnimation") + ) + ); + + public static final Constructor constructor$ClientboundBlockDestructionPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundBlockDestructionPacket, int.class, clazz$BlockPos, int.class + ) + ); + + public static final Class clazz$ServerboundSwingPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundSwingPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInArmAnimation") + ) + ); + + public static final Class clazz$InteractionHand = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.InteractionHand"), + BukkitReflectionUtils.assembleMCClass("world.EnumHand") + ) + ); + + public static final Field field$ServerboundSwingPacket$hand = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundSwingPacket, clazz$InteractionHand, 0 + ) + ); + + public static final Method method$InteractionHand$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$InteractionHand, clazz$InteractionHand.arrayType() + ) + ); + + public static final Object instance$InteractionHand$MAIN_HAND; + public static final Object instance$InteractionHand$OFF_HAND; + + static { + try { + Object[] values = (Object[]) method$InteractionHand$values.invoke(null); + instance$InteractionHand$MAIN_HAND = values[0]; + instance$InteractionHand$OFF_HAND = values[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$Block$defaultBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$Block, clazz$BlockState + ) + ); + + public static final Class clazz$ServerboundInteractPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity") + ) + ); + + public static final Class clazz$ServerboundInteractPacket$Action = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$Action"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$EnumEntityUseAction") + ) + ); + + public static final Class clazz$ServerboundInteractPacket$InteractionAction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$InteractionAction"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$d") + ) + ); + + public static final Field field$ServerboundInteractPacket$InteractionAction$hand = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundInteractPacket$InteractionAction, clazz$InteractionHand, 0 + ) + ); + + public static final Class clazz$ServerboundInteractPacket$InteractionAtLocationAction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$InteractionAtLocationAction"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$e") + ) + ); + + public static final Field field$ServerboundInteractPacket$InteractionAtLocationAction$hand = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundInteractPacket$InteractionAtLocationAction, clazz$InteractionHand, 0 + ) + ); + + public static final Field field$ServerboundInteractPacket$InteractionAtLocationAction$location = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundInteractPacket$InteractionAtLocationAction, clazz$Vec3, 0 + ) + ); + + public static final Class clazz$ServerboundInteractPacket$ActionType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$ActionType"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$b") + ) + ); + + public static final Method method$ServerboundInteractPacket$ActionType$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ServerboundInteractPacket$ActionType, clazz$ServerboundInteractPacket$ActionType.arrayType() + ) + ); + + public static final Object instance$ServerboundInteractPacket$ActionType$INTERACT; + public static final Object instance$ServerboundInteractPacket$ActionType$ATTACK; + public static final Object instance$ServerboundInteractPacket$ActionType$INTERACT_AT; + + static { + try { + Object[] values = (Object[]) method$ServerboundInteractPacket$ActionType$values.invoke(null); + instance$ServerboundInteractPacket$ActionType$INTERACT = values[0]; + instance$ServerboundInteractPacket$ActionType$ATTACK = values[1]; + instance$ServerboundInteractPacket$ActionType$INTERACT_AT = values[2]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Field field$ServerboundInteractPacket$entityId = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ServerboundInteractPacket, int.class, 0 + ) + ); + + public static final Field field$ServerboundInteractPacket$usingSecondaryAction = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ServerboundInteractPacket, boolean.class, 0 + ) + ); + + public static final Field field$ServerboundInteractPacket$action = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ServerboundInteractPacket, clazz$ServerboundInteractPacket$Action, 0 + ) + ); + + public static final Method method$ServerboundInteractPacket$Action$getType = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$ServerboundInteractPacket$Action, clazz$ServerboundInteractPacket$ActionType + ) + ); + + public static final Class clazz$ClientboundUpdateMobEffectPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundUpdateMobEffectPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityEffect") + ) + ); + + public static final Class clazz$ClientboundRemoveMobEffectPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRemoveMobEffectPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutRemoveEntityEffect") + ) + ); + + public static final Object instance$MobEffecr$mining_fatigue; + public static final Object instance$MobEffecr$haste; + + // for 1.20.1-1.20.4 + static { + try { + Object mining_fatigue = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "mining_fatigue"); + instance$MobEffecr$mining_fatigue = method$Registry$get.invoke(instance$BuiltInRegistries$MOB_EFFECT, mining_fatigue); + Object haste = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "haste"); + instance$MobEffecr$haste = method$Registry$get.invoke(instance$BuiltInRegistries$MOB_EFFECT, haste); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Object allocateClientboundUpdateMobEffectPacketInstance() throws InstantiationException { + return UNSAFE.allocateInstance(clazz$ClientboundUpdateMobEffectPacket); + } + + public static final Constructor constructor$ClientboundRemoveMobEffectPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundRemoveMobEffectPacket, 0 + ) + ); + + public static final Constructor constructor$ClientboundUpdateMobEffectPacket = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateMobEffectPacket, int.class, clazz$MobEffectInstance + ) : + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateMobEffectPacket, int.class, clazz$MobEffectInstance, boolean.class + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$entityId = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$effect = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, clazz$MobEffect, 0 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, clazz$Holder, 0 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$amplifier = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, byte.class, 0 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$duration = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 1 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 2 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$flags = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, byte.class, 1 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, byte.class, 0 + ) + ); + + public static final Method method$ServerPlayer$getEffect = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getMethod( + clazz$ServerPlayer, clazz$MobEffectInstance, clazz$MobEffect + ) : + ReflectionUtils.getMethod( + clazz$ServerPlayer, clazz$MobEffectInstance, clazz$Holder + ) + ); + + public static final Object instance$SoundEvent$EMPTY; + + static { + try { + Object key = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "intentionally_empty"); + instance$SoundEvent$EMPTY = method$Registry$get.invoke(instance$BuiltInRegistries$SOUND_EVENT, key); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$Entity$getOnPos = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Entity, clazz$BlockPos, float.class + ) + ); + + // 1.21.4+ + public static final Class clazz$ServerboundPickItemFromBlockPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPickItemFromBlockPacket") + ); + + public static final Field field$ServerboundPickItemFromBlockPacket$pos = Optional.ofNullable(clazz$ServerboundPickItemFromBlockPacket) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$BlockPos, 0)) + .orElse(null); + + public static final Class clazz$ServerboundSetCreativeModeSlotPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundSetCreativeModeSlotPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInSetCreativeSlot") + ) + ); + + public static final Field field$ServerboundSetCreativeModeSlotPacket$slotNum = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getDeclaredField( + clazz$ServerboundSetCreativeModeSlotPacket, short.class, 0 + ) : + ReflectionUtils.getDeclaredField( + clazz$ServerboundSetCreativeModeSlotPacket, int.class, 0 + ) + ); + + public static final Class clazz$ItemStack = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.ItemStack") + ) + ); + + public static final Field field$ServerboundSetCreativeModeSlotPacket$itemStack = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundSetCreativeModeSlotPacket, clazz$ItemStack, 0 + ) + ); + + public static final Class clazz$CraftItemStack = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftItemStack") + ) + ); + + public static final Method method$CraftItemStack$asCraftMirror = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftItemStack, new String[]{"asCraftMirror"}, clazz$CraftItemStack, clazz$ItemStack + ) + ); + + public static final Method method$CraftItemStack$asNMSMirror = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftItemStack, new String[]{"asNMSCopy"}, clazz$ItemStack, ItemStack.class + ) + ); + + public static final Field field$Holder$Reference$tags = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Holder$Reference, Set.class, 0 + ) + ); + + public static final Class clazz$TagKey = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("tags.TagKey") + ) + ); + + public static final Field field$TagKey$location = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$TagKey, clazz$ResourceLocation, 0 + ) + ); + + public static final Method method$TagKey$create = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$TagKey, clazz$TagKey, clazz$ResourceKey, clazz$ResourceLocation + ) + ); + + public static final Class clazz$ItemEnchantments = + ReflectionUtils.getClazz( + "world.item.enchantment.ItemEnchantments" + ); + + public static final Class clazz$Enchantment = + ReflectionUtils.getClazz( + "world.item.enchantment.Enchantment" + ); + + public static final Method method$ItemEnchantments$entrySet = Optional.ofNullable(clazz$ItemEnchantments) + .map(it -> ReflectionUtils.getMethod(it, new String[] {"entrySet"})) + .orElse(null); + + public static final Field field$Direction$data3d = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Direction, int.class, 0 + ) + ); + + public static final Field field$Holder$Reference$value = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Holder$Reference, Object.class, 0 + ) + ); + + // 1.21.3+ + public static final Class clazz$ScheduledTickAccess = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.ScheduledTickAccess") + ); + + public static final Class clazz$RandomSource = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("util.RandomSource") + ) + ); + + public static final Method method$BlockBehaviour$updateShape = requireNonNull( + VersionHelper.isVersionNewerThan1_21_2() ? + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$BlockState, clazz$BlockState, clazz$LevelReader, clazz$ScheduledTickAccess, clazz$BlockPos, clazz$Direction, clazz$BlockPos, clazz$BlockState, clazz$RandomSource + ) : + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$BlockState, clazz$BlockState, clazz$Direction, clazz$BlockState, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockPos + ) + ); + + public static final Class clazz$Fallable = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.Fallable") + ) + ); + + public static final Class clazz$FallingBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.FallingBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.BlockFalling") + ) + ); + + public static final Method method$FallingBlock$isFree = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$FallingBlock, boolean.class, clazz$BlockState + ) + ); + + public static final Class clazz$FallingBlockEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.item.FallingBlockEntity"), + BukkitReflectionUtils.assembleMCClass("world.entity.item.EntityFallingBlock") + ) + ); + + public static final Method method$FallingBlockEntity$fall = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$FallingBlockEntity, clazz$FallingBlockEntity, clazz$Level, clazz$BlockPos, clazz$BlockState + ) + ); + + public static final Method method$FallingBlockEntity$setHurtsEntities = requireNonNull( + ReflectionUtils.getMethod( + clazz$FallingBlockEntity, void.class, float.class, int.class + ) + ); + + public static final Field field$ServerLevel$uuid = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerLevel, UUID.class, 0 + ) + ); + + public static final Field field$FallingBlockEntity$blockState = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$FallingBlockEntity, clazz$BlockState, 0 + ) + ); + + public static final Field field$FallingBlockEntity$cancelDrop = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$FallingBlockEntity, boolean.class, 1 + ) + ); + + public static final Method method$Level$getCraftWorld = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, clazz$CraftWorld + ) + ); + + public static final Field field$Entity$xo = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Entity, double.class, 0 + ) + ); + + public static final Field field$Entity$yo = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Entity, double.class, 1 + ) + ); + + public static final Field field$Entity$zo = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Entity, double.class, 2 + ) + ); + + public static final Object instance$Blocks$AIR; + public static final Object instance$Blocks$AIR$defaultState; + public static final Object instance$Blocks$STONE; + public static final Object instance$Blocks$STONE$defaultState; + public static final Object instance$Blocks$FIRE; + + static { + try { + Object air = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "air"); + instance$Blocks$AIR = method$Registry$get.invoke(instance$BuiltInRegistries$BLOCK, air); + instance$Blocks$AIR$defaultState = method$Block$defaultBlockState.invoke(instance$Blocks$AIR); + Object fire = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "fire"); + instance$Blocks$FIRE = method$Registry$get.invoke(instance$BuiltInRegistries$BLOCK, fire); + Object stone = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "stone"); + instance$Blocks$STONE = method$Registry$get.invoke(instance$BuiltInRegistries$BLOCK, stone); + instance$Blocks$STONE$defaultState = method$Block$defaultBlockState.invoke(instance$Blocks$STONE); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$BlockStateBase$hasTag = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, boolean.class, clazz$TagKey + ) + ); + + public static final Method method$Level$removeBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, boolean.class, clazz$BlockPos, boolean.class + ) + ); + + public static final Class clazz$MutableBlockPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.BlockPos$MutableBlockPos"), + BukkitReflectionUtils.assembleMCClass("core.BlockPosition$MutableBlockPosition") + ) + ); + + public static final Constructor constructor$MutableBlockPos = requireNonNull( + ReflectionUtils.getConstructor( + clazz$MutableBlockPos + ) + ); + + public static final Method method$MutableBlockPos$setWithOffset = requireNonNull( + ReflectionUtils.getMethod( + clazz$MutableBlockPos, clazz$MutableBlockPos, clazz$Vec3i, clazz$Direction + ) + ); + + public static final Class clazz$LeavesBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.LeavesBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.BlockLeaves") + ) + ); + + public static final Class clazz$IntegerProperty = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.IntegerProperty"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.BlockStateInteger") + ) + ); + + public static final Class clazz$Property = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.Property"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.IBlockState") + ) + ); + + public static final Field field$LeavesBlock$DISTANCE = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LeavesBlock, clazz$IntegerProperty, 0 + ) + ); + + public static final Method method$StateHolder$hasProperty = requireNonNull( + ReflectionUtils.getMethod( + clazz$StateHolder, boolean.class, clazz$Property + ) + ); + + public static final Method method$StateHolder$getValue = requireNonNull( + ReflectionUtils.getMethod( + clazz$StateHolder, Object.class, new String[] {"getValue", "c"}, clazz$Property + ) + ); + + public static final Method method$Level$setBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, boolean.class, clazz$BlockPos, clazz$BlockState, int.class + ) + ); + + public static final Method method$Block$updateFromNeighbourShapes = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Block, clazz$BlockState, clazz$BlockState, clazz$LevelAccessor, clazz$BlockPos + ) + ); + + public static final Method method$BlockStateBase$updateNeighbourShapes = requireNonNull( + ReflectionUtils.getMethod( + // flags // depth + clazz$BlockStateBase, void.class, clazz$LevelAccessor, clazz$BlockPos, int.class, int.class + ) + ); + + public static final Method method$messageToByteEncoder$encode = requireNonNull( + ReflectionUtils.getDeclaredMethod( + MessageToByteEncoder.class, void.class, ChannelHandlerContext.class, Object.class, ByteBuf.class + ) + ); + + public static final Method method$byteToMessageDecoder$decode = requireNonNull( + ReflectionUtils.getDeclaredMethod( + ByteToMessageDecoder.class, void.class, ChannelHandlerContext.class, ByteBuf.class, List.class + ) + ); + + public static final Class clazz$ClientboundRespawnPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRespawnPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutRespawn") + ) + ); + + public static final Class clazz$ClientboundLoginPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLoginPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutLogin") + ) + ); + + // 1.20 + public static final Field field$ClientboundRespawnPacket$dimension = + ReflectionUtils.getDeclaredField( + clazz$ClientboundRespawnPacket, clazz$ResourceKey, 1 + ); + + // 1.20 + public static final Field field$ClientboundLoginPacket$dimension = + ReflectionUtils.getDeclaredField( + clazz$ClientboundLoginPacket, clazz$ResourceKey, 1 + ); + + // 1.20.2+ + public static final Class clazz$CommonPlayerSpawnInfo = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.CommonPlayerSpawnInfo") + ); + + // 1.20.2+ + public static final Field field$ClientboundRespawnPacket$commonPlayerSpawnInfo = Optional.ofNullable(clazz$CommonPlayerSpawnInfo) + .map(it -> ReflectionUtils.getDeclaredField(clazz$ClientboundRespawnPacket, it, 0)) + .orElse(null); + + // 1.20.2+ + public static final Field field$CommonPlayerSpawnInfo$dimension = Optional.ofNullable(clazz$CommonPlayerSpawnInfo) + .map(it -> { + if (VersionHelper.isVersionNewerThan1_20_5()) { + return ReflectionUtils.getDeclaredField(it, clazz$ResourceKey, 0); + } else { + return ReflectionUtils.getDeclaredField(it, clazz$ResourceKey, 1); + } + }) + .orElse(null); + + // 1.20.2+ + public static final Field field$ClientboundLoginPacket$commonPlayerSpawnInfo = Optional.ofNullable(clazz$CommonPlayerSpawnInfo) + .map(it -> ReflectionUtils.getDeclaredField(clazz$ClientboundLoginPacket, it, 0)) + .orElse(null); + + // 1.20-1.20.4 + public static final Method method$Packet$write = + ReflectionUtils.getMethod( + clazz$Packet, void.class, clazz$FriendlyByteBuf + ); + + // 1.20.5+ + public static final Method method$ClientboundLevelParticlesPacket$write = Optional.ofNullable(clazz$RegistryFriendlyByteBuf) + .map(it -> ReflectionUtils.getDeclaredMethod(clazz$ClientboundLevelParticlesPacket, void.class, it)) + .orElse(null); + + public static final Object instance$EntityType$TEXT_DISPLAY; + public static final Object instance$EntityType$ITEM_DISPLAY; + public static final Object instance$EntityType$FALLING_BLOCK; + public static final Object instance$EntityType$INTERACTION; + + static { + try { + Object textDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "text_display"); + instance$EntityType$TEXT_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, textDisplay); + Object itemDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "item_display"); + instance$EntityType$ITEM_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, itemDisplay); + Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block"); + instance$EntityType$FALLING_BLOCK = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock); + Object interaction = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "interaction"); + instance$EntityType$INTERACTION = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, interaction); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$BlockState$getShape = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, clazz$VoxelShape, new String[]{"getShape", "a"}, clazz$BlockGetter, clazz$BlockPos, clazz$CollisionContext + ) + ); + + public static final Method method$VoxelShape$bounds = requireNonNull( + ReflectionUtils.getMethod( + clazz$VoxelShape, clazz$AABB + ) + ); + + public static final Method method$LevelWriter$setBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelWriter, boolean.class, clazz$BlockPos, clazz$BlockState, int.class + ) + ); + + public static final Method method$CollisionContext$of = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CollisionContext, clazz$CollisionContext, clazz$Entity + ) + ); + + public static final Method method$CollisionContext$empty = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CollisionContext, clazz$CollisionContext + ) + ); + + public static final Method method$ServerLevel$checkEntityCollision = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerLevel, boolean.class, clazz$BlockState, clazz$Entity, clazz$CollisionContext, clazz$BlockPos, boolean.class + ) + ); + + public static final Method method$BlockStateBase$canSurvive = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, boolean.class, clazz$LevelReader, clazz$BlockPos + ) + ); + + public static final Method method$BlockStateBase$onPlace = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, void.class, clazz$Level, clazz$BlockPos, clazz$BlockState, boolean.class + ) + ); + + public static final Method method$ItemStack$isTag = requireNonNull( + ReflectionUtils.getMethod( + clazz$ItemStack, boolean.class, clazz$TagKey + ) + ); + + public static final Class clazz$FireBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.FireBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.BlockFire") + ) + ); + + public static final Method method$FireBlock$setFlammable = requireNonNull( + Optional.ofNullable(ReflectionUtils.getMethod( + clazz$FireBlock, void.class, clazz$Block, int.class, int.class + )).orElse(ReflectionUtils.getDeclaredMethod( + clazz$FireBlock, void.class, clazz$Block, int.class, int.class) + ) + ); + + public static final Field field$LevelChunkSection$states = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LevelChunkSection, clazz$PalettedContainer, 0 + ) + ); + + public static final Constructor constructor$ItemStack = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ItemStack, clazz$ItemLike + ) + ); + + public static final Object instance$Items$AIR; + public static final Object instance$ItemStack$Air; + + static { + try { + Object air = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "air"); + instance$Items$AIR = method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ITEM, air); + instance$ItemStack$Air = constructor$ItemStack.newInstance(instance$Items$AIR); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$Registry$SimpleRegistry = requireNonNull( + ReflectionUtils.getClazz( + "org.bukkit.Registry$SimpleRegistry" + ) + ); + + public static final Field field$Registry$SimpleRegistry$map = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Registry$SimpleRegistry, Map.class, 0 + ) + ); + + public static final Class clazz$Display$ItemDisplay = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.Display$ItemDisplay") + ) + ); + + // 1.21.3+ + public static final Class clazz$ClientboundEntityPositionSyncPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundEntityPositionSyncPacket") + ); + + public static final Field field$ClientboundEntityPositionSyncPacket$id = Optional.ofNullable(clazz$ClientboundEntityPositionSyncPacket) + .map(it -> ReflectionUtils.getInstanceDeclaredField(it, int.class, 0)) + .orElse(null); + + public static final Class clazz$ClientboundMoveEntityPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundMoveEntityPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntity") + ) + ); + + public static final Field field$ClientboundMoveEntityPacket$entityId = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundMoveEntityPacket, int.class, 0 + ) + ); + + public static final Class clazz$ClientboundMoveEntityPacket$Pos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundMoveEntityPacket$Pos"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntity$PacketPlayOutRelEntityMove") + ) + ); + + public static final Class clazz$ServerboundUseItemOnPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundUseItemOnPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseItem") + ) + ); + + @SuppressWarnings("deprecation") + public static final Method method$World$spawnEntity = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getMethod(World.class, Entity.class, Location.class, EntityType.class, CreatureSpawnEvent.SpawnReason.class, Consumer.class) : + ReflectionUtils.getMethod(World.class, Entity.class, Location.class, EntityType.class, CreatureSpawnEvent.SpawnReason.class, org.bukkit.util.Consumer.class) + ); + + // 1.21.4+ + public static final Class clazz$ServerboundPickItemFromEntityPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPickItemFromEntityPacket") + ); + + public static final Field field$ServerboundPickItemFromEntityPacket$id = Optional.ofNullable(clazz$ServerboundPickItemFromEntityPacket) + .map(it -> ReflectionUtils.getInstanceDeclaredField(it, int.class, 0)) + .orElse(null); + + public static final Class clazz$ClientboundSoundPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSoundPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutNamedSoundEffect") + ) + ); + + public static final Class clazz$SoundSource = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("sounds.SoundSource"), + BukkitReflectionUtils.assembleMCClass("sounds.SoundCategory") + ) + ); + + public static final Constructor constructor$ClientboundSoundPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundSoundPacket, clazz$Holder, clazz$SoundSource, double.class, double.class, double.class, float.class, float.class, long.class + ) + ); + + public static final Field field$ClientboundSoundPacket$sound = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, clazz$Holder, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$source = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, clazz$SoundSource, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$x = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$y = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundSoundPacket$z = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, int.class, 2 + ) + ); + + public static final Field field$ClientboundSoundPacket$volume = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, float.class, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$pitch = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, float.class, 1 + ) + ); + + public static final Field field$ClientboundSoundPacket$seed = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, long.class, 0 + ) + ); + + public static final Method method$CraftEventFactory$callBlockPlaceEvent = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftEventFactory, BlockPlaceEvent.class, clazz$ServerLevel, clazz$Player, clazz$InteractionHand, BlockState.class, int.class, int.class, int.class + ) + ); + + public static final Class clazz$Abilities = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.player.Abilities"), + BukkitReflectionUtils.assembleMCClass("world.entity.player.PlayerAbilities") + ) + ); + + public static final Field field$Abilities$invulnerable = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 0 + ) + ); + + public static final Field field$Abilities$flying = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 1 + ) + ); + + public static final Field field$Abilities$mayfly = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 2 + ) + ); + + public static final Field field$Abilities$instabuild = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 3 + ) + ); + + public static final Field field$Abilities$mayBuild = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 4 + ) + ); + + public static final Field field$Player$abilities = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Player, clazz$Abilities, 0 + ) + ); + + public static final Class clazz$CraftEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("entity.CraftEntity") + ) + ); + + public static final Field field$CraftEntity$entity = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftEntity, clazz$Entity, 0 + ) + ); + + public static final Object instance$Fluids$WATER; + + static { + try { + Object waterId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "water"); + instance$Fluids$WATER = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, waterId); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$FlowingFluid = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.FlowingFluid"), + BukkitReflectionUtils.assembleMCClass("world.level.material.FluidTypeFlowing") + ) + ); + + public static final Method method$FlowingFluid$getSource = requireNonNull( + ReflectionUtils.getMethod( + clazz$FlowingFluid, clazz$FluidState, boolean.class + ) + ); + + public static final Method method$Level$getFluidState = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, clazz$FluidState, clazz$BlockPos + ) + ); + + public static final Method method$FluidState$isSource = requireNonNull( + ReflectionUtils.getMethod( + clazz$FluidState, boolean.class, new String[]{"isSource", "b"} + ) + ); + + public static final Class clazz$FileToIdConverter = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("resources.FileToIdConverter") + ) + ); + + public static final Method method$FileToIdConverter$json = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$FileToIdConverter, clazz$FileToIdConverter, String.class + ) + ); + + public static final Class clazz$ResourceManager = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.resources.IResourceManager"), + BukkitReflectionUtils.assembleMCClass("server.packs.resources.ResourceManager") + ) + ); + + public static final Method method$FileToIdConverter$listMatchingResources = requireNonNull( + ReflectionUtils.getMethod( + clazz$FileToIdConverter, Map.class, new String[]{"listMatchingResources", "a"}, clazz$ResourceManager + ) + ); + + public static final Class clazz$Resource = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.resources.IResource"), + BukkitReflectionUtils.assembleMCClass("server.packs.resources.Resource") + ) + ); + + public static final Method method$Resource$openAsReader = requireNonNull( + ReflectionUtils.getMethod( + clazz$Resource, BufferedReader.class + ) + ); + + public static final Class clazz$MultiPackResourceManager = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.resources.MultiPackResourceManager"), + BukkitReflectionUtils.assembleMCClass("server.packs.resources.ResourceManager") + ) + ); + + public static final Class clazz$PackType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.PackType"), + BukkitReflectionUtils.assembleMCClass("server.packs.EnumResourcePackType") + ) + ); + + public static final Method method$PackType$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$PackType, clazz$PackType.arrayType() + ) + ); + + public static final Object instance$PackType$SERVER_DATA; + + static { + try { + Object[] values = (Object[]) method$PackType$values.invoke(null); + instance$PackType$SERVER_DATA = values[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$PackRepository = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.repository.ResourcePackRepository"), + BukkitReflectionUtils.assembleMCClass("server.packs.repository.PackRepository") + ) + ); + + public static final Method method$MinecraftServer$getPackRepository = requireNonNull( + ReflectionUtils.getMethod( + clazz$MinecraftServer, clazz$PackRepository + ) + ); + + public static final Field field$PackRepository$selected = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$PackRepository, List.class, 0 + ) + ); + + public static final Class clazz$Pack = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.repository.ResourcePackLoader"), + BukkitReflectionUtils.assembleMCClass("server.packs.repository.Pack") + ) + ); + + public static final Method method$PackRepository$getPack = requireNonNull( + ReflectionUtils.getMethod( + clazz$PackRepository, clazz$Pack, String.class + ) + ); + + public static final Method method$Pack$getId = requireNonNull( + ReflectionUtils.getMethod( + clazz$Pack, String.class + ) + ); + + public static final Method method$MinecraftServer$reloadResources = requireNonNull( + ReflectionUtils.getMethod( + clazz$MinecraftServer, CompletableFuture.class, Collection.class + ) + ); + + public static final Class clazz$PackResources = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.PackResources"), + BukkitReflectionUtils.assembleMCClass("server.packs.IResourcePack") + ) + ); + + public static final Method method$Pack$open = requireNonNull( + ReflectionUtils.getMethod( + clazz$Pack, clazz$PackResources + ) + ); + + public static final Constructor constructor$MultiPackResourceManager = requireNonNull( + ReflectionUtils.getConstructor( + clazz$MultiPackResourceManager, clazz$PackType, List.class + ) + ); + + public static final Class clazz$InventoryView = requireNonNull( + ReflectionUtils.getClazz( + "org.bukkit.inventory.InventoryView" + ) + ); + + public static final Method method$InventoryView$getPlayer = requireNonNull( + ReflectionUtils.getMethod( + clazz$InventoryView, HumanEntity.class + ) + ); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java new file mode 100644 index 000000000..52390c0bf --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.util; + +public class RegistryUtils { + + private RegistryUtils() {} + + public static int currentBlockRegistrySize() { + try { + return (int) Reflections.method$IdMapper$size.invoke(Reflections.instance$BLOCK_STATE_REGISTRY); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static int currentBiomeRegistrySize() { + try { + Object idMap = Reflections.method$Registry$asHolderIdMap.invoke(Reflections.instance$BuiltInRegistries$BIOME); + return (int) Reflections.method$IdMap$size.invoke(idMap); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java new file mode 100644 index 000000000..74e4c4b3f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.block.BlockSounds; +import net.momirealms.craftengine.core.util.Key; + +public class SoundUtils { + + public static Object toSoundType(BlockSounds sounds) throws ReflectiveOperationException { + return Reflections.constructor$SoundType.newInstance( + 1f, 1f, + getOrRegisterSoundEvent(sounds.breakSound()), + getOrRegisterSoundEvent(sounds.stepSound()), + getOrRegisterSoundEvent(sounds.placeSound()), + getOrRegisterSoundEvent(sounds.hitSound()), + getOrRegisterSoundEvent(sounds.fallSound()) + ); + } + + public static Object getOrRegisterSoundEvent(Key key) throws ReflectiveOperationException { + return Reflections.method$SoundEvent$createVariableRangeEvent.invoke(null, + Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value()) + ); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java new file mode 100644 index 000000000..be7f62267 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/WorldUtils.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.world.SectionPos; +import org.bukkit.World; + +public class WorldUtils { + + public static int getSectionCount(World world) { + int min = SectionPos.blockToSectionCoord(world.getMinHeight()); + int max = SectionPos.blockToSectionCoord(world.getMaxHeight() - 1) + 1; + return max - min; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java new file mode 100644 index 000000000..6c886d116 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.util.LightUtils; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.SectionPosUtils; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.World; + +public class BukkitCEWorld extends CEWorld { + + public BukkitCEWorld(World world) { + super(world); + } + + @Override + public void tick() { + if (ConfigManager.enableLightSystem()) { + LightUtils.updateChunkLight((org.bukkit.World) world.getHandle(), SectionPosUtils.toMap(super.updatedSectionPositions, world.worldHeight().getMinSection() - 1, world.worldHeight().getMaxSection() + 1)); + super.updatedSectionPositions.clear(); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java new file mode 100644 index 000000000..59461f0d8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -0,0 +1,75 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.core.world.WorldBlock; +import net.momirealms.craftengine.core.world.WorldHeight; +import org.bukkit.Location; +import org.bukkit.SoundCategory; +import org.bukkit.inventory.ItemStack; + +import java.lang.ref.WeakReference; +import java.nio.file.Path; +import java.util.UUID; + +public class BukkitWorld implements World { + private final WeakReference world; + private WorldHeight worldHeight; + + public BukkitWorld(org.bukkit.World world) { + this.world = new WeakReference<>(world); + } + + @Override + public org.bukkit.World getHandle() { + return world.get(); + } + + @Override + public WorldHeight worldHeight() { + if (this.worldHeight == null) { + this.worldHeight = WorldHeight.create(getHandle().getMinHeight(), getHandle().getMaxHeight() - getHandle().getMinHeight()); + } + return this.worldHeight; + } + + @Override + public WorldBlock getBlockAt(int x, int y, int z) { + return new BukkitWorldBlock(getHandle().getBlockAt(x, y, z)); + } + + @Override + public String name() { + return getHandle().getName(); + } + + @Override + public Path directory() { + return getHandle().getWorldFolder().toPath(); + } + + @Override + public UUID uuid() { + return getHandle().getUID(); + } + + @Override + public void dropItemNaturally(Vec3d location, Item item) { + ItemStack itemStack = (ItemStack) item.load(); + if (ItemUtils.isEmpty(itemStack)) return; + if (VersionHelper.isVersionNewerThan1_21_2()) { + getHandle().dropItemNaturally(new Location(null, location.x(), location.y(), location.z()), (ItemStack) item.getItem()); + } else { + getHandle().dropItemNaturally(new Location(null, location.x() - 0.5, location.y() - 0.5, location.z() - 0.5), (ItemStack) item.getItem()); + } + } + + @Override + public void playBlockSound(Vec3d location, Key sound, float volume, float pitch) { + getHandle().playSound(new Location(null, location.x(), location.y(), location.z()), sound.toString(), SoundCategory.BLOCKS, volume, pitch); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java new file mode 100644 index 000000000..e801b1570 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java @@ -0,0 +1,67 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.WorldBlock; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import java.util.Optional; + +public class BukkitWorldBlock implements WorldBlock { + private final Block block; + + public BukkitWorldBlock(Block block) { + this.block = block; + } + + @SuppressWarnings("unchecked") + @Override + public boolean canBeReplaced(BlockPlaceContext context) { + ImmutableBlockState customState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (customState != null && !customState.isEmpty()) { + Key clickedBlockId = customState.owner().value().id(); + Item item = (Item) context.getPlayer().getItemInHand(context.getHand()); + Optional> customItem = BukkitItemManager.instance().getCustomItem(item.id()); + if (customItem.isPresent()) { + CustomItem custom = customItem.get(); + if (custom.behavior() instanceof BlockItemBehavior blockItemBehavior) { + Key blockId = blockItemBehavior.blockId(); + if (blockId.equals(clickedBlockId)) { + return false; + } + } + } + } + return block.isReplaceable(); + } + + @Override + public boolean isWaterSource(BlockPlaceContext blockPlaceContext) { + try { + Location location = block.getLocation(); + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(block.getWorld()); + Object fluidData = Reflections.method$Level$getFluidState.invoke(serverLevel, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); + if (fluidData == null) return false; + return (boolean) Reflections.method$FluidState$isSource.invoke(fluidData); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to check if water source is available", e); + return false; + } + } + + public Block block() { + return block; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java new file mode 100644 index 000000000..2977c314f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -0,0 +1,281 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.SectionPos; +import net.momirealms.craftengine.core.world.WorldManager; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.craftengine.core.world.chunk.serialization.ChunkSerializer; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class BukkitWorldManager implements WorldManager, Listener { + private static BukkitWorldManager instance; + private final BukkitCraftEngine plugin; + private final Map worlds; + private CEWorld[] worldArray; + private final ReentrantReadWriteLock worldMapLock = new ReentrantReadWriteLock(); + private SchedulerTask tickTask; + // cache + private UUID lastVisitedUUID; + private CEWorld lastVisitedWorld; + + public BukkitWorldManager(BukkitCraftEngine plugin) { + instance = this; + this.plugin = plugin; + this.worlds = new HashMap<>(); + resetWorldArray(); + } + + public static BukkitWorldManager instance() { + return instance; + } + + public CEWorld getWorld(World world) { + return getWorld(world.getUID()); + } + + @Override + public CEWorld getWorld(UUID uuid) { + if (uuid.equals(this.lastVisitedUUID)) { + return this.lastVisitedWorld; + } + this.worldMapLock.readLock().lock(); + try { + CEWorld world = worlds.get(uuid); + if (world != null) { + this.lastVisitedUUID = uuid; + this.lastVisitedWorld = world; + } + return world; + } finally { + this.worldMapLock.readLock().unlock(); + } + } + + private void resetWorldArray() { + this.worldArray = this.worlds.values().toArray(new CEWorld[0]); + } + + public void delayedLoad() { + this.worldMapLock.writeLock().lock(); + try { + for (World world : Bukkit.getWorlds()) { + CEWorld ceWorld = new BukkitCEWorld(new BukkitWorld(world)); + this.worlds.put(world.getUID(), ceWorld); + this.resetWorldArray(); + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkLoad(ceWorld, chunk); + } + } + } finally { + this.worldMapLock.writeLock().unlock(); + } + } + + @Override + public void load() { + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + this.tickTask = plugin.scheduler().sync().runRepeating(() -> { + for (CEWorld world : worldArray) { + world.tick(); + } + }, 1, 1); + } + + @Override + public void unload() { + HandlerList.unregisterAll(this); + if (tickTask != null && !tickTask.cancelled()) { + tickTask.cancel(); + } + } + + @Override + public void disable() { + for (World world : Bukkit.getWorlds()) { + CEWorld ceWorld = getWorld(world.getUID()); + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkUnload(ceWorld, chunk); + } + } + this.worlds.clear(); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onWorldLoad(WorldLoadEvent event) { + World world = event.getWorld(); + CEWorld ceWorld = new BukkitCEWorld(new BukkitWorld(world)); + this.worldMapLock.writeLock().lock(); + try { + if (this.worlds.containsKey(world.getUID())) return; + this.worlds.put(event.getWorld().getUID(), ceWorld); + this.resetWorldArray(); + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkLoad(ceWorld, chunk); + } + } finally { + this.worldMapLock.writeLock().unlock(); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onWorldUnload(WorldUnloadEvent event) { + World world = event.getWorld(); + CEWorld ceWorld; + this.worldMapLock.writeLock().lock(); + try { + ceWorld = this.worlds.remove(world.getUID()); + if (ceWorld == null) { + return; + } + if (ceWorld == this.lastVisitedWorld) { + this.lastVisitedWorld = null; + this.lastVisitedUUID = null; + } + this.resetWorldArray(); + } finally { + this.worldMapLock.writeLock().unlock(); + } + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkUnload(ceWorld, chunk); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onChunkLoad(ChunkLoadEvent event) { + this.worldMapLock.readLock().lock(); + CEWorld world; + try { + world = worlds.get(event.getWorld().getUID()); + if (world == null) { + return; + } + } finally { + this.worldMapLock.readLock().unlock(); + } + handleChunkLoad(world, event.getChunk()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onChunkUnload(ChunkUnloadEvent event) { + CEWorld world; + this.worldMapLock.readLock().lock(); + try { + world = worlds.get(event.getWorld().getUID()); + if (world == null) { + return; + } + } finally { + this.worldMapLock.readLock().unlock(); + } + handleChunkUnload(world, event.getChunk()); + } + + private void handleChunkUnload(CEWorld world, Chunk chunk) { + ChunkPos pos = new ChunkPos(chunk.getX(), chunk.getZ()); + CEChunk ceChunk = world.getChunkAtIfLoaded(chunk.getX(), chunk.getZ()); + if (ceChunk != null) { + try { + world.worldDataStorage().writeChunkTagAt(pos, ChunkSerializer.serialize(ceChunk)); + } catch (IOException e) { + plugin.logger().warn("Failed to write chunk tag at " + chunk.getX() + " " + chunk.getZ(), e); + return; + } finally { + try { + CESection[] ceSections = ceChunk.sections(); + Object worldServer = Reflections.field$CraftChunk$worldServer.get(chunk); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(worldServer); + Object levelChunk = Reflections.method$ServerChunkCache$getChunkAtIfLoadedMainThread.invoke(chunkSource, chunk.getX(), chunk.getZ()); + Object[] sections = (Object[]) Reflections.field$ChunkAccess$sections.get(levelChunk); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + BukkitInjector.uninjectLevelChunkSection(section); + if (ceSection.statesContainer().isEmpty()) continue; + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 16; y++) { + ImmutableBlockState customState = ceSection.getBlockState(x, y, z); + if (customState != null && customState.vanillaBlockState() != null) { + Reflections.method$LevelChunkSection$setBlockState.invoke(section, x, y, z, customState.vanillaBlockState().handle(), false); + } + } + } + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to restore chunk at " + chunk.getX() + " " + chunk.getZ(), e); + } + } + ceChunk.unload(); + } + } + + private void handleChunkLoad(CEWorld ceWorld, Chunk chunk) { + ChunkPos pos = new ChunkPos(chunk.getX(), chunk.getZ()); + if (ceWorld.isChunkLoaded(pos.longKey)) return; + CEChunk ceChunk; + try { + CompoundTag chunkNbt = ceWorld.worldDataStorage().readChunkTagAt(pos); + if (chunkNbt != null) { + ceChunk = ChunkSerializer.deserialize(ceWorld, pos, chunkNbt); + } else { + ceChunk = new CEChunk(ceWorld, pos); + } + try { + CESection[] ceSections = ceChunk.sections(); + Object worldServer = Reflections.field$CraftChunk$worldServer.get(chunk); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(worldServer); + Object levelChunk = Reflections.method$ServerChunkCache$getChunkAtIfLoadedMainThread.invoke(chunkSource, chunk.getX(), chunk.getZ()); + Object[] sections = (Object[]) Reflections.field$ChunkAccess$sections.get(levelChunk); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + if (!ceSection.statesContainer().isEmpty()) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 16; y++) { + ImmutableBlockState customState = ceSection.getBlockState(x, y, z); + if (customState != null && customState.customBlockState() != null) { + Reflections.method$LevelChunkSection$setBlockState.invoke(section, x, y, z, customState.customBlockState().handle(), false); + } + } + } + } + } + BukkitInjector.injectLevelChunkSection(section, ceSection, ceWorld, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + } + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to restore chunk at " + chunk.getX() + " " + chunk.getZ(), e); + return; + } + } catch (IOException e) { + this.plugin.logger().warn("Failed to read chunk tag at " + chunk.getX() + " " + chunk.getZ(), e); + return; + } + ceChunk.load(); + } +} diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 000000000..3bef0ddd5 --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,86 @@ +plugins { + id("io.github.goooler.shadow") version "8.1.8" + id("maven-publish") +} + +repositories { + maven("https://jitpack.io/") + maven("https://libraries.minecraft.net/") +} + +dependencies { + implementation(project(":shared")) + // JOML + compileOnly("org.joml:joml:1.10.8") + // YAML + implementation(files("libs/boosted-yaml-${rootProject.properties["boosted_yaml_version"]}.jar")) + compileOnly("org.yaml:snakeyaml:${rootProject.properties["snake_yaml_version"]}") + // NBT + implementation("com.github.Xiao-MoMi:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}") + // Adventure + implementation("net.kyori:adventure-api:${rootProject.properties["adventure_bundle_version"]}") + implementation("net.kyori:adventure-text-minimessage:${rootProject.properties["adventure_bundle_version"]}") + implementation("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") { + exclude("com.google.code.gson", "gson") + } + // Command + compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}") + compileOnly("org.incendo:cloud-minecraft-extras:${rootProject.properties["cloud_minecraft_extras_version"]}") + // FastUtil + compileOnly("it.unimi.dsi:fastutil:${rootProject.properties["fastutil_version"]}") + // Gson + compileOnly("com.google.code.gson:gson:${rootProject.properties["gson_version"]}") + // Guava + compileOnly("com.google.guava:guava:${rootProject.properties["guava_version"]}") + // Logger + compileOnly("org.slf4j:slf4j-api:${rootProject.properties["slf4j_version"]}") + compileOnly("org.apache.logging.log4j:log4j-core:${rootProject.properties["log4j_version"]}") + // Netty + compileOnly("io.netty:netty-all:${rootProject.properties["netty_version"]}.Final") + // Cache + compileOnly("com.github.ben-manes.caffeine:caffeine:${rootProject.properties["caffeine_version"]}") + // Compression + compileOnly("com.github.luben:zstd-jni:${rootProject.properties["zstd_version"]}") + compileOnly("org.lz4:lz4-java:${rootProject.properties["lz4_version"]}") + // Commons IO + compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}") + compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}") + // Data Fixer Upper + compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +tasks { + shadowJar { + archiveClassifier = "" + archiveFileName = "craft-engine-${rootProject.properties["project_version"]}.jar" + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") + relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.rtag") + relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") + } +} + +publishing { + publications { + create("mavenJava") { + groupId = "net.momirealms" + artifactId = "craft-engine" + version = rootProject.version.toString() + artifact(tasks.shadowJar) + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java new file mode 100644 index 000000000..40d347491 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.pack.generator.AbstractModelGenerator; +import net.momirealms.craftengine.core.plugin.CraftEngine; + +public abstract class AbstractBlockManager extends AbstractModelGenerator implements BlockManager { + public AbstractBlockManager(CraftEngine plugin) { + super(plugin); + } + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java new file mode 100644 index 000000000..1722c218a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java @@ -0,0 +1,213 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.util.Key; + +public class BlockKeys { + public static final Key NOTE_BLOCK = Key.of("minecraft:note_block"); + public static final Key CRAFTING_TABLE = Key.of("minecraft:crafting_table"); + public static final Key STONECUTTER = Key.of("minecraft:stonecutter"); + public static final Key BELL = Key.of("minecraft:bell"); + public static final Key SMITHING_TABLE = Key.of("minecraft:smithing_table"); + public static final Key LOOM = Key.of("minecraft:loom"); + public static final Key BARREL = Key.of("minecraft:barrel"); + public static final Key SMOKER = Key.of("minecraft:smoker"); + public static final Key BLAST_FURNACE = Key.of("minecraft:blast_furnace"); + public static final Key FURNACE = Key.of("minecraft:furnace"); + public static final Key LEVER = Key.of("minecraft:lever"); + public static final Key ANVIL = Key.of("minecraft:anvil"); + public static final Key CHIPPED_ANVIL = Key.of("minecraft:chipped_anvil"); + public static final Key DAMAGED_ANVIL = Key.of("minecraft:damaged_anvil"); + public static final Key GRINDSTONE = Key.of("minecraft:grindstone"); + public static final Key ENCHANTING_TABLE = Key.of("minecraft:enchanting_table"); + public static final Key BREWING_STAND = Key.of("minecraft:brewing_stand"); + public static final Key BEACON = Key.of("minecraft:beacon"); + public static final Key CHEST = Key.of("minecraft:chest"); + public static final Key ENDER_CHEST = Key.of("minecraft:ender_chest"); + public static final Key TRAPPED_CHEST = Key.of("minecraft:trapped_chest"); + public static final Key DAYLIGHT_DETECTOR = Key.of("minecraft:daylight_detector"); + public static final Key LECTERN = Key.of("minecraft:lectern"); + public static final Key REPEATER = Key.of("minecraft:repeater"); + public static final Key COMPARATOR = Key.of("minecraft:comparator"); + public static final Key DRAGON_EGG = Key.of("minecraft:dragon_egg"); + public static final Key HOPPER = Key.of("minecraft:hopper"); + public static final Key DISPENSER = Key.of("minecraft:dispenser"); + public static final Key DROPPER = Key.of("minecraft:dropper"); + public static final Key CRAFTER = Key.of("minecraft:crafter"); + public static final Key COMMAND_BLOCK = Key.of("minecraft:command_block"); + public static final Key CHAIN_COMMAND_BLOCK = Key.of("minecraft:chain_command_block"); + public static final Key REPEATING_COMMAND_BLOCK = Key.of("minecraft:repeating_command_block"); + + public static final Key CAKE = Key.of("minecraft:cake"); + public static final Key CANDLE_CAKE = Key.of("minecraft:candle_cake"); + public static final Key WHITE_CANDLE_CAKE = Key.of("minecraft:white_candle_cake"); + public static final Key ORANGE_CANDLE_CAKE = Key.of("minecraft:orange_candle_cake"); + public static final Key MAGENTA_CANDLE_CAKE = Key.of("minecraft:magenta_candle_cake"); + public static final Key LIGHT_BLUE_CANDLE_CAKE = Key.of("minecraft:light_blue_candle_cake"); + public static final Key YELLOW_CANDLE_CAKE = Key.of("minecraft:yellow_candle_cake"); + public static final Key LIME_CANDLE_CAKE = Key.of("minecraft:lime_candle_cake"); + public static final Key PINK_CANDLE_CAKE = Key.of("minecraft:pink_candle_cake"); + public static final Key GRAY_CANDLE_CAKE = Key.of("minecraft:gray_candle_cake"); + public static final Key LIGHT_GRAY_CANDLE_CAKE = Key.of("minecraft:light_gray_candle_cake"); + public static final Key CYAN_CANDLE_CAKE = Key.of("minecraft:cyan_candle_cake"); + public static final Key PURPLE_CANDLE_CAKE = Key.of("minecraft:purple_candle_cake"); + public static final Key BLUE_CANDLE_CAKE = Key.of("minecraft:blue_candle_cake"); + public static final Key BROWN_CANDLE_CAKE = Key.of("minecraft:brown_candle_cake"); + public static final Key GREEN_CANDLE_CAKE = Key.of("minecraft:green_candle_cake"); + public static final Key RED_CANDLE_CAKE = Key.of("minecraft:red_candle_cake"); + public static final Key BLACK_CANDLE_CAKE = Key.of("minecraft:black_candle_cake"); + + public static final Key WHITE_BED = Key.of("minecraft:white_bed"); + public static final Key ORANGE_BED = Key.of("minecraft:orange_bed"); + public static final Key MAGENTA_BED = Key.of("minecraft:magenta_bed"); + public static final Key LIGHT_BLUE_BED = Key.of("minecraft:light_blue_bed"); + public static final Key YELLOW_BED = Key.of("minecraft:yellow_bed"); + public static final Key LIME_BED = Key.of("minecraft:lime_bed"); + public static final Key PINK_BED = Key.of("minecraft:pink_bed"); + public static final Key GRAY_BED = Key.of("minecraft:gray_bed"); + public static final Key LIGHT_GRAY_BED = Key.of("minecraft:light_gray_bed"); + public static final Key CYAN_BED = Key.of("minecraft:cyan_bed"); + public static final Key PURPLE_BED = Key.of("minecraft:purple_bed"); + public static final Key BLUE_BED = Key.of("minecraft:blue_bed"); + public static final Key BROWN_BED = Key.of("minecraft:brown_bed"); + public static final Key GREEN_BED = Key.of("minecraft:green_bed"); + public static final Key RED_BED = Key.of("minecraft:red_bed"); + public static final Key BLACK_BED = Key.of("minecraft:black_bed"); + + public static final Key SHULKER_BOX = Key.of("minecraft:shulker_box"); + public static final Key WHITE_SHULKER_BOX = Key.of("minecraft:white_shulker_box"); + public static final Key ORANGE_SHULKER_BOX = Key.of("minecraft:orange_shulker_box"); + public static final Key MAGENTA_SHULKER_BOX = Key.of("minecraft:magenta_shulker_box"); + public static final Key LIGHT_BLUE_SHULKER_BOX = Key.of("minecraft:light_blue_shulker_box"); + public static final Key YELLOW_SHULKER_BOX = Key.of("minecraft:yellow_shulker_box"); + public static final Key LIME_SHULKER_BOX = Key.of("minecraft:lime_shulker_box"); + public static final Key PINK_SHULKER_BOX = Key.of("minecraft:pink_shulker_box"); + public static final Key GRAY_SHULKER_BOX = Key.of("minecraft:gray_shulker_box"); + public static final Key LIGHT_GRAY_SHULKER_BOX = Key.of("minecraft:light_gray_shulker_box"); + public static final Key CYAN_SHULKER_BOX = Key.of("minecraft:cyan_shulker_box"); + public static final Key PURPLE_SHULKER_BOX = Key.of("minecraft:purple_shulker_box"); + public static final Key BLUE_SHULKER_BOX = Key.of("minecraft:blue_shulker_box"); + public static final Key BROWN_SHULKER_BOX = Key.of("minecraft:brown_shulker_box"); + public static final Key GREEN_SHULKER_BOX = Key.of("minecraft:green_shulker_box"); + public static final Key RED_SHULKER_BOX = Key.of("minecraft:red_shulker_box"); + public static final Key BLACK_SHULKER_BOX = Key.of("minecraft:black_shulker_box"); + + public static final Key OAK_BUTTON = Key.of("minecraft:oak_button"); + public static final Key SPRUCE_BUTTON = Key.of("minecraft:spruce_button"); + public static final Key BIRCH_BUTTON = Key.of("minecraft:birch_button"); + public static final Key JUNGLE_BUTTON = Key.of("minecraft:jungle_button"); + public static final Key ACACIA_BUTTON = Key.of("minecraft:acacia_button"); + public static final Key CHERRY_BUTTON = Key.of("minecraft:cherry_button"); + public static final Key DARK_OAK_BUTTON = Key.of("minecraft:dark_oak_button"); + public static final Key PALE_OAK_BUTTON = Key.of("minecraft:pale_oak_button"); + public static final Key MANGROVE_BUTTON = Key.of("minecraft:mangrove_button"); + public static final Key BAMBOO_BUTTON = Key.of("minecraft:bamboo_button"); + + public static final Key OAK_TRAPDOOR = Key.of("minecraft:oak_trapdoor"); + public static final Key SPRUCE_TRAPDOOR = Key.of("minecraft:spruce_trapdoor"); + public static final Key BIRCH_TRAPDOOR = Key.of("minecraft:birch_trapdoor"); + public static final Key JUNGLE_TRAPDOOR = Key.of("minecraft:jungle_trapdoor"); + public static final Key ACACIA_TRAPDOOR = Key.of("minecraft:acacia_trapdoor"); + public static final Key CHERRY_TRAPDOOR = Key.of("minecraft:cherry_trapdoor"); + public static final Key DARK_OAK_TRAPDOOR = Key.of("minecraft:dark_oak_trapdoor"); + public static final Key PALE_OAK_TRAPDOOR = Key.of("minecraft:pale_oak_trapdoor"); + public static final Key MANGROVE_TRAPDOOR = Key.of("minecraft:mangrove_trapdoor"); + public static final Key BAMBOO_TRAPDOOR = Key.of("minecraft:bamboo_trapdoor"); + public static final Key CRIMSON_TRAPDOOR = Key.of("minecraft:crimson_trapdoor"); + public static final Key WARPED_TRAPDOOR = Key.of("minecraft:warped_trapdoor"); + + public static final Key OAK_DOOR = Key.of("minecraft:oak_door"); + public static final Key SPRUCE_DOOR = Key.of("minecraft:spruce_door"); + public static final Key BIRCH_DOOR = Key.of("minecraft:birch_door"); + public static final Key JUNGLE_DOOR = Key.of("minecraft:jungle_door"); + public static final Key ACACIA_DOOR = Key.of("minecraft:acacia_door"); + public static final Key CHERRY_DOOR = Key.of("minecraft:cherry_door"); + public static final Key DARK_OAK_DOOR = Key.of("minecraft:dark_oak_door"); + public static final Key PALE_OAK_DOOR = Key.of("minecraft:pale_oak_door"); + public static final Key MANGROVE_DOOR = Key.of("minecraft:mangrove_door"); + public static final Key BAMBOO_DOOR = Key.of("minecraft:bamboo_door"); + public static final Key CRIMSON_DOOR = Key.of("minecraft:crimson_door"); + public static final Key WARPED_DOOR = Key.of("minecraft:warped_door"); + + public static final Key COPPER_DOOR = Key.of("minecraft:copper_door"); + public static final Key EXPOSED_COPPER_DOOR = Key.of("minecraft:exposed_copper_door"); + public static final Key OXIDIZED_COPPER_DOOR = Key.of("minecraft:oxidized_copper_door"); + public static final Key WEATHERED_COPPER_DOOR = Key.of("minecraft:weathered_copper_door"); + public static final Key WAXED_COPPER_DOOR = Key.of("minecraft:waxed_copper_door"); + public static final Key WAXED_EXPOSED_COPPER_DOOR = Key.of("minecraft:waxed_exposed_copper_door"); + public static final Key WAXED_OXIDIZED_COPPER_DOOR = Key.of("minecraft:waxed_oxidized_copper_door"); + public static final Key WAXED_WEATHERED_COPPER_DOOR = Key.of("minecraft:waxed_weathered_copper_door"); + + public static final Key COPPER_TRAPDOOR = Key.of("minecraft:copper_trapdoor"); + public static final Key EXPOSED_COPPER_TRAPDOOR = Key.of("minecraft:exposed_copper_trapdoor"); + public static final Key OXIDIZED_COPPER_TRAPDOOR = Key.of("minecraft:oxidized_copper_trapdoor"); + public static final Key WEATHERED_COPPER_TRAPDOOR = Key.of("minecraft:weathered_copper_trapdoor"); + public static final Key WAXED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_copper_trapdoor"); + public static final Key WAXED_EXPOSED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_exposed_copper_trapdoor"); + public static final Key WAXED_OXIDIZED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_oxidized_copper_trapdoor"); + public static final Key WAXED_WEATHERED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_weathered_copper_trapdoor"); + + public static final Key OAK_FENCE_GATE = Key.of("minecraft:oak_fence_gate"); + public static final Key SPRUCE_FENCE_GATE = Key.of("minecraft:spruce_fence_gate"); + public static final Key BIRCH_FENCE_GATE = Key.of("minecraft:birch_fence_gate"); + public static final Key JUNGLE_FENCE_GATE = Key.of("minecraft:jungle_fence_gate"); + public static final Key ACACIA_FENCE_GATE = Key.of("minecraft:acacia_fence_gate"); + public static final Key CHERRY_FENCE_GATE = Key.of("minecraft:cherry_fence_gate"); + public static final Key DARK_OAK_FENCE_GATE = Key.of("minecraft:dark_oak_fence_gate"); + public static final Key PALE_OAK_FENCE_GATE = Key.of("minecraft:pale_oak_fence_gate"); + public static final Key MANGROVE_FENCE_GATE = Key.of("minecraft:mangrove_fence_gate"); + public static final Key BAMBOO_FENCE_GATE = Key.of("minecraft:bamboo_fence_gate"); + public static final Key CRIMSON_FENCE_GATE = Key.of("minecraft:crimson_fence_gate"); + public static final Key WARPED_FENCE_GATE = Key.of("minecraft:warped_fence_gate"); + + public static final Key OAK_SIGN = Key.of("minecraft:oak_sign"); + public static final Key SPRUCE_SIGN = Key.of("minecraft:spruce_sign"); + public static final Key ACACIA_SIGN = Key.of("minecraft:acacia_sign"); + public static final Key BIRCH_SIGN = Key.of("minecraft:birch_sign"); + public static final Key CHERRY_SIGN = Key.of("minecraft:cherry_sign"); + public static final Key JUNGLE_SIGN = Key.of("minecraft:jungle_sign"); + public static final Key DARK_OAK_SIGN = Key.of("minecraft:dark_oak_sign"); + public static final Key PALE_OAK_SIGN = Key.of("minecraft:pale_oak_sign"); + public static final Key MANGROVE_SIGN = Key.of("minecraft:mangrove_sign"); + public static final Key BAMBOO_SIGN = Key.of("minecraft:bamboo_sign"); + public static final Key WARPED_SIGN = Key.of("minecraft:warped_sign"); + public static final Key CRIMSON_SIGN = Key.of("minecraft:crimson_sign"); + + public static final Key OAK_WALL_SIGN = Key.of("minecraft:oak_wall_sign"); + public static final Key SPRUCE_WALL_SIGN = Key.of("minecraft:spruce_wall_sign"); + public static final Key BIRCH_WALL_SIGN = Key.of("minecraft:birch_wall_sign"); + public static final Key ACACIA_WALL_SIGN = Key.of("minecraft:acacia_wall_sign"); + public static final Key CHERRY_WALL_SIGN = Key.of("minecraft:cherry_wall_sign"); + public static final Key JUNGLE_WALL_SIGN = Key.of("minecraft:jungle_wall_sign"); + public static final Key DARK_OAK_WALL_SIGN = Key.of("minecraft:dark_oak_wall_sign"); + public static final Key PALE_OAK_WALL_SIGN = Key.of("minecraft:pale_oak_wall_sign"); + public static final Key MANGROVE_WALL_SIGN = Key.of("minecraft:mangrove_wall_sign"); + public static final Key BAMBOO_WALL_SIGN = Key.of("minecraft:bamboo_wall_sign"); + public static final Key CRIMSON_WALL_SIGN = Key.of("minecraft:crimson_wall_sign"); + public static final Key WARPED_WALL_SIGN = Key.of("minecraft:warped_wall_sign"); + + public static final Key OAK_HANGING_SIGN = Key.of("minecraft:oak_hanging_sign"); + public static final Key SPRUCE_HANGING_SIGN = Key.of("minecraft:spruce_hanging_sign"); + public static final Key BIRCH_HANGING_SIGN = Key.of("minecraft:birch_hanging_sign"); + public static final Key ACACIA_HANGING_SIGN = Key.of("minecraft:acacia_hanging_sign"); + public static final Key CHERRY_HANGING_SIGN = Key.of("minecraft:cherry_hanging_sign"); + public static final Key JUNGLE_HANGING_SIGN = Key.of("minecraft:jungle_hanging_sign"); + public static final Key DARK_OAK_HANGING_SIGN = Key.of("minecraft:dark_oak_hanging_sign"); + public static final Key PALE_OAK_HANGING_SIGN = Key.of("minecraft:pale_oak_hanging_sign"); + public static final Key CRIMSON_HANGING_SIGN = Key.of("minecraft:crimson_hanging_sign"); + public static final Key WARPED_HANGING_SIGN = Key.of("minecraft:warped_hanging_sign"); + public static final Key MANGROVE_HANGING_SIGN = Key.of("minecraft:mangrove_hanging_sign"); + public static final Key BAMBOO_HANGING_SIGN = Key.of("minecraft:bamboo_hanging_sign"); + + public static final Key OAK_WALL_HANGING_SIGN = Key.of("minecraft:oak_wall_hanging_sign"); + public static final Key SPRUCE_WALL_HANGING_SIGN = Key.of("minecraft:spruce_wall_hanging_sign"); + public static final Key BIRCH_WALL_HANGING_SIGN = Key.of("minecraft:birch_wall_hanging_sign"); + public static final Key ACACIA_WALL_HANGING_SIGN = Key.of("minecraft:acacia_wall_hanging_sign"); + public static final Key CHERRY_WALL_HANGING_SIGN = Key.of("minecraft:cherry_wall_hanging_sign"); + public static final Key JUNGLE_WALL_HANGING_SIGN = Key.of("minecraft:jungle_wall_hanging_sign"); + public static final Key DARK_OAK_WALL_HANGING_SIGN = Key.of("minecraft:dark_oak_wall_hanging_sign"); + public static final Key PALE_OAK_WALL_HANGING_SIGN = Key.of("minecraft:pale_oak_wall_hanging_sign"); + public static final Key MANGROVE_WALL_HANGING_SIGN = Key.of("minecraft:mangrove_wall_hanging_sign"); + public static final Key CRIMSON_WALL_HANGING_SIGN = Key.of("minecraft:crimson_wall_hanging_sign"); + public static final Key WARPED_WALL_HANGING_SIGN = Key.of("minecraft:warped_wall_hanging_sign"); + public static final Key BAMBOO_WALL_HANGING_SIGN = Key.of("minecraft:bamboo_wall_hanging_sign"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java new file mode 100644 index 000000000..80d59e1a6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.block; + +import com.google.gson.JsonElement; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.generator.ModelGenerator; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.suggestion.Suggestion; + +import java.util.Collection; +import java.util.Map; +import java.util.Optional; + +public interface BlockManager extends Reloadable, ModelGenerator, ConfigSectionParser { + String CONFIG_SECTION_NAME = "blocks"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Collection modelsToGenerate(); + + Map> blockOverrides(); + + Map blocks(); + + Optional getBlock(Key key); + + Collection cachedSuggestions(); + + Map soundMapper(); + + void initSuggestions(); + + void delayedLoad(); + + default int loadingSequence() { + return LoadingSequence.BLOCK; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockNbtParser.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockNbtParser.java new file mode 100644 index 000000000..aada90b73 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockNbtParser.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.util.StringReader; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class BlockNbtParser { + + private BlockNbtParser() {} + + @Nullable + public static CompoundTag deserialize(@NotNull CustomBlock block, @NotNull String data) { + StringReader reader = new StringReader(data); + CompoundTag properties = new CompoundTag(); + while (reader.canRead()) { + String propertyName = reader.readUnquotedString(); + if (propertyName.isEmpty() || !reader.canRead() || reader.peek() != '=') { + return null; + } + reader.skip(); + String propertyValue = reader.readUnquotedString(); + if (propertyValue.isEmpty()) { + return null; + } + Property property = block.getProperty(propertyName); + if (property != null) { + property.createOptionalTag(propertyValue).ifPresent(tag -> { + properties.put(propertyName, tag); + }); + } + if (reader.canRead() && reader.peek() == ',') { + reader.skip(); + } else { + break; + } + } + return properties; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockRegistryMirror.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockRegistryMirror.java new file mode 100644 index 000000000..77645ffa1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockRegistryMirror.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.block; + +public class BlockRegistryMirror { + private static PackedBlockState[] customBlockStates; + + public static void init(PackedBlockState[] states) { + customBlockStates = states; + } + + public static PackedBlockState stateByRegistryId(int vanillaId) { + if (vanillaId < 0) return null; + return customBlockStates[vanillaId]; + } + + public static int size() { + return customBlockStates.length; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java new file mode 100644 index 000000000..2f4625ffe --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java @@ -0,0 +1,334 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.util.*; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +public class BlockSettings { + boolean isRandomlyTicking; + boolean burnable; + int burnChance; + int fireSpreadChance; + boolean replaceable; + float hardness = 2f; + float resistance = 2f; + boolean canOcclude; + Tristate isRedstoneConductor = Tristate.UNDEFINED; + Tristate isSuffocating = Tristate.UNDEFINED; + Tristate isViewBlocking = Tristate.UNDEFINED; + MapColor mapColor = MapColor.CLEAR; + PushReaction pushReaction = PushReaction.NORMAL; + int luminance; + Instrument instrument = Instrument.HARP; + BlockSounds sounds = BlockSounds.EMPTY; + @Nullable + Key itemId; + Set tags = Set.of(); + + private BlockSettings() {} + + public static BlockSettings of() { + return new BlockSettings(); + } + + public static BlockSettings fromMap(Map map) { + return applyModifiers(BlockSettings.of(), map); + } + + public static BlockSettings ofFullCopy(BlockSettings settings, Map map) { + return applyModifiers(ofFullCopy(settings), map); + } + + public static BlockSettings applyModifiers(BlockSettings settings, Map map) { + for (Map.Entry entry : map.entrySet()) { + Modifier.Factory factory = Modifiers.FACTORIES.get(entry.getKey()); + if (factory != null) { + factory.createModifier(entry.getValue()).apply(settings); + } else { + throw new IllegalArgumentException("Unknown block settings key: " + entry.getKey()); + } + } + return settings; + } + + public static BlockSettings ofFullCopy(BlockSettings settings) { + BlockSettings newSettings = of(); + newSettings.canOcclude = settings.canOcclude; + newSettings.hardness = settings.hardness; + newSettings.resistance = settings.resistance; + newSettings.isRandomlyTicking = settings.isRandomlyTicking; + newSettings.burnable = settings.burnable; + newSettings.replaceable = settings.replaceable; + newSettings.mapColor = settings.mapColor; + newSettings.pushReaction = settings.pushReaction; + newSettings.luminance = settings.luminance; + newSettings.instrument = settings.instrument; + newSettings.sounds = settings.sounds; + newSettings.itemId = settings.itemId; + newSettings.tags = settings.tags; + newSettings.burnChance = settings.burnChance; + newSettings.fireSpreadChance = settings.fireSpreadChance; + newSettings.isRedstoneConductor = settings.isRedstoneConductor; + newSettings.isSuffocating = settings.isSuffocating; + newSettings.isViewBlocking = settings.isViewBlocking; + return newSettings; + } + + public Set tags() { + return tags; + } + + public Key itemId() { + return itemId; + } + + public BlockSounds sounds() { + return sounds; + } + + public float resistance() { + return resistance; + } + + public boolean isRandomlyTicking() { + return isRandomlyTicking; + } + + public boolean burnable() { + return burnable; + } + + public boolean replaceable() { + return replaceable; + } + + public float hardness() { + return hardness; + } + + public boolean canOcclude() { + return canOcclude; + } + + public MapColor mapColor() { + return mapColor; + } + + public PushReaction pushReaction() { + return pushReaction; + } + + public int luminance() { + return luminance; + } + + public Instrument instrument() { + return instrument; + } + + public int burnChance() { + return burnChance; + } + + public int fireSpreadChance() { + return fireSpreadChance; + } + + public Tristate isRedstoneConductor() { + return isRedstoneConductor; + } + + public Tristate isSuffocating() { + return isSuffocating; + } + + public Tristate isViewBlocking() { + return isViewBlocking; + } + + public BlockSettings burnChance(int burnChance) { + this.burnChance = burnChance; + return this; + } + + public BlockSettings fireSpreadChance(int fireSpreadChance) { + this.fireSpreadChance = fireSpreadChance; + return this; + } + + public BlockSettings tags(Set tags) { + this.tags = tags; + return this; + } + + public BlockSettings itemId(Key itemId) { + this.itemId = itemId; + return this; + } + + public BlockSettings sounds(BlockSounds sounds) { + this.sounds = sounds; + return this; + } + + public BlockSettings instrument(Instrument instrument) { + this.instrument = instrument; + return this; + } + + public BlockSettings luminance(int luminance) { + this.luminance = luminance; + return this; + } + + public BlockSettings pushReaction(PushReaction pushReaction) { + this.pushReaction = pushReaction; + return this; + } + + public BlockSettings mapColor(MapColor mapColor) { + this.mapColor = mapColor; + return this; + } + + public BlockSettings hardness(float hardness) { + this.hardness = hardness; + return this; + } + + public BlockSettings resistance(float resistance) { + this.resistance = resistance; + return this; + } + + public BlockSettings canOcclude(boolean canOcclude) { + this.canOcclude = canOcclude; + return this; + } + + public BlockSettings isRandomlyTicking(boolean isRandomlyTicking) { + this.isRandomlyTicking = isRandomlyTicking; + return this; + } + + public BlockSettings burnable(boolean burnable) { + this.burnable = burnable; + return this; + } + + public BlockSettings isRedstoneConductor(boolean isRedstoneConductor) { + this.isRedstoneConductor = isRedstoneConductor ? Tristate.TRUE : Tristate.FALSE; + return this; + } + + public BlockSettings isSuffocating(boolean isSuffocating) { + this.isSuffocating = isSuffocating ? Tristate.TRUE : Tristate.FALSE; + return this; + } + + public BlockSettings isViewBlocking(boolean isViewBlocking) { + this.isViewBlocking = isViewBlocking ? Tristate.TRUE : Tristate.FALSE; + return this; + } + + public BlockSettings replaceable(boolean replaceable) { + this.replaceable = replaceable; + return this; + } + + public interface Modifier { + + void apply(BlockSettings settings); + + interface Factory { + + Modifier createModifier(Object value); + } + } + + public static class Modifiers { + private static final Map FACTORIES = new HashMap<>(); + + static { + registerFactory("luminance", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.luminance(intValue); + })); + registerFactory("hardness", (value -> { + float floatValue = MiscUtils.getAsFloat(value); + return settings -> settings.hardness(floatValue); + })); + registerFactory("resistance", (value -> { + float floatValue = MiscUtils.getAsFloat(value); + return settings -> settings.resistance(floatValue); + })); + registerFactory("is-randomly-ticking", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isRandomlyTicking(booleanValue); + })); + registerFactory("push-reaction", (value -> { + PushReaction reaction = PushReaction.valueOf(value.toString().toUpperCase(Locale.ENGLISH)); + return settings -> settings.pushReaction(reaction); + })); + registerFactory("map-color", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.mapColor(MapColor.get(intValue)); + })); + registerFactory("burnable", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.burnable(booleanValue); + })); + registerFactory("instrument", (value -> { + Instrument instrument = Instrument.valueOf(value.toString().toUpperCase(Locale.ENGLISH)); + return settings -> settings.instrument(instrument); + })); + registerFactory("item", (value -> { + Key item = Key.of(value.toString()); + return settings -> settings.itemId(item); + })); + registerFactory("tags", (value -> { + List tags = MiscUtils.getAsStringList(value); + return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet())); + })); + registerFactory("burn-chance", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.burnChance(intValue); + })); + registerFactory("fire-spread-chance", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.fireSpreadChance(intValue); + })); + registerFactory("replaceable", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.replaceable(booleanValue); + })); + registerFactory("is-redstone-conductor", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isRedstoneConductor(booleanValue); + })); + registerFactory("is-suffocating", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isSuffocating(booleanValue); + })); + registerFactory("is-view-blocking", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isViewBlocking(booleanValue); + })); + registerFactory("sounds", (value -> { + Map soundMap = MiscUtils.castToMap(value, false); + return settings -> settings.sounds(BlockSounds.fromMap(soundMap)); + })); + registerFactory("can-occlude", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.canOcclude(booleanValue); + })); + } + + private static void registerFactory(String id, Modifier.Factory factory) { + FACTORIES.put(id, factory); + } + } +} + diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java new file mode 100644 index 000000000..dbff0a42e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class BlockSounds { + public static final Key EMPTY_SOUND = Key.of("minecraft:intentionally_empty"); + public static final BlockSounds EMPTY = new BlockSounds(EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND); + + private final Key breakSound; + private final Key stepSound; + private final Key placeSound; + private final Key hitSound; + private final Key fallSound; + + public BlockSounds(Key breakSound, Key stepSound, Key placeSound, Key hitSound, Key fallSound) { + this.breakSound = breakSound; + this.stepSound = stepSound; + this.placeSound = placeSound; + this.hitSound = hitSound; + this.fallSound = fallSound; + } + + public static BlockSounds fromMap(Map map) { + if (map == null) return EMPTY; + return new BlockSounds( + Key.of(map.getOrDefault("break", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("step", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("place", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("hit", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("fall", "minecraft:intentionally_empty").toString()) + ); + } + + public Key breakSound() { + return breakSound; + } + + public Key stepSound() { + return stepSound; + } + + public Key placeSound() { + return placeSound; + } + + public Key hitSound() { + return hitSound; + } + + public Key fallSound() { + return fallSound; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateArrangeException.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateArrangeException.java new file mode 100644 index 000000000..d287ec63b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateArrangeException.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.block; + +public class BlockStateArrangeException extends RuntimeException { + public BlockStateArrangeException(String message) { + super(message); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateHolder.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateHolder.java new file mode 100644 index 000000000..628568f60 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateHolder.java @@ -0,0 +1,149 @@ +package net.momirealms.craftengine.core.block; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.registry.Holder; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class BlockStateHolder { + private static final Function, Comparable>, String> PROPERTY_MAP_PRINTER = entry -> { + if (entry == null) { + return ""; + } + Property property = entry.getKey(); + return property.name() + "=" + formatValue(property, entry.getValue()); + }; + + @SuppressWarnings("unchecked") + private static > String formatValue(Property property, Comparable value) { + return property.valueName((T) value); + } + + protected final Holder owner; + private final Reference2ObjectArrayMap, Comparable> propertyMap; + private Map, ImmutableBlockState[]> withMap; + + public BlockStateHolder(Holder owner, Reference2ObjectArrayMap, Comparable> propertyMap) { + this.owner = owner; + this.propertyMap = propertyMap; + } + + public Holder owner() { + return owner; + } + + public > ImmutableBlockState cycle(Property property) { + return this.with(property, getNextValue(property.possibleValues(), this.get(property))); + } + + protected static T getNextValue(List values, T currentValue) { + int nextIndex = (values.indexOf(currentValue) + 1) % values.size(); + return values.get(nextIndex); + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append(this.owner.value().id()); + if (!this.getEntries().isEmpty()) { + result.append('['); + result.append(this.getEntries().entrySet().stream() + .map(PROPERTY_MAP_PRINTER) + .collect(Collectors.joining(","))); + result.append(']'); + } + return result.toString(); + } + + public String getPropertiesAsString() { + if (!this.getEntries().isEmpty()) { + return this.getEntries().entrySet().stream() + .map(PROPERTY_MAP_PRINTER) + .collect(Collectors.joining(",")); + } + return ""; + } + + public Collection> getProperties() { + return Collections.unmodifiableCollection(this.propertyMap.keySet()); + } + + public > boolean contains(Property property) { + return this.propertyMap.containsKey(property); + } + + public > T get(Property property) { + Comparable value = this.propertyMap.get(property); + if (value == null) { + throw new IllegalArgumentException("Cannot get property " + property + " as it does not exist in " + this.owner); + } + return property.valueClass().cast(value); + } + + public > Optional getOrEmpty(Property property) { + return Optional.ofNullable(this.getNullable(property)); + } + + public > T get(Property property, T fallback) { + return Objects.requireNonNullElse(this.getNullable(property), fallback); + } + + @Nullable + public > T getNullable(Property property) { + Comparable value = this.propertyMap.get(property); + return value == null ? null : property.valueClass().cast(value); + } + + public , V extends T> ImmutableBlockState with(Property property, V value) { + Comparable currentValue = this.propertyMap.get(property); + if (currentValue == null) { + throw new IllegalArgumentException("Cannot set property " + property + " as it does not exist in " + this.owner); + } + return this.withInternal(property, value, currentValue); + } + + public , V extends T> ImmutableBlockState withIfExists(Property property, V value) { + Comparable currentValue = this.propertyMap.get(property); + return currentValue == null ? ((ImmutableBlockState) this) : this.withInternal(property, value, currentValue); + } + + private , V extends T> ImmutableBlockState withInternal(Property property, V newValue, Comparable currentValue) { + if (currentValue.equals(newValue)) { + return (ImmutableBlockState) this; + } + int valueIndex = property.indexOf(newValue); + if (valueIndex < 0) { + throw new IllegalArgumentException("Cannot set property " + property + " to " + newValue + " on " + this.owner + ", it is not an allowed value"); + } + return (this.withMap.get(property))[valueIndex]; + } + + public void createWithMap(Map, Comparable>, ImmutableBlockState> states) { + if (this.withMap != null) { + throw new IllegalStateException("withMap is already initialized."); + } + Map, ImmutableBlockState[]> map = new Reference2ObjectArrayMap<>(this.propertyMap.size()); + for (Map.Entry, Comparable> entry : this.propertyMap.entrySet()) { + Property property = entry.getKey(); + ImmutableBlockState[] possibleStates = property.possibleValues().stream() + .map(value -> states.get(this.createPropertyMap(property, value))) + .toArray(ImmutableBlockState[]::new); + map.put(property, possibleStates); + } + this.withMap = map; + } + + private Map, Comparable> createPropertyMap(Property property, Comparable value) { + Map, Comparable> newMap = new Reference2ObjectArrayMap<>(this.propertyMap); + newMap.put(property, value); + return newMap; + } + + public Map, Comparable> getEntries() { + return this.propertyMap; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateParser.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateParser.java new file mode 100644 index 000000000..ce3e7984a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateParser.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.StringReader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class BlockStateParser { + + @Nullable + public static ImmutableBlockState deserialize(@NotNull String data) { + StringReader reader = new StringReader(data); + String blockIdString = reader.readUnquotedString(); + if (reader.canRead() && reader.peek() == ':') { + reader.skip(); + blockIdString = blockIdString + ":" + reader.readUnquotedString(); + } + Optional> optional = BuiltInRegistries.BLOCK.get(Key.from(blockIdString)); + if (optional.isEmpty()) { + return null; + } + Holder holder = optional.get(); + ImmutableBlockState defaultState = holder.value().getDefaultState(); + if (reader.canRead() && reader.peek() == '[') { + reader.skip(); + while (reader.canRead() && reader.peek() != ']') { + String propertyName = reader.readUnquotedString(); + if (!reader.canRead() || reader.peek() != '=') { + return null; + } + reader.skip(); + String propertyValue = reader.readUnquotedString(); + Property property = holder.value().getProperty(propertyName); + if (property != null) { + Optional optionalValue = property.optional(propertyValue); + if (optionalValue.isEmpty()) { + defaultState = ImmutableBlockState.with(defaultState, property, property.defaultValue()); + } else { + defaultState = ImmutableBlockState.with(defaultState, property, optionalValue.get()); + } + } + if (reader.canRead() && reader.peek() == ',') { + reader.skip(); + } + } + if (reader.canRead() && reader.peek() == ']') { + reader.skip(); + } else { + return null; + } + } + return defaultState; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateVariantProvider.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateVariantProvider.java new file mode 100644 index 000000000..86d9ee40a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateVariantProvider.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.core.block; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + +public class BlockStateVariantProvider { + private final ImmutableSortedMap> properties; + private final ImmutableList states; + private final Holder owner; + + public BlockStateVariantProvider(Holder owner, Factory, ImmutableBlockState> factory, Map> propertiesMap) { + this.owner = owner; + this.properties = ImmutableSortedMap.copyOf(propertiesMap); + + List list = Lists.newArrayList(); + Stream, Comparable>>> stream = Stream.of(Collections.emptyList()); + Map, Comparable>, ImmutableBlockState> map = Maps.newLinkedHashMap(); + + for (Property property : this.properties.values()) { + stream = stream.flatMap(entries -> { + List, Comparable>>>> streams = new ArrayList<>(); + for (Comparable value : property.possibleValues()) { + List, Comparable>> newEntries = new ArrayList<>(entries); + newEntries.add(Pair.of(property, value)); + streams.add(Stream.of(newEntries)); + } + return streams.stream().flatMap(Function.identity()); + }); + } + + stream.forEach((entries) -> { + Reference2ObjectArrayMap, Comparable> reference2ObjectArrayMap = new Reference2ObjectArrayMap<>(entries.size()); + for (Pair, Comparable> entry : entries) { + reference2ObjectArrayMap.put(entry.left(), entry.right()); + } + ImmutableBlockState state = factory.create(owner, reference2ObjectArrayMap); + map.put(reference2ObjectArrayMap, state); + list.add(state); + }); + + for (ImmutableBlockState state : list) { + state.createWithMap(map); + } + this.states = ImmutableList.copyOf(list); + } + + public interface Factory { + S create(O owner, Reference2ObjectArrayMap, Comparable> propertyMap); + } + + @NotNull + public ImmutableBlockState getDefaultState() { + ImmutableBlockState first = this.states.get(0); + for (Property property : this.properties.values()) { + first = ImmutableBlockState.with(first, property, property.defaultValue()); + } + return first; + } + + public ImmutableList states() { + return states; + } + + public Holder owner() { + return owner; + } + + @Nullable + public Property getProperty(String name) { + return this.properties.get(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BreakReason.java b/core/src/main/java/net/momirealms/craftengine/core/block/BreakReason.java new file mode 100644 index 000000000..15818b0d8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BreakReason.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.block; + +public enum BreakReason { + PHYSICS, + PLAYER_BREAK, + TRAMPLE, + SPAWN_STRUCTURE +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java new file mode 100644 index 000000000..d63ca24fe --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java @@ -0,0 +1,186 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.block.behavior.BlockBehaviors; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.HorizontalDirection; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public abstract class CustomBlock { + protected final Holder holder; + protected Key id; + protected ImmutableBlockState defaultState; + protected BlockStateVariantProvider variantProvider; + protected Map> properties; + protected BlockBehavior behavior; + @Nullable + protected LootTable lootTable; + + public CustomBlock( + @NotNull Key id, + @NotNull Holder.Reference holder, + @NotNull Map> properties, + @NotNull Map appearances, + @NotNull Map variantMapper, + @NotNull BlockSettings settings, + @Nullable Map behaviorSettings, + @Nullable LootTable lootTable + ) { + holder.bindValue(this); + this.holder = holder; + this.id = id; + this.lootTable = lootTable; + this.properties = properties; + this.variantProvider = new BlockStateVariantProvider(holder, ImmutableBlockState::new, properties); + this.setDefaultState(this.variantProvider.getDefaultState()); + this.behavior = BlockBehaviors.fromMap(this, behaviorSettings); + for (Map.Entry entry : variantMapper.entrySet()) { + String nbtString = entry.getKey(); + CompoundTag tag = BlockNbtParser.deserialize(this, nbtString); + if (tag == null) { + CraftEngine.instance().logger().warn("Illegal block state: " + nbtString); + continue; + } + VariantState variantState = entry.getValue(); + int vanillaStateRegistryId = appearances.getOrDefault(variantState.appearance(), -1); + if (vanillaStateRegistryId == -1) { + CraftEngine.instance().logger().warn("Could not find appearance " + variantState.appearance() + " for block " + id); + vanillaStateRegistryId = appearances.values().iterator().next(); + } + // Late init states + for (ImmutableBlockState state : this.getPossibleStates(tag)) { + state.setBehavior(this.behavior); + state.setSettings(variantState.settings()); + state.setVanillaBlockState(BlockRegistryMirror.stateByRegistryId(vanillaStateRegistryId)); + state.setCustomBlockState(BlockRegistryMirror.stateByRegistryId(variantState.internalRegistryId())); + } + } + // double check if there's any invalid state + for (ImmutableBlockState state : this.variantProvider().states()) { + if (state.settings() == null) { + state.setSettings(settings); + } + } + this.applyPlatformSettings(); + } + + protected abstract void applyPlatformSettings(); + + @Nullable + public LootTable lootTable() { + return lootTable; + } + + @NotNull + public BlockStateVariantProvider variantProvider() { + return variantProvider; + } + + @NotNull + public final Key id() { + return id; + } + + private List getPossibleStates(CompoundTag nbt) { + List tempStates = new ArrayList<>(); + tempStates.add(getDefaultState()); + for (Property property : variantProvider.getDefaultState().getProperties()) { + Tag value = nbt.get(property.name()); + if (value != null) { + tempStates.replaceAll(immutableBlockState -> ImmutableBlockState.with(immutableBlockState, property, property.unpack(value))); + } else { + List newStates = new ArrayList<>(); + for (ImmutableBlockState state : tempStates) { + for (Object possibleValue : property.possibleValues()) { + newStates.add(ImmutableBlockState.with(state, property, possibleValue)); + } + } + tempStates = newStates; + } + } + return tempStates; + } + + public ImmutableBlockState getBlockState(CompoundTag nbt) { + ImmutableBlockState state = getDefaultState(); + for (Map.Entry entry : nbt.tags.entrySet()) { + Property property = variantProvider.getProperty(entry.getKey()); + if (property != null) { + try { + state = ImmutableBlockState.with(state, property, property.unpack(entry.getValue())); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to parse block state: " + entry.getKey(), e); + } + } + } + return state; + } + + @Nullable + public Property getProperty(String name) { + return this.properties.get(name); + } + + @NotNull + public Collection> properties() { + return this.properties.values(); + } + + protected final void setDefaultState(ImmutableBlockState state) { + this.defaultState = state; + } + + public final ImmutableBlockState getDefaultState() { + return this.defaultState; + } + + // TODO refactor this method + @SuppressWarnings("unchecked") + public ImmutableBlockState getStateForPlacement(BlockPlaceContext context) { + ImmutableBlockState state = getDefaultState(); + Property axisProperty = (Property) this.variantProvider.getProperty("axis"); + if (axisProperty != null) { + state = state.with(axisProperty, context.getClickedFace().axis()); + } + Property directionProperty = this.variantProvider.getProperty("facing"); + if (directionProperty != null) { + if (directionProperty.valueClass() == HorizontalDirection.class) { + state = state.with((Property) directionProperty, context.getHorizontalDirection().opposite().toHorizontalDirection()); + } else if (directionProperty.valueClass() == Direction.class) { + state = state.with((Property) directionProperty, context.getNearestLookingDirection().opposite()); + } + } + Property waterloggedProperty = (Property) this.variantProvider.getProperty("waterlogged"); + if (waterloggedProperty != null) { + if (context.isWaterSource()) { + state = state.with(waterloggedProperty, true); + } + } + + //TODO Use default values + Property persistentProperty = (Property) this.variantProvider.getProperty("persistent"); + if (persistentProperty != null) { + state = state.with(persistentProperty, true); + } + Property distanceProperty = (Property) this.variantProvider.getProperty("distance"); + if (distanceProperty != null) { + state = state.with(distanceProperty, distanceProperty.defaultValue()); + } + //TODO state = state.behavior().getStateForPlacement(state, context); + return state; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java new file mode 100644 index 000000000..84d079d37 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class EmptyBlock extends CustomBlock { + public static EmptyBlock INSTANCE; + + public EmptyBlock(Key id, Holder.Reference holder) { + super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), null, null); + INSTANCE = this; + } + + @Override + protected void applyPlatformSettings() { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java new file mode 100644 index 000000000..c3dfe43f4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java @@ -0,0 +1,149 @@ +package net.momirealms.craftengine.core.block; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; +import net.momirealms.sparrow.nbt.Tag; + +import javax.annotation.Nullable; +import java.util.List; + +public class ImmutableBlockState extends BlockStateHolder { + private CompoundTag tag; + @Nullable + private PackedBlockState customBlockState; + @Nullable + private PackedBlockState vanillaBlockState; + + private BlockBehavior behavior; + private Integer hashCode; + private BlockSettings settings; + + protected ImmutableBlockState( + Holder owner, + Reference2ObjectArrayMap, Comparable> propertyMap + ) { + super(owner, propertyMap); + } + + public BlockBehavior behavior() { + return behavior; + } + + public void setBehavior(BlockBehavior behavior) { + this.behavior = behavior; + } + + public BlockSettings settings() { + return settings; + } + + public void setSettings(BlockSettings settings) { + this.settings = settings; + } + + public boolean isEmpty() { + return this == EmptyBlock.INSTANCE.getDefaultState(); + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ImmutableBlockState state)) return false; + return state.owner == this.owner && state.tag.equals(this.tag); + } + + @Override + public int hashCode() { + if (hashCode == null) { + hashCode = getNbtToSave().hashCode(); + } + return hashCode; + } + + public BlockSounds sounds() { + return settings.sounds; + } + + public int luminance() { + return settings.luminance; + } + + public PushReaction pushReaction() { + return settings.pushReaction; + } + + public PackedBlockState customBlockState() { + return customBlockState; + } + + public PackedBlockState vanillaBlockState() { + return vanillaBlockState; + } + + public void setCustomBlockState(@Nullable PackedBlockState customBlockState) { + this.customBlockState = customBlockState; + } + + public void setVanillaBlockState(@Nullable PackedBlockState vanillaBlockState) { + this.vanillaBlockState = vanillaBlockState; + } + + private CompoundTag propertiesNbt() { + CompoundTag properties = new CompoundTag(); + for (Property property : getProperties()) { + Comparable value = get(property); + if (value != null) { + properties.put(property.name(), pack(property, value)); + continue; + } + properties.put(property.name(), pack(property, property.defaultValue())); + } + return properties; + } + + @SuppressWarnings("unchecked") + public static > Tag pack(Property property, Object value) { + return property.pack((T) value); + } + + public CompoundTag getNbtToSave() { + if (tag == null) { + tag = toNbtToSave(propertiesNbt()); + } + return tag; + } + + public CompoundTag toNbtToSave(CompoundTag properties) { + CompoundTag tag = new CompoundTag(); + tag.put("properties", properties); + tag.put("id", NBT.createString(owner.value().id().toString())); + return tag; + } + + public void setNbtToSave(CompoundTag tag) { + this.tag = tag; + } + + @SuppressWarnings("unchecked") + public static > ImmutableBlockState with(ImmutableBlockState state, Property property, Object value) { + return state.with(property, (T) value); + } + + @SuppressWarnings("unchecked") + public List> getDrops(ContextHolder.Builder builder, World world) { + CustomBlock block = owner.value(); + if (block == null) return List.of(); + LootTable lootTable = (LootTable) block.lootTable(); + if (lootTable == null) return List.of(); + return lootTable.getRandomItems(builder.withParameter(LootParameters.BLOCK_STATE, this).build(), world); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java new file mode 100644 index 000000000..db164c62e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.block; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.sparrow.nbt.CompoundTag; + +import java.util.HashMap; +import java.util.Map; + +public class InactiveCustomBlock extends CustomBlock { + private final Map cachedData = new HashMap<>(); + + public InactiveCustomBlock(Key id, Holder.Reference holder) { + super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), null, null); + } + + @Override + protected void applyPlatformSettings() { + } + + @Override + public ImmutableBlockState getBlockState(CompoundTag nbt) { + return this.cachedData.computeIfAbsent(nbt, k -> { + ImmutableBlockState state = new ImmutableBlockState(holder, new Reference2ObjectArrayMap<>()); + state.setNbtToSave(state.toNbtToSave(nbt)); + return state; + }); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/PackedBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/PackedBlockState.java new file mode 100644 index 000000000..9abfb6db8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/PackedBlockState.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.block; + +public record PackedBlockState(Object handle, int registryId) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/PushReaction.java b/core/src/main/java/net/momirealms/craftengine/core/block/PushReaction.java new file mode 100644 index 000000000..db1d653be --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/PushReaction.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.block; + +public enum PushReaction { + NORMAL, + DESTROY, + BLOCK, + IGNORE, + PUSH_ONLY +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/StatePredicate.java b/core/src/main/java/net/momirealms/craftengine/core/block/StatePredicate.java new file mode 100644 index 000000000..02c72350a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/StatePredicate.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.block; + +public class StatePredicate { + private static Object TRUE; + private static Object FALSE; + + public static void init(Object alwaysTrue, Object alwaysFalse) { + TRUE = alwaysTrue; + FALSE = alwaysFalse; + } + + public static Object alwaysTrue() { + return TRUE; + } + + public static Object alwaysFalse() { + return FALSE; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java b/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java new file mode 100644 index 000000000..98286d2ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java @@ -0,0 +1,73 @@ +package net.momirealms.craftengine.core.block; + +public class UpdateOption { + public static final UpdateOption UPDATE_ALL = new UpdateOption(3); + public static final UpdateOption UPDATE_NONE = new UpdateOption(4); + public static final UpdateOption UPDATE_ALL_IMMEDIATE = new UpdateOption(11); + private final int flags; + + private UpdateOption(int flags) { + this.flags = flags; + } + + public int flags() { + return flags; + } + + public static class Builder { + private int flags; + + public Builder() { + flags = 0; + } + + public Builder updateNeighbors() { + flags |= Flags.UPDATE_NEIGHBORS; + return this; + } + + public Builder updateClients() { + flags |= Flags.UPDATE_CLIENTS; + return this; + } + + public Builder updateInvisible() { + flags |= Flags.UPDATE_INVISIBLE; + return this; + } + + public Builder updateImmediate() { + flags |= Flags.UPDATE_IMMEDIATE; + return this; + } + + public Builder updateKnownShape() { + flags |= Flags.UPDATE_KNOWN_SHAPE; + return this; + } + + public Builder updateSuppressDrops() { + flags |= Flags.UPDATE_SUPPRESS_DROPS; + return this; + } + + public Builder updateMoveByPiston() { + flags |= Flags.UPDATE_MOVE_BY_PISTON; + return this; + } + + public UpdateOption build() { + return new UpdateOption(flags); + } + } + + public static class Flags { + public static final int UPDATE_NEIGHBORS = 1; + public static final int UPDATE_CLIENTS = 2; + public static final int UPDATE_INVISIBLE = 4; + public static final int UPDATE_IMMEDIATE = 8; + public static final int UPDATE_KNOWN_SHAPE = 16; + public static final int UPDATE_SUPPRESS_DROPS = 32; + public static final int UPDATE_MOVE_BY_PISTON = 64; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/VariantState.java b/core/src/main/java/net/momirealms/craftengine/core/block/VariantState.java new file mode 100644 index 000000000..e4e2924a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/VariantState.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.block; + +public class VariantState { + private final String appearance; + private final BlockSettings settings; + private final int internalId; + + public VariantState(String appearance, BlockSettings settings, int internalId) { + this.appearance = appearance; + this.settings = settings; + this.internalId = internalId; + } + + public String appearance() { + return appearance; + } + + public BlockSettings settings() { + return settings; + } + + public int internalRegistryId() { + return internalId; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviorFactory.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviorFactory.java new file mode 100644 index 000000000..630e7629b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviorFactory.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.block.behavior; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.shared.block.BlockBehavior; + +import java.util.Map; + +public interface BlockBehaviorFactory { + + BlockBehavior create(CustomBlock block, Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java new file mode 100644 index 000000000..8217b0000 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.block.behavior; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import net.momirealms.craftengine.shared.block.EmptyBlockBehavior; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class BlockBehaviors { + + public static void register(Key key, BlockBehaviorFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.BLOCK_BEHAVIOR_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static BlockBehavior fromMap(CustomBlock block, @Nullable Map map) { + if (map == null) return EmptyBlockBehavior.INSTANCE; + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("behavior type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + BlockBehaviorFactory factory = BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown behavior type: " + type); + } + return factory.create(block, map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java new file mode 100644 index 000000000..9541878ae --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java @@ -0,0 +1,80 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.sparrow.nbt.ByteTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class BooleanProperty extends Property { + public final static Factory FACTORY = new Factory(); + private static final List VALUES = List.of(true, false); + private static final Boolean[] BY_ID = new Boolean[]{ Boolean.FALSE, Boolean.TRUE }; + private static final ByteTag TRUE = new ByteTag((byte) 1); + private static final ByteTag FALSE = new ByteTag((byte) 0); + + private BooleanProperty(String name, boolean defaultValue) { + super(name, Boolean.class, defaultValue); + this.setById(BY_ID); + } + + @Override + public List possibleValues() { + return VALUES; + } + + @Override + public Optional optional(String valueName) { + return switch (valueName) { + case "true" -> Optional.of(true); + case "false" -> Optional.of(false); + default -> Optional.empty(); + }; + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(ByteTag::new); + } + + @Override + public Tag pack(Boolean value) { + return value ? TRUE : FALSE; + } + + @Override + public final int idFor(final Boolean value) { + return value ? 1 : 0; + } + + @Override + public String valueName(Boolean bool) { + return bool.toString(); + } + + @Override + public int indexOf(Boolean bool) { + return bool ? 0 : 1; + } + + @Override + public Boolean unpack(Tag tag) { + if (tag instanceof ByteTag byteTag) { + return byteTag.booleanValue(); + } + throw new IllegalArgumentException("Invalid boolean tag: " + tag); + } + + public static BooleanProperty create(String name, boolean defaultValue) { + return new BooleanProperty(name, defaultValue); + } + + public static class Factory implements PropertyFactory { + @Override + public Property create(String name, Map arguments) { + boolean bool = (boolean) arguments.getOrDefault("default", false); + return BooleanProperty.create(name, bool); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java new file mode 100644 index 000000000..7428f7d9b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java @@ -0,0 +1,126 @@ +package net.momirealms.craftengine.core.block.properties; + +import com.google.common.collect.ImmutableMap; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.sparrow.nbt.StringTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.lang.reflect.Array; +import java.util.*; + +public class EnumProperty> extends Property { + private final List values; + private final Map names; + private final int[] ordinalToIndex; + private final int[] idLookupTable; + + public EnumProperty(String name, Class type, List values, T defaultValue) { + super(name, type, defaultValue); + this.values = List.copyOf(values); + T[] enums = type.getEnumConstants(); + this.ordinalToIndex = new int[enums.length]; + + for (T enum_ : enums) { + this.ordinalToIndex[enum_.ordinal()] = values.indexOf(enum_); + } + + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (T enum2 : values) { + String string = enum2.name().toLowerCase(Locale.ENGLISH); + builder.put(string, enum2); + } + + this.names = builder.buildOrThrow(); + Class clazz = this.valueClass(); + + int id = 0; + this.idLookupTable = new int[clazz.getEnumConstants().length]; + Arrays.fill(this.idLookupTable, -1); + @SuppressWarnings("unchecked") + final T[] byId = (T[]) Array.newInstance(clazz, values.size()); + + for (final T value : values) { + int valueId = id++; + this.idLookupTable[value.ordinal()] = valueId; + byId[valueId] = value; + } + + this.setById(byId); + } + + @Override + public List possibleValues() { + return this.values; + } + + @Override + public Optional optional(String valueName) { + return Optional.ofNullable(this.names.get(valueName)); + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(it -> new StringTag(names.get(valueName).name().toLowerCase(Locale.ENGLISH))); + } + + @Override + public Tag pack(T value) { + return new StringTag(valueName(value)); + } + + @Override + public T unpack(Tag tag) { + if (tag instanceof StringTag stringTag) { + return names.get(stringTag.getAsString()); + } + throw new IllegalArgumentException("Invalid string tag: " + tag); + } + + @Override + public final int idFor(T value) { + final Class target = this.valueClass(); + return ((value.getClass() != target && value.getDeclaringClass() != target)) ? -1 : this.idLookupTable[value.ordinal()]; + } + + @Override + public String valueName(T enum_) { + return enum_.name().toLowerCase(Locale.ENGLISH); + } + + @Override + public int indexOf(T enum_) { + return this.ordinalToIndex[enum_.ordinal()]; + } + + @Override + public int generateHashCode() { + int i = super.generateHashCode(); + return 31 * i + this.values.hashCode(); + } + + public static > EnumProperty create(String name, Class type, List values, T defaultValue) { + return new EnumProperty<>(name, type, values, defaultValue); + } + + public static class Factory> implements PropertyFactory { + private final Class enumClass; + + public Factory(Class enumClass) { + this.enumClass = enumClass; + } + + @Override + public Property create(String name, Map arguments) { + List enums = Arrays.asList(enumClass.getEnumConstants()); + String defaultValueName = arguments.getOrDefault("default", "").toString().toLowerCase(Locale.ENGLISH); + A defaultValue = enums.stream() + .filter(e -> e.name().toLowerCase(Locale.ENGLISH).equals(defaultValueName)) + .findFirst() + .orElseGet(() -> { + CraftEngine.instance().logger().warn("Invalid default value '" + defaultValueName + "' for property '" + name + "'"); + return enums.get(0); + }); + return EnumProperty.create(name, enumClass, enums, defaultValue); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java new file mode 100644 index 000000000..4b17184ac --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java @@ -0,0 +1,98 @@ +package net.momirealms.craftengine.core.block.properties; + +import it.unimi.dsi.fastutil.ints.IntImmutableList; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.sparrow.nbt.IntTag; +import net.momirealms.sparrow.nbt.NumericTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.IntStream; + +public class IntegerProperty extends Property { + public static final Factory FACTORY = new Factory(); + private final IntImmutableList values; + public final int min; + public final int max; + + private IntegerProperty(String name, int min, int max, int defaultValue) { + super(name, Integer.class, defaultValue); + this.min = min; + this.max = max; + this.values = IntImmutableList.toList(IntStream.range(min, max + 1)); + + final Integer[] byId = new Integer[max - min + 1]; + for (int i = min; i <= max; ++i) { + byId[i - min] = i; + } + + this.setById(byId); + } + + @Override + public List possibleValues() { + return this.values; + } + + @Override + public Optional optional(String valueName) { + try { + int i = Integer.parseInt(valueName); + return i >= this.min && i <= this.max ? Optional.of(i) : Optional.empty(); + } catch (NumberFormatException var3) { + return Optional.empty(); + } + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(IntTag::new); + } + + @Override + public Tag pack(Integer value) { + return new IntTag(value); + } + + @Override + public final int idFor(final Integer value) { + final int ret = value - this.min; + return ret | ((this.max - ret) >> 31); + } + + @Override + public Integer unpack(Tag tag) { + if (tag instanceof NumericTag numericTag) { + return values.getInt(idFor(numericTag.getAsInt())); + } + throw new IllegalArgumentException("Invalid numeric tag: " + tag); + } + + @Override + public String valueName(Integer integer) { + return integer.toString(); + } + + @Override + public int indexOf(Integer integer) { + return integer <= this.max ? integer - this.min : -1; + } + + public static IntegerProperty create(String name, int min, int max, int defaultValue) { + return new IntegerProperty(name, min, max, defaultValue); + } + + public static class Factory implements PropertyFactory { + @Override + public Property create(String name, Map arguments) { + String range = arguments.getOrDefault("range", "1~1").toString(); + String[] split = range.split("~"); + int min = Integer.parseInt(split[0]); + int max = Integer.parseInt(split[1]); + int defaultValue = MiscUtils.getAsInt(arguments.getOrDefault("default", min)); + return IntegerProperty.create(name, min, max,defaultValue); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java new file mode 100644 index 000000000..36dc2ea84 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.HorizontalDirection; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class Properties { + public static final Key BOOLEAN = Key.of("craftengine:boolean"); + public static final Key INT = Key.of("craftengine:int"); + public static final Key AXIS = Key.of("craftengine:axis"); + public static final Key HORIZONTAL_DIRECTION = Key.of("craftengine:4-direction"); + public static final Key DIRECTION = Key.of("craftengine:6-direction"); + + static { + register(BOOLEAN, BooleanProperty.FACTORY); + register(INT, IntegerProperty.FACTORY); + register(AXIS, new EnumProperty.Factory<>(Direction.Axis.class)); + register(DIRECTION, new EnumProperty.Factory<>(Direction.class)); + register(HORIZONTAL_DIRECTION, new EnumProperty.Factory<>(HorizontalDirection.class)); + } + + public static void register(Key key, PropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.PROPERTY_FACTORY).registerForHolder(new ResourceKey<>(Registries.PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Property fromMap(String name, Map map) { + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("behavior type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + PropertyFactory factory = BuiltInRegistries.PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(name, map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Property.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Property.java new file mode 100644 index 000000000..d85dc93d1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Property.java @@ -0,0 +1,118 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.sparrow.nbt.Tag; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; + +public abstract class Property> { + private final Class clazz; + private final String name; + @Nullable + private Integer hashCode; + + private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); + private final int id; + private final T defaultValue; + private T[] byId; + private int defaultValueIndex; + + protected Property(String name, Class clazz, T defaultValue) { + this.clazz = clazz; + this.name = name; + this.id = ID_GENERATOR.getAndIncrement(); + this.defaultValue = defaultValue; + } + + public T defaultValue() { + return defaultValue; + } + + public int defaultValueIndex() { + return defaultValueIndex; + } + + public int id() { + return this.id; + } + + public T byId(int id) { + final T[] byId = this.byId; + return id < 0 || id >= byId.length ? null : this.byId[id]; + } + + protected void setById(T[] byId) { + if (this.byId != null) { + throw new IllegalStateException(); + } + this.byId = byId; + this.defaultValueIndex = indexOf(defaultValue); + } + + public Value value(T value) { + return new Value<>(this, value); + } + + public abstract int idFor(T value); + + public abstract String valueName(T value); + + public abstract List possibleValues(); + + public abstract Optional optional(String valueName); + + public abstract Optional createOptionalTag(String valueName); + + public abstract Tag pack(T value); + + public int indexOf(Tag tag) { + return indexOf(unpack(tag)); + } + + public abstract int indexOf(T value); + + public abstract T unpack(Tag tag); + + public String name() { + return this.name; + } + + public Class valueClass() { + return this.clazz; + } + + @Override + public boolean equals(Object object) { + return this == object; + } + + @Override + public final int hashCode() { + if (this.hashCode == null) { + this.hashCode = this.generateHashCode(); + } + return this.hashCode; + } + + protected int generateHashCode() { + return 31 * this.clazz.hashCode() + this.name.hashCode(); + } + + public record Value>(Property property, T value) { + public Value(Property property, T value) { + if (!property.possibleValues().contains(value)) { + throw new IllegalArgumentException("Value " + value + " does not belong to property " + property); + } else { + this.property = property; + this.value = value; + } + } + + @Override + public String toString() { + return this.property.name + "=" + this.property.valueName(this.value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java new file mode 100644 index 000000000..32ea8ee86 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.block.properties; + +import java.util.Map; + +public interface PropertyFactory { + + Property create(String name, Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java new file mode 100644 index 000000000..ce54550f5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.entity; + +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.World; + +public abstract class Entity { + + public abstract double x(); + + public abstract double y(); + + public abstract double z(); + + public abstract void tick(); + + public abstract int entityID(); + + public abstract float getXRot(); + + public abstract float getYRot(); + + public abstract World level(); + + public abstract Direction getDirection(); + + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AlignmentRule.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AlignmentRule.java new file mode 100644 index 000000000..983ca8529 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AlignmentRule.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.util.Pair; + +import java.util.function.Function; + +public enum AlignmentRule { + ANY(Function.identity()), + CORNER(pair -> { + double p1 = (double) Math.round(pair.left()); + double p2 = (double) Math.round(pair.right()); + return new Pair<>(p1, p2); + }), + CENTER(pair -> { + double p1 = Math.floor(pair.left()) + 0.5; + double p2 = Math.floor(pair.right()) + 0.5; + return new Pair<>(p1, p2); + }), + HALF(pair -> { + double p1 = Math.round(pair.left() * 2) / 2.0; + double p2 = Math.round(pair.right() * 2) / 2.0; + return new Pair<>(p1, p2); + }), + QUARTER(pair -> { + double p1 = Math.round(pair.left() * 4) / 4.0; + double p2 = Math.round(pair.right() * 4) / 4.0; + return new Pair<>(p1, p2); + }); + + private final Function, Pair> function; + + AlignmentRule(Function, Pair> function) { + this.function = function; + } + + public Pair apply(final Pair pair) { + return function.apply(pair); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AnchorType.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AnchorType.java new file mode 100644 index 000000000..d3a099b6f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AnchorType.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.entity.furniture; + +public enum AnchorType { + GROUND(0), + WALL(1), + CEILING(2); + + private final int id; + + AnchorType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static AnchorType byId(int id) { + return values()[id]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java new file mode 100644 index 000000000..16545019d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.entity.furniture; + +public enum Billboard { + FIXED(0), + VERTICAL(1), + HORIZONTAL(2), + CENTER(3); + + private final byte id; + + Billboard(int index) { + this.id = (byte) index; + } + + public byte id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java new file mode 100644 index 000000000..5e48e9c21 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.util.Key; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class FurnitureElement { + private final Key item; + private final Billboard billboard; + private final ItemDisplayContext transform; + private final Vector3f scale; + private final Vector3f translation; + private final Vector3f offset; + private final Quaternionf rotation; + + public FurnitureElement(Key item, Billboard billboard, ItemDisplayContext transform, Vector3f scale, Vector3f translation, Vector3f offset, Quaternionf rotation) { + this.billboard = billboard; + this.transform = transform; + this.scale = scale; + this.translation = translation; + this.item = item; + this.rotation = rotation; + this.offset = offset; + } + + public Quaternionf rotation() { + return rotation; + } + + public Key item() { + return item; + } + + public Billboard billboard() { + return billboard; + } + + public ItemDisplayContext transform() { + return transform; + } + + public Vector3f scale() { + return scale; + } + + public Vector3f translation() { + return translation; + } + + public Vector3f offset() { + return offset; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java new file mode 100644 index 000000000..f8859f211 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.plugin.Reloadable; + +public interface FurnitureManager extends Reloadable { + + void delayedLoad(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBox.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBox.java new file mode 100644 index 000000000..1ec2c1c82 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBox.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import org.joml.Vector3f; + +public class HitBox { + private final Vector3f position; + private final Vector3f size; + private final Seat[] seats; + private final boolean responsive; + + public HitBox(Vector3f position, Vector3f size, Seat[] seats, boolean responsive) { + this.position = position; + this.size = size; + this.seats = seats; + this.responsive = responsive; + } + + public boolean responsive() { + return responsive; + } + + public Seat[] seats() { + return seats; + } + + public Vector3f offset() { + return position; + } + + public Vector3f size() { + return size; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java new file mode 100644 index 000000000..2fbd54078 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.entity.furniture; + +public enum ItemDisplayContext { + NONE(0), + THIRD_PERSON_LEFT_HAND(1), + THIRD_PERSON_RIGHT_HAND(2), + FIRST_PERSON_LEFT_HAND(3), + FIRST_PERSON_RIGHT_HAND(4), + HEAD(5), + GUI(6), + GROUND(7), + FIXED(8); + + private final byte id; + + ItemDisplayContext(int index) { + this.id = (byte) index; + } + + public byte id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/RotationRule.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/RotationRule.java new file mode 100644 index 000000000..e30a3d0b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/RotationRule.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import java.util.function.Function; + +public enum RotationRule { + ANY(Function.identity()), + FOUR(yaw -> (float) (Math.round(yaw / 90) * 90)), + EIGHT(yaw -> (float) (Math.round(yaw / 45) * 45)), + SIXTEEN(yaw -> (float) (Math.round(yaw / 22.5) * 22.5)), + NORTH(__ -> 180f), + EAST(__ -> -90f), + WEST(__ -> 90f), + SOUTH(__ -> 0f); + + private final Function function; + + RotationRule(Function function) { + this.function = function; + } + + public float apply(float yaw) { + return function.apply(yaw); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Seat.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Seat.java new file mode 100644 index 000000000..885333703 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Seat.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import org.joml.Vector3f; + +import java.util.Objects; + +public record Seat(Vector3f offset, float yaw, boolean limitPlayerRotation) { + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Seat seat)) return false; + return Float.compare(yaw, seat.yaw) == 0 && Objects.equals(offset, seat.offset) && limitPlayerRotation == seat.limitPlayerRotation; + } + + @Override + public int hashCode() { + int result = Objects.hashCode(offset); + result = 31 * result + Float.hashCode(yaw); + result = 31 * result + Boolean.hashCode(limitPlayerRotation); + return result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionHand.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionHand.java new file mode 100644 index 000000000..0e3edc552 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionHand.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.entity.player; + +public enum InteractionHand { + MAIN_HAND, + OFF_HAND +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionResult.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionResult.java new file mode 100644 index 000000000..e426e244d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionResult.java @@ -0,0 +1,63 @@ +package net.momirealms.craftengine.core.entity.player; + +import net.momirealms.craftengine.core.item.Item; +import org.jetbrains.annotations.Nullable; + +public sealed interface InteractionResult + permits InteractionResult.Success, InteractionResult.Fail, InteractionResult.Pass, InteractionResult.TryEmptyHandInteraction { + + InteractionResult.Success SUCCESS = new InteractionResult.Success(InteractionResult.SwingSource.CLIENT, InteractionResult.ItemContext.DEFAULT); + InteractionResult.Success SUCCESS_SERVER = new InteractionResult.Success(InteractionResult.SwingSource.SERVER, InteractionResult.ItemContext.DEFAULT); + InteractionResult.Success CONSUME = new InteractionResult.Success(InteractionResult.SwingSource.NONE, InteractionResult.ItemContext.DEFAULT); + InteractionResult.Fail FAIL = new InteractionResult.Fail(); + InteractionResult.Pass PASS = new InteractionResult.Pass(); + InteractionResult.TryEmptyHandInteraction TRY_WITH_EMPTY_HAND = new InteractionResult.TryEmptyHandInteraction(); + + default boolean consumesAction() { + return false; + } + + record Fail() implements InteractionResult { + } + + record ItemContext(boolean wasItemInteraction, @Nullable Item heldItemTransformedTo) { + static InteractionResult.ItemContext NONE = new InteractionResult.ItemContext(false, null); + static InteractionResult.ItemContext DEFAULT = new InteractionResult.ItemContext(true, null); + } + + record Pass() implements InteractionResult { + } + + record Success(InteractionResult.SwingSource swingSource, InteractionResult.ItemContext itemContext) implements InteractionResult { + @Override + public boolean consumesAction() { + return true; + } + + public InteractionResult.Success heldItemTransformedTo(Item newHandStack) { + return new InteractionResult.Success(this.swingSource, new InteractionResult.ItemContext(true, newHandStack)); + } + + public InteractionResult.Success withoutItem() { + return new InteractionResult.Success(this.swingSource, InteractionResult.ItemContext.NONE); + } + + public boolean wasItemInteraction() { + return this.itemContext.wasItemInteraction; + } + + @Nullable + public Item heldItemTransformedTo() { + return this.itemContext.heldItemTransformedTo; + } + } + + enum SwingSource { + NONE, + CLIENT, + SERVER; + } + + record TryEmptyHandInteraction() implements InteractionResult { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java new file mode 100644 index 000000000..9fe9a5a67 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.core.entity.player; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.world.BlockPos; + +public abstract class Player extends Entity implements NetWorkUser { + + public abstract boolean isSecondaryUseActive(); + + public abstract Item getItemInHand(InteractionHand hand); + + @Override + public abstract Object platformPlayer(); + + @Override + public abstract Object serverPlayer(); + + public abstract float getDestroyProgress(Object blockState, BlockPos pos); + + public abstract void stopMiningBlock(); + + public abstract void abortMiningBlock(); + + public abstract double getInteractionRange(); + + public abstract void abortDestroyProgress(); + + public abstract void onSwingHand(); + + public abstract boolean isMiningBlock(); + + public abstract boolean shouldSyncAttribute(); + + public abstract boolean isSneaking(); + + public abstract boolean isCreativeMode(); + + public abstract boolean isSpectatorMode(); + + public abstract void sendActionBar(Component text); + + public abstract boolean updateLastSuccessfulInteractionTick(int tick); + + public abstract int gameTicks(); + + public abstract void swingHand(InteractionHand hand); + + public abstract boolean hasPermission(String permission); + + public abstract boolean canInstabuild(); + + public abstract String name(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java b/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java new file mode 100644 index 000000000..bc96bd66b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java @@ -0,0 +1,99 @@ +package net.momirealms.craftengine.core.font; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.Key; + +public class BitmapImage implements FontProvider { + private final Key imageId; + private final Key font; + private final int height; + private final int ascent; + private final String file; + private final int[][] codepointGrid; + + public BitmapImage(Key imageId, Key font, int height, int ascent, String file, int[][] codepointGrid) { + this.imageId = imageId; + this.font = font; + this.height = height; + this.ascent = ascent; + this.file = file; + this.codepointGrid = codepointGrid; + } + + public int height() { + return height; + } + + public int ascent() { + return ascent; + } + + public String file() { + return file; + } + + public Key font() { + return font; + } + + public Key imageId() { + return imageId; + } + + public int[][] codepointGrid() { + return codepointGrid; + } + + public int codepointAt(int row, int column) { + if (row < 0 || row >= codepointGrid.length || column < 0 || column >= codepointGrid[row].length) { + throw new IndexOutOfBoundsException("Invalid index: (" + row + ", " + column + ")"); + } + return codepointGrid[row][column]; + } + + @SuppressWarnings("all") + public Component componentAt(int row, int column) { + int codepoint = codepointAt(row, column); + return Component.text(new String(Character.toChars(codepoint))).font(net.kyori.adventure.key.Key.key(font().toString())); + } + + public boolean isValidCoordinate(int row, int column) { + return row >= 0 && row < codepointGrid.length && column >= 0 && column < codepointGrid[row].length; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + BitmapImage image = (BitmapImage) object; + return imageId.equals(image.imageId); + } + + @Override + public int hashCode() { + return imageId.hashCode(); + } + + @Override + public JsonObject getJson() { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("type", "bitmap"); + jsonObject.addProperty("height", height); + jsonObject.addProperty("ascent", ascent); + jsonObject.addProperty("file", file); + JsonArray charArray = new JsonArray(); + jsonObject.add("chars", charArray); + for (int[] codepoints : codepointGrid) { + StringBuilder stringBuilder = new StringBuilder(); + for (int codepoint : codepoints) { + stringBuilder.append(CharacterUtils.encodeCharsToUnicode(Character.toChars(codepoint))); + } + // to deceive Gson + charArray.add(stringBuilder.toString()); + } + return jsonObject; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/Font.java b/core/src/main/java/net/momirealms/craftengine/core/font/Font.java new file mode 100644 index 000000000..ffc3f6dd2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/Font.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; + +public class Font { + private final Key key; + private final HashMap idToCodepoint = new LinkedHashMap<>(); + + public Font(Key key) { + this.key = key; + } + + public boolean isCodepointInUse(int codepoint) { + if (codepoint == 0) return false; + return this.idToCodepoint.containsKey(codepoint); + } + + public BitmapImage getImageByCodepoint(int codepoint) { + return this.idToCodepoint.get(codepoint); + } + + public void registerCodepoint(int codepoint, BitmapImage image) { + this.idToCodepoint.put(codepoint, image); + } + + public Key key() { + return key; + } + + public Collection bitmapImages() { + return idToCodepoint.values().stream().distinct().toList(); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + Font font = (Font) object; + return key.equals(font.key); + } + + @Override + public int hashCode() { + return key.hashCode(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java new file mode 100644 index 000000000..d456305ac --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.FormatUtils; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.BiFunction; + +public interface FontManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "images"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Collection fontsInUse(); + + Optional bitmapImageByCodepoint(Key font, int codepoint); + + default Optional getBitmapImageByChars(Key font, char[] chars) { + return bitmapImageByCodepoint(font, CharacterUtils.charsToCodePoint(chars)); + } + + Optional bitmapImageByImageId(Key imageId); + + Optional getFontInUse(Key font); + + int codepointByImageId(Key imageId, int x, int y); + + default int codepointByImageId(Key imageId) { + return this.codepointByImageId(imageId, 0, 0); + } + + default char[] getCharsByImageId(Key imageId) { + return getCharsByImageId(imageId, 0, 0); + } + + default char[] getCharsByImageId(Key imageId, int x, int y) { + return Character.toChars(this.codepointByImageId(imageId, x, y)); + } + + String createOffsets(int offset, BiFunction tagFormatter); + + default String createMiniMessageOffsets(int offset) { + return createOffsets(offset, FormatUtils::miniMessageFont); + } + + default String createMineDownOffsets(int offset) { + return createOffsets(offset, FormatUtils::mineDownFont); + } + + default String createRawOffsets(int offset) { + return createOffsets(offset, (raw, font) -> raw); + } + + default int loadingSequence() { + return LoadingSequence.FONT; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontManagerImpl.java new file mode 100644 index 000000000..af1c7166a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/FontManagerImpl.java @@ -0,0 +1,153 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.PreConditions; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.function.BiFunction; + +public class FontManagerImpl implements FontManager { + private final CraftEngine plugin; + // namespace:font font + private final HashMap fonts = new HashMap<>(); + // namespace:id image + private final HashMap images = new HashMap<>(); + + private OffsetFont offsetFont; + + public FontManagerImpl(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void load() { + this.offsetFont = Optional.ofNullable(plugin.configManager().settings().getSection("offset-characters")) + .map(OffsetFont::new) + .orElse(null); + } + + @Override + public void unload() { + this.fonts.clear(); + this.images.clear(); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + int height = MiscUtils.getAsInt(section.get("height")); + int ascent = MiscUtils.getAsInt(section.get("ascent")); + if (PreConditions.runIfTrue(height < ascent, + () -> this.plugin.logger().warn(path, "Illegal ascent found at " + id + ". Height should be no lower than ascent"))) return; + + String file = (String) section.get("file"); + if (PreConditions.isNull(file, + () -> this.plugin.logger().warn(path, "`file` option is not set in image " + id))) return; + + String fontName = (String) section.getOrDefault("font", "minecraft:default"); + if (PreConditions.isNull(fontName, + () -> this.plugin.logger().warn(path, "`font` option is not set in image " + id))) return; + + Key fontKey = Key.withDefaultNamespace(fontName, id.namespace()); + // get the font + Font font = this.getOrCreateFont(fontKey); + List chars; + if (section.containsKey("chars")) { + chars = MiscUtils.getAsStringList(section.get("chars")).stream().map(it -> { + if (it.startsWith("\\u")) { + return CharacterUtils.decodeUnicodeToChars(it); + } else { + return it.toCharArray(); + } + }).toList(); + } else { + String character = (String) section.get("char"); + if (PreConditions.isNull(character, + () -> this.plugin.logger().warn(path, "`char` option is not set in image " + id))) return; + if (character.length() == 1) { + chars = List.of(character.toCharArray()); + } else { + chars = List.of(CharacterUtils.decodeUnicodeToChars(character)); + } + } + + int size = -1; + int[][] codepointGrid = new int[chars.size()][]; + for (int i = 0; i < chars.size(); ++i) { + int[] codepoints = CharacterUtils.charsToCodePoints(chars.get(i)); + for (int codepoint : codepoints) { + if (PreConditions.runIfTrue(font.isCodepointInUse(codepoint), + () -> this.plugin.logger().warn(path, String.format("Codepoint [%s] is already used in font [%s]", CharacterUtils.encodeCharsToUnicode(Character.toChars(codepoint)), font.key().toString())))) return; + } + codepointGrid[i] = codepoints; + if (size == -1) size = codepoints.length; + if (PreConditions.runIfTrue(size != codepoints.length, + () -> this.plugin.logger().warn(path, "Illegal chars format found at " + id))) return; + } + + if (PreConditions.runIfTrue(size == -1, + () -> this.plugin.logger().warn(path, "Illegal chars format found at " + id))) return; + + if (!file.endsWith(".png")) file += ".png"; + file = file.replace("\\", "/"); + Key namespacedPath = Key.of(file); + Path targetImageFile = pack.resourcePackFolder() + .resolve("assets") + .resolve(namespacedPath.namespace()) + .resolve("textures") + .resolve(namespacedPath.value()); + + if (PreConditions.runIfTrue(!Files.exists(targetImageFile), + () -> this.plugin.logger().warn(targetImageFile, "PNG file not found for image " + id))) return; + + BitmapImage bitmapImage = new BitmapImage(id, fontKey, height, ascent, file, codepointGrid); + for (int[] y : codepointGrid) { + for (int x : y) { + font.registerCodepoint(x, bitmapImage); + } + } + + this.images.put(id, bitmapImage); + } + + @Override + public Collection fontsInUse() { + return new ArrayList<>(this.fonts.values()); + } + + @Override + public Optional bitmapImageByCodepoint(Key font, int codepoint) { + return getFontInUse(font).map(f -> f.getImageByCodepoint(codepoint)); + } + + @Override + public Optional bitmapImageByImageId(Key id) { + return Optional.ofNullable(this.images.get(id)); + } + + @Override + public int codepointByImageId(Key key, int x, int y) { + BitmapImage image = this.images.get(key); + if (image == null) return -1; + return image.codepointAt(x, y); + } + + @Override + public String createOffsets(int offset, BiFunction tagFormatter) { + return Optional.ofNullable(this.offsetFont).map(it -> it.createOffset(offset, tagFormatter)).orElse(""); + } + + @Override + public Optional getFontInUse(Key key) { + return Optional.ofNullable(fonts.get(key)); + } + + private Font getOrCreateFont(Key key) { + return this.fonts.computeIfAbsent(key, Font::new); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java new file mode 100644 index 000000000..1a2621a38 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.font; + +import com.google.gson.JsonObject; + +public interface FontProvider { + + JsonObject getJson(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/OffsetFont.java b/core/src/main/java/net/momirealms/craftengine/core/font/OffsetFont.java new file mode 100644 index 000000000..eaa5e9444 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/OffsetFont.java @@ -0,0 +1,153 @@ +package net.momirealms.craftengine.core.font; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.util.CharacterUtils; + +import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; + +public class OffsetFont { + private final String font; + + private final String NEG_16; + private final String NEG_24; + private final String NEG_32; + private final String NEG_48; + private final String NEG_64; + private final String NEG_128; + private final String NEG_256; + + private final String POS_16; + private final String POS_24; + private final String POS_32; + private final String POS_48; + private final String POS_64; + private final String POS_128; + private final String POS_256; + + private final String[] negativeOffsets = new String[16]; + private final String[] positiveOffsets = new String[16]; + + private final Cache fastLookup = Caffeine.newBuilder() + .expireAfterWrite(5, TimeUnit.MINUTES) + .maximumSize(256) + .build(); + + public OffsetFont(Section section) { + font = section.getString("font", "minecraft:default"); + + NEG_16 = convertIfUnicode(section.getString("-16", "")); + NEG_24 = convertIfUnicode(section.getString("-24", "")); + NEG_32 = convertIfUnicode(section.getString("-32", "")); + NEG_48 = convertIfUnicode(section.getString("-48", "")); + NEG_64 = convertIfUnicode(section.getString("-64", "")); + NEG_128 = convertIfUnicode(section.getString("-128", "")); + NEG_256 = convertIfUnicode(section.getString("-256", "")); + POS_16 = convertIfUnicode(section.getString("16", "")); + POS_24 = convertIfUnicode(section.getString("24", "")); + POS_32 = convertIfUnicode(section.getString("32", "")); + POS_48 = convertIfUnicode(section.getString("48", "")); + POS_64 = convertIfUnicode(section.getString("64", "")); + POS_128 = convertIfUnicode(section.getString("128", "")); + POS_256 = convertIfUnicode(section.getString("256", "")); + + for (int i = 1; i <= 15; i++) { + negativeOffsets[i] = convertIfUnicode(section.getString("-" + i, "")); + positiveOffsets[i] = convertIfUnicode(section.getString(String.valueOf(i), "")); + } + } + + public String createOffset(int offset, BiFunction tagDecorator) { + if (offset == 0) return ""; + String raw = fastLookup.get(offset, k -> { + if (k > 0) { + return createPos(k); + } else { + return createNeg(-k); + } + }); + return tagDecorator.apply(raw, font); + } + + @SuppressWarnings("DuplicatedCode") + private String createPos(int offset) { + StringBuilder stringBuilder = new StringBuilder(); + while (offset >= 256) { + stringBuilder.append(POS_256); + offset -= 256; + } + if (offset >= 128) { + stringBuilder.append(POS_128); + offset -= 128; + } + if (offset >= 64) { + stringBuilder.append(POS_64); + offset -= 64; + } + if (offset >= 48) { + stringBuilder.append(POS_48); + offset -= 48; + } + if (offset >= 32) { + stringBuilder.append(POS_32); + offset -= 32; + } + if (offset >= 24) { + stringBuilder.append(POS_24); + offset -= 24; + } + if (offset >= 16) { + stringBuilder.append(POS_16); + offset -= 16; + } + if (offset == 0) return stringBuilder.toString(); + stringBuilder.append(positiveOffsets[offset]); + return stringBuilder.toString(); + } + + @SuppressWarnings("DuplicatedCode") + private String createNeg(int offset) { + StringBuilder stringBuilder = new StringBuilder(); + while (offset >= 256) { + stringBuilder.append(NEG_256); + offset -= 256; + } + if (offset >= 128) { + stringBuilder.append(NEG_128); + offset -= 128; + } + if (offset >= 64) { + stringBuilder.append(NEG_64); + offset -= 64; + } + if (offset >= 48) { + stringBuilder.append(NEG_48); + offset -= 48; + } + if (offset >= 32) { + stringBuilder.append(NEG_32); + offset -= 32; + } + if (offset >= 24) { + stringBuilder.append(NEG_24); + offset -= 24; + } + if (offset >= 16) { + stringBuilder.append(NEG_16); + offset -= 16; + } + if (offset == 0) return stringBuilder.toString(); + stringBuilder.append(negativeOffsets[offset]); + return stringBuilder.toString(); + } + + private String convertIfUnicode(String s) { + if (s.startsWith("\\u")) { + return new String(CharacterUtils.decodeUnicodeToChars(font)); + } else { + return s; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java new file mode 100644 index 000000000..7828c3f72 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -0,0 +1,242 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Optional; + +public class AbstractItem, I> implements Item { + private final ItemFactory factory; + private final ItemWrapper item; + + AbstractItem(ItemFactory factory, ItemWrapper item) { + this.factory = factory; + this.item = item; + } + + @Override + public Item damage(Integer data) { + this.factory.damage(this.item, data); + return this; + } + + @Override + public Optional damage() { + return this.factory.damage(this.item); + } + + @Override + public Item maxDamage(Integer data) { + this.factory.maxDamage(this.item, data); + return this; + } + + @Override + public Optional maxDamage() { + return this.factory.maxDamage(this.item); + } + + @SuppressWarnings("unchecked") + @Override + public Optional> getCustomItem() { + return ((ItemManager) factory.plugin.itemManager()).getCustomItem(id()); + } + + @Override + public Key id() { + return this.factory.id(this.item); + } + + @Override + public Key vanillaId() { + return this.factory.vanillaId(this.item); + } + + @Override + public Optional customId() { + return this.factory.customId(this.item); + } + + @Override + public int count() { + return this.item.count(); + } + + @Override + public Item count(int amount) { + this.item.count(amount); + return this; + } + + @Override + public Item customModelData(Integer data) { + this.factory.customModelData(this.item, data); + return this; + } + + @Override + public Optional customModelData() { + return this.factory.customModelData(this.item); + } + + @Override + public Optional displayName() { + return this.factory.displayName(this.item); + } + + @Override + public Item lore(List lore) { + this.factory.lore(this.item, lore); + return this; + } + + @Override + public Optional> lore() { + return this.factory.lore(this.item); + } + + @Override + public Item unbreakable(boolean unbreakable) { + this.factory.unbreakable(this.item, unbreakable); + return this; + } + + @Override + public boolean unbreakable() { + return this.factory.unbreakable(this.item); + } + + @Override + public Item displayName(String displayName) { + this.factory.displayName(this.item, displayName); + return this; + } + + @Override + public Item skull(String data) { + this.factory.skull(this.item, data); + return this; + } + + @Override + public Optional getEnchantment(Key enchantmentId) { + return this.factory.getEnchantment(this.item, enchantmentId); + } + + @Override + public Item setEnchantments(List enchantments) { + this.factory.enchantments(this.item, enchantments); + return this; + } + + @Override + public Item addEnchantment(Enchantment enchantment) { + this.factory.addEnchantment(this.item, enchantment); + return this; + } + + @Override + public Item setStoredEnchantments(List enchantments) { + this.factory.storedEnchantments(this.item, enchantments); + return this; + } + + @Override + public Item addStoredEnchantment(Enchantment enchantment) { + this.factory.addStoredEnchantment(this.item, enchantment); + return this; + } + + @Override + public int maxStackSize() { + return this.factory.maxStackSize(this.item); + } + + @Override + public Item maxStackSize(int amount) { + this.factory.maxStackSize(this.item, amount); + return this; + } + + @Override + public Item itemFlags(List flags) { + this.factory.itemFlags(this.item, flags); + return this; + } + + @Override + public Object getTag(Object... path) { + return this.factory.getTag(this.item, path); + } + + @Override + public Item setTag(Object value, Object... path) { + this.factory.setTag(this.item, value, path); + return this; + } + + @Override + public boolean hasTag(Object... path) { + return this.factory.hasTag(this.item, path); + } + + @Override + public boolean removeTag(Object... path) { + return this.factory.removeTag(this.item, path); + } + + @Override + public boolean hasComponent(String type) { + return this.factory.hasComponent(this.item, type); + } + + @Override + public void removeComponent(String type) { + this.factory.removeComponent(this.item, type); + } + + @Override + public Object getComponent(String type) { + return this.factory.getComponent(this.item, type); + } + + @Override + public void setComponent(String type, Object value) { + this.factory.setComponent(this.item, type, value); + } + + @Override + public I getItem() { + return this.factory.getItem(this.item); + } + + @Override + public I load() { + return this.factory.load(this.item); + } + + @Override + public I loadCopy() { + return this.factory.loadCopy(this.item); + } + + @Override + public void update() { + this.factory.update(this.item); + } + + @Override + public Item copyWithCount(int count) { + return new AbstractItem<>(this.factory, this.item.copyWithCount(count)); + } + + @Override + public boolean is(Key itemTag) { + return this.factory.is(this.item, itemTag); + } + + @Override + public Object getLiteralObject() { + return this.item.getLiteralObject(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java new file mode 100644 index 000000000..591e5faae --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.item.modifier.*; +import net.momirealms.craftengine.core.pack.generator.AbstractModelGenerator; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.TypeUtils; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +public abstract class AbstractItemManager extends AbstractModelGenerator implements ItemManager { + protected final Map>> dataFunctions = new HashMap<>(); + protected final Map> customItems = new HashMap<>(); + + private void registerDataFunction(Function> function, String... alias) { + for (String a : alias) { + dataFunctions.put(a, function); + } + } + + @Override + public void unload() { + this.customItems.clear(); + super.clearModelsToGenerate(); + } + + @Override + public void load() { + } + + @Override + public Optional> getCustomItem(Key key) { + return Optional.ofNullable(this.customItems.get(key)); + } + + public AbstractItemManager(CraftEngine plugin) { + super(plugin); + this.registerFunctions(); + } + + private void registerFunctions() { + registerDataFunction((obj) -> { + String name = TypeUtils.checkType(obj, String.class); + return new DisplayNameModifier<>(name); + }, "name", "display-name", "custom-name"); + registerDataFunction((obj) -> { + @SuppressWarnings("unchecked") + List name = (List) TypeUtils.checkType(obj, List.class); + return new LoreModifier<>(name); + }, "lore", "display-lore", "description"); + registerDataFunction((obj) -> { + Map data = MiscUtils.castToMap(obj, false); + return new TagsModifier<>(data); + }, "tags", "tag", "nbt"); + if (VersionHelper.isVersionNewerThan1_20_5()) { + registerDataFunction((obj) -> { + Map data = MiscUtils.castToMap(obj, false); + return new ComponentModifier<>(data); + }, "components", "component"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java new file mode 100644 index 000000000..01e4db8d0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; + +public interface BuildableItem { + + I buildItemStack(Player player, int count); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java new file mode 100644 index 000000000..0651ad559 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item; + +import net.kyori.adventure.key.Key; + +public class ComponentKeys { + public static final String CUSTOM_MODEL_DATA = Key.key("minecraft", "custom_model_data").asString(); + public static final String CUSTOM_NAME = Key.key("minecraft", "custom_name").asString(); + public static final String LORE = Key.key("minecraft", "lore").asString(); + public static final String DAMAGE = Key.key("minecraft", "damage").asString(); + public static final String MAX_DAMAGE = Key.key("minecraft", "max_damage").asString(); + public static final String ENCHANTMENT_GLINT_OVERRIDE = Key.key("minecraft", "enchantment_glint_override").asString(); + public static final String ENCHANTMENTS = Key.key("minecraft", "enchantments").asString(); + public static final String STORED_ENCHANTMENTS = Key.key("minecraft", "stored_enchantments").asString(); + public static final String UNBREAKABLE = Key.key("minecraft", "unbreakable").asString(); + public static final String MAX_STACK_SIZE = Key.key("minecraft", "max_stack_size").asString(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ConstantItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/ConstantItem.java new file mode 100644 index 000000000..e11483185 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ConstantItem.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; + +public class ConstantItem implements BuildableItem { + private final I item; + + public ConstantItem(I item) { + this.item = item; + } + + @Override + public I buildItemStack(Player player, int count) { + return item; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java new file mode 100644 index 000000000..4934e5938 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemModifier; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public interface CustomItem extends BuildableItem { + + Key id(); + + Key material(); + + List> modifiers(); + + default I buildItemStack(Player player) { + return this.buildItemStack(player, 1); + } + + I buildItemStack(Player player, int count); + + Item buildItem(Player player); + + ItemBehavior behavior(); + + interface Builder { + Builder id(Key id); + + Builder material(Key material); + + Builder modifiers(List> modifiers); + + Builder modifier(ItemModifier modifier); + + Builder behavior(ItemBehavior behavior); + + CustomItem build(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java b/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java new file mode 100644 index 000000000..80cb64a05 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.util.Key; + +public record Enchantment(Key id, int level) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java new file mode 100644 index 000000000..5ea7e299a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -0,0 +1,100 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Optional; + +/** + * Interface representing an item. + * This interface provides methods for managing item properties such as custom model data, + * damage, display name, lore, enchantments, and tags. + * + * @param the type of the item implementation + */ +public interface Item { + + Optional> getCustomItem(); + + Key id(); + + Key vanillaId(); + + Optional customId(); + + int count(); + + Item count(int amount); + + Item customModelData(Integer data); + + Optional customModelData(); + + Item damage(Integer data); + + Optional damage(); + + Item maxDamage(Integer data); + + Optional maxDamage(); + + Item displayName(String displayName); + + Optional displayName(); + + Item lore(List lore); + + Optional> lore(); + + Item unbreakable(boolean unbreakable); + + boolean unbreakable(); + + Item skull(String data); + + Optional getEnchantment(Key enchantmentId); + + Item setEnchantments(List enchantments); + + Item addEnchantment(Enchantment enchantment); + + Item setStoredEnchantments(List enchantments); + + Item addStoredEnchantment(Enchantment enchantment); + + Item itemFlags(List flags); + + Object getTag(Object... path); + + Item setTag(Object value, Object... path); + + boolean hasTag(Object... path); + + boolean removeTag(Object... path); + + boolean hasComponent(String type); + + void removeComponent(String type); + + Object getComponent(String type); + + void setComponent(String type, Object value); + + I getItem(); + + I load(); + + I loadCopy(); + + void update(); + + int maxStackSize(); + + Item maxStackSize(int amount); + + Item copyWithCount(int count); + + boolean is(Key itemTag); + + Object getLiteralObject(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java new file mode 100644 index 000000000..345257250 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -0,0 +1,103 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public abstract class ItemFactory

+ * The folder structure allows users to organize and manage + * resource packs and configurations provided by external sources. + *

+ * This class provides access to the resource pack folder + * and configuration folder within the specified directory. + */ +public class Pack { + private final Path folder; + private final PackMeta meta; + + public Pack(Path folder, PackMeta meta) { + this.folder = folder; + this.meta = meta; + } + + public String namespace() { + return meta.namespace(); + } + + public PackMeta meta() { + return meta; + } + + public Path folder() { + return folder; + } + + /** + * Returns the 'resourcepack' folder within the specified directory, + * used for storing third-party resource packs. + */ + public Path resourcePackFolder() { + return folder.resolve("resourcepack"); + } + + /** + * Returns the 'configuration' folder within the specified directory, + * used for storing configuration files related to the resource packs. + */ + public Path configurationFolder() { + return folder.resolve("configuration"); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java new file mode 100644 index 000000000..88f891e84 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.pack; + +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public interface PackManager extends Reloadable { + + @NotNull + Collection loadedPacks(); + + boolean registerConfigSectionParser(ConfigSectionParser parser); + + boolean unregisterConfigSectionParser(String id); + + default boolean unregisterConfigSectionParser(ConfigSectionParser parser) { + return this.unregisterConfigSectionParser(parser.sectionId()); + } + + void generateResourcePack(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManagerImpl.java new file mode 100644 index 000000000..b3bf6d5af --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManagerImpl.java @@ -0,0 +1,582 @@ +package net.momirealms.craftengine.core.pack; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.font.BitmapImage; +import net.momirealms.craftengine.core.font.Font; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.generator.ModelGenerator; +import net.momirealms.craftengine.core.pack.model.ItemModel; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor; +import net.momirealms.craftengine.core.util.*; +import org.jetbrains.annotations.NotNull; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.*; + +import static net.momirealms.craftengine.core.util.MiscUtils.castToMap; + +public class PackManagerImpl implements PackManager { + private static final String LEGACY_TEMPLATES = PluginProperties.getValue("legacy-templates").replace(".", "_"); + private static final String LATEST_TEMPLATES = PluginProperties.getValue("latest-templates").replace(".", "_"); + private final CraftEngine plugin; + private final Map loadedPacks = new HashMap<>(); + private final Map sectionParsers = new HashMap<>(); + private final TreeMap> cachedConfigs = new TreeMap<>(); + + public PackManagerImpl(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void load() { + this.loadPacks(); + this.loadConfigs(); + } + + @Override + public void unload() { + this.loadedPacks.clear(); + this.cachedConfigs.clear(); + } + + @NotNull + @Override + public Collection loadedPacks() { + return this.loadedPacks.values(); + } + + @Override + public boolean registerConfigSectionParser(ConfigSectionParser parser) { + if (this.sectionParsers.containsKey(parser.sectionId())) return false; + this.sectionParsers.put(parser.sectionId(), parser); + return true; + } + + @Override + public boolean unregisterConfigSectionParser(String id) { + if (!this.sectionParsers.containsKey(id)) return false; + this.sectionParsers.remove(id); + return true; + } + + private void loadPacks() { + Path resourcesFolder = this.plugin.dataFolderPath().resolve("resources"); + try { + if (Files.notExists(resourcesFolder)) { + Files.createDirectories(resourcesFolder); + this.saveDefaultConfigs(); + } + + try (DirectoryStream paths = Files.newDirectoryStream(resourcesFolder)) { + for (Path path : paths) { + if (!Files.isDirectory(path)) { + this.plugin.logger().warn(path.toAbsolutePath() + " is not a directory"); + continue; + } + Path metaFile = path.resolve("pack.yml"); + String namespace = path.getFileName().toString(); + String description = null; + String version = null; + String author = null; + if (Files.exists(metaFile) && Files.isRegularFile(metaFile)) { + YamlDocument metaYML = plugin.loadYamlData(metaFile.toFile()); + namespace = metaYML.getString("namespace", namespace); + description = metaYML.getString("description"); + version = metaYML.getString("version"); + author = metaYML.getString("author"); + } + Pack pack = new Pack(path, new PackMeta(author, description, version, namespace)); + this.loadedPacks.put(path.getFileName().toString(), pack); + this.plugin.logger().info("Loaded pack: " + pack.folder().getFileName()); + } + } + } catch (IOException e) { + this.plugin.logger().severe("Error loading packs", e); + } + } + + private void saveDefaultConfigs() { + // internal + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json"); + // pack info + plugin.saveResource("resources/default/pack.yml"); + plugin.saveResource("resources/internal/pack.yml"); + // pack meta + plugin.saveResource("resources/default/resourcepack/pack.mcmeta"); + plugin.saveResource("resources/default/resourcepack/pack.png"); + // templates + plugin.saveResource("resources/default/configuration/templates.yml"); + // offset + plugin.saveResource("resources/internal/configuration/offset_chars.yml"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png"); + // icons + plugin.saveResource("resources/default/configuration/icons.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png"); + // items + plugin.saveResource("resources/default/configuration/items.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/beginner_rod_cast.png"); + // ores + plugin.saveResource("resources/default/configuration/ores.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta"); + // palm tree + plugin.saveResource("resources/default/configuration/palm_tree.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png"); + // fairy flower + plugin.saveResource("resources/default/configuration/fairy_flower.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json"); + // furniture + plugin.saveResource("resources/default/configuration/furnitures.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png"); + } + + private void loadConfigs() { + for (Pack pack : loadedPacks()) { + List files = FileUtils.getConfigsDeeply(pack.configurationFolder()); + for (Path path : files) { + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions())); + try (InputStreamReader inputStream = new InputStreamReader(new FileInputStream(path.toFile()), StandardCharsets.UTF_8)) { + Map data = yaml.load(inputStream); + if (data == null) continue; + for (Map.Entry entry : data.entrySet()) { + if (entry.getValue() instanceof Map typeSections0) { + String configType = entry.getKey(); + Optional.ofNullable(this.sectionParsers.get(configType)) + .ifPresent(parser -> { + this.cachedConfigs.computeIfAbsent(parser, k -> new ArrayList<>()).add(new CachedConfig(castToMap(typeSections0, false), path, pack)); + }); + } + } + } catch (IOException e) { + this.plugin.logger().warn(path, "Error loading config file", e); + } + } + } + for (Map.Entry> entry : this.cachedConfigs.entrySet()) { + ConfigSectionParser parser = entry.getKey(); + this.plugin.logger().info("Loading config type: " + parser.sectionId()); + for (CachedConfig cached : entry.getValue()) { + for (Map.Entry configEntry : cached.config().entrySet()) { + String key = configEntry.getKey(); + try { + Key id = Key.withDefaultNamespace(key, cached.pack().namespace()); + if (configEntry.getValue() instanceof Map configSection0) { + Map configSection1 = castToMap(configSection0, false); + if ((boolean) configSection1.getOrDefault("enable", true)) { + parser.parseSection(cached.pack(), cached.filePath(), id, plugin.templateManager().applyTemplates(configSection1)); + } + } else { + this.plugin.logger().warn(cached.filePath(), "Configuration section is required for " + parser.sectionId() + "." + configEntry.getKey() + " - "); + } + } catch (Exception e) { + this.plugin.logger().warn(cached.filePath(), "Error loading " + parser.sectionId() + "." + key, e); + } + } + } + } + } + + @Override + public void generateResourcePack() { + plugin.logger().info("Generating resource pack..."); + long start = System.currentTimeMillis(); + // get the target location + Path generatedPackPath = plugin.dataFolderPath() + .resolve("generated") + .resolve("resource_pack"); + + try { + org.apache.commons.io.FileUtils.deleteDirectory(generatedPackPath.toFile()); + } catch (IOException e) { + plugin.logger().severe("Error deleting previous resource pack", e); + } + + // firstly merge existing folders + try { + List duplicated = FileUtils.mergeFolder(loadedPacks().stream().map(Pack::resourcePackFolder).toList(), generatedPackPath); + if (!duplicated.isEmpty()) { + for (Path path : duplicated) { + plugin.logger().warn("Duplicated files - " + path.toAbsolutePath()); + } + } + } catch (IOException e) { + plugin.logger().severe("Error merging resource pack", e); + } + + this.generateFonts(generatedPackPath); + this.generateLegacyItemOverrides(generatedPackPath); + this.generateModernItemOverrides(generatedPackPath); + this.generateBlockOverrides(generatedPackPath); + this.generateItemModels(generatedPackPath, plugin.itemManager()); + this.generateItemModels(generatedPackPath, plugin.blockManager()); + this.generateSounds(generatedPackPath); + + Path zipFile = plugin.dataFolderPath() + .resolve("generated") + .resolve("resource_pack.zip"); + try { + ZipUtils.zipDirectory(generatedPackPath, zipFile); + } catch (IOException e) { + plugin.logger().severe("Error zipping resource pack", e); + } + + long end = System.currentTimeMillis(); + plugin.logger().info("Finished generating resource pack in " + (end - start) + "ms"); + } + + private void generateSounds(Path generatedPackPath) { + if (!ConfigManager.enableSoundSystem()) return; + + Path soundPath = generatedPackPath + .resolve("assets") + .resolve("minecraft") + .resolve("sounds.json"); + + JsonObject soundTemplate; + try (InputStream inputStream = plugin.resourceStream("internal/sounds.json")) { + if (inputStream == null) { + plugin.logger().warn("Failed to load internal/sounds.json"); + return; + } + soundTemplate = JsonParser.parseReader(new InputStreamReader(inputStream)).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load internal/sounds.json", e); + return; + } + + JsonObject soundJson; + if (Files.exists(soundPath)) { + try (BufferedReader reader = Files.newBufferedReader(soundPath)) { + soundJson = JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing sounds.json", e); + return; + } + } else { + soundJson = new JsonObject(); + } + + for (Map.Entry mapper : plugin.blockManager().soundMapper().entrySet()) { + Key originalKey = mapper.getKey(); + JsonObject empty = new JsonObject(); + empty.add("sounds", new JsonArray()); + empty.addProperty("replace", true); + soundJson.add(originalKey.value(), empty); + JsonObject originalSounds = soundTemplate.getAsJsonObject(originalKey.value()); + if (originalSounds != null) { + soundJson.add(mapper.getValue().value(), originalSounds); + } else { + plugin.logger().warn("Cannot find " + originalKey.value() + " in sound template"); + } + } + + try { + Files.createDirectories(soundPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + soundPath.toAbsolutePath()); + return; + } + + try (BufferedWriter writer = Files.newBufferedWriter(soundPath)) { + GsonHelper.get().toJson(soundJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to generate sounds.json: " + soundPath.toAbsolutePath(), e); + } + } + + private void generateItemModels(Path generatedPackPath, ModelGenerator generator) { + for (ModelGeneration generation : generator.modelsToGenerate()) { + Path modelPath = generatedPackPath + .resolve("assets") + .resolve(generation.path().namespace()) + .resolve("models") + .resolve(generation.path().value() + ".json"); + + if (Files.exists(modelPath)) { + plugin.logger().warn("Failed to generate model because " + modelPath.toAbsolutePath() + " already exists"); + continue; + } + + try { + Files.createDirectories(modelPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + modelPath.toAbsolutePath()); + continue; + } + + try (BufferedWriter writer = Files.newBufferedWriter(modelPath)) { + GsonHelper.get().toJson(generation.getJson(), writer); + } catch (IOException e) { + plugin.logger().warn("Failed to generate model: " + modelPath.toAbsolutePath(), e); + } + } + } + + private void generateBlockOverrides(Path generatedPackPath) { + File blockStatesFile = new File(plugin.dataFolderFile(), "blockstates.yml"); + if (!blockStatesFile.exists()) plugin.saveResource("blockstates.yml"); + YamlDocument preset = plugin.loadYamlData(blockStatesFile); + for (Map.Entry> entry : plugin.blockManager().blockOverrides().entrySet()) { + Key key = entry.getKey(); + Path overridedBlockPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("blockstates") + .resolve(key.value() + ".json"); + JsonObject stateJson = new JsonObject(); + JsonObject variants = new JsonObject(); + stateJson.add("variants", variants); + Section presetSection = preset.getSection(key.toString()); + if (presetSection != null) { + for (Map.Entry presetEntry : presetSection.getStringRouteMappedValues(false).entrySet()) { + if (presetEntry.getValue() instanceof Section section) { + variants.add(presetEntry.getKey(), YamlUtils.sectionToJson(section)); + } + } + } + for (Map.Entry resourcePathEntry : entry.getValue().entrySet()) { + variants.add(resourcePathEntry.getKey(), resourcePathEntry.getValue()); + } + try { + Files.createDirectories(overridedBlockPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + overridedBlockPath.toAbsolutePath()); + continue; + } + try (BufferedWriter writer = Files.newBufferedWriter(overridedBlockPath)) { + GsonHelper.get().toJson(stateJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateModernItemOverrides(Path generatedPackPath) { + if (ConfigManager.packMaxVersion() < 21.39f) return; + for (Map.Entry> entry : plugin.itemManager().modernItemOverrides().entrySet()) { + Key key = entry.getKey(); + Path overridedItemPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("items") + .resolve(key.value() + ".json"); + + JsonObject originalItemModel; + if (Files.exists(overridedItemPath)) { + try (BufferedReader reader = Files.newBufferedReader(overridedItemPath)) { + originalItemModel = JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing item model", e); + continue; + } + } else { + try (InputStream inputStream = plugin.resourceStream("internal/templates_" + LATEST_TEMPLATES + "/" + key.namespace() + "/items/" + key.value() + ".json")) { + if (inputStream == null) { + plugin.logger().warn("Failed to use [" + key + "] for base model"); + continue; + } + originalItemModel = JsonParser.parseReader(new InputStreamReader(inputStream)).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load item model", e); + continue; + } + } + + boolean handAnimationOnSwap = Optional.ofNullable(originalItemModel.get("hand_animation_on_swap")).map(JsonElement::getAsBoolean).orElse(true); + JsonObject fallbackModel = originalItemModel.get("model").getAsJsonObject(); + + JsonObject newJson = new JsonObject(); + JsonObject model = new JsonObject(); + newJson.add("model", model); + model.addProperty("type", "minecraft:range_dispatch"); + model.addProperty("property", "minecraft:custom_model_data"); + if (!handAnimationOnSwap) { + model.addProperty("hand_animation_on_swap", false); + } + model.add("fallback", fallbackModel); + JsonArray entries = new JsonArray(); + model.add("entries", entries); + for (Map.Entry modelWithDataEntry : entry.getValue().entrySet()) { + JsonObject entryObject = new JsonObject(); + entryObject.addProperty("threshold", modelWithDataEntry.getKey()); + entryObject.add("model", modelWithDataEntry.getValue().get()); + entries.add(entryObject); + } + try { + Files.createDirectories(overridedItemPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + overridedItemPath.toAbsolutePath()); + continue; + } + try (BufferedWriter writer = Files.newBufferedWriter(overridedItemPath)) { + GsonHelper.get().toJson(newJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateLegacyItemOverrides(Path generatedPackPath) { + if (ConfigManager.packMinVersion() > 21.39f) return; + for (Map.Entry> entry : plugin.itemManager().legacyItemOverrides().entrySet()) { + Key key = entry.getKey(); + Path overridedItemPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("models") + .resolve("item") + .resolve(key.value() + ".json"); + + JsonObject originalItemModel; + if (Files.exists(overridedItemPath)) { + try (BufferedReader reader = Files.newBufferedReader(overridedItemPath)) { + originalItemModel = JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing item model", e); + continue; + } + } else { + try (InputStream inputStream = plugin.resourceStream("internal/templates_" + LEGACY_TEMPLATES + "/" + key.namespace() + "/items/" + key.value() + ".json")) { + if (inputStream == null) { + plugin.logger().warn("Failed to use [" + key + "] for base model"); + continue; + } + originalItemModel = JsonParser.parseReader(new InputStreamReader(inputStream)).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load item model", e); + continue; + } + } + if (originalItemModel == null) { + plugin.logger().warn("Failed to load item model for [" + key + "]"); + continue; + } + JsonArray overrides; + if (originalItemModel.has("overrides")) { + overrides = originalItemModel.getAsJsonArray("overrides"); + } else { + overrides = new JsonArray(); + originalItemModel.add("overrides", overrides); + } + Collection legacyOverridesModels = entry.getValue(); + for (LegacyOverridesModel model : legacyOverridesModels) { + overrides.add(model.toJson()); + } + try { + Files.createDirectories(overridedItemPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + overridedItemPath.toAbsolutePath()); + continue; + } + + try (BufferedWriter writer = Files.newBufferedWriter(overridedItemPath)) { + GsonHelper.get().toJson(originalItemModel, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateFonts(Path generatedPackPath) { + // generate image font json + for (Font font : plugin.fontManager().fontsInUse()) { + Key namespacedKey = font.key(); + Path fontPath = generatedPackPath.resolve("assets") + .resolve(namespacedKey.namespace()) + .resolve("font") + .resolve(namespacedKey.value() + ".json"); + + JsonObject fontJson; + if (Files.exists(fontPath)) { + try { + String content = Files.readString(fontPath); + fontJson = JsonParser.parseString(content).getAsJsonObject(); + } catch (IOException e) { + fontJson = new JsonObject(); + plugin.logger().warn(fontPath + " is not a valid font json file"); + } + } else { + fontJson = new JsonObject(); + try { + Files.createDirectories(fontPath.getParent()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + JsonArray providers; + if (fontJson.has("providers")) { + providers = fontJson.getAsJsonArray("providers"); + } else { + providers = new JsonArray(); + fontJson.add("providers", providers); + } + + for (BitmapImage image : font.bitmapImages()) { + providers.add(image.getJson()); + } + + try (FileWriter fileWriter = new FileWriter(fontPath.toFile())) { + fileWriter.write(fontJson.toString().replace("\\\\u", "\\u")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + if (ConfigManager.resourcePack$overrideUniform()) { + Path fontPath = generatedPackPath.resolve("assets") + .resolve("minecraft") + .resolve("font") + .resolve("default.json"); + if (Files.exists(fontPath)) { + Path targetPath = generatedPackPath.resolve("assets") + .resolve("minecraft") + .resolve("font") + .resolve("uniform.json"); + try { + Files.copy(fontPath, targetPath, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackMeta.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackMeta.java new file mode 100644 index 000000000..7a1d5c0b3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackMeta.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.pack; + +public record PackMeta(String author, String description, String version, String namespace) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/generator/AbstractModelGenerator.java b/core/src/main/java/net/momirealms/craftengine/core/pack/generator/AbstractModelGenerator.java new file mode 100644 index 000000000..77e32d1ce --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/generator/AbstractModelGenerator.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.generator; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public abstract class AbstractModelGenerator implements ModelGenerator { + protected final CraftEngine plugin; + protected final Map modelsToGenerate = new HashMap<>(); + + public AbstractModelGenerator(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public Collection modelsToGenerate() { + return this.modelsToGenerate.values(); + } + + @Override + public void clearModelsToGenerate() { + this.modelsToGenerate.clear(); + } + + @Override + public void prepareModelGeneration(ModelGeneration model) { + ModelGeneration generation = this.modelsToGenerate.get(model.path()); + if (generation != null) { + if (generation.equals(model)) { + return; + } + this.plugin.logger().severe("Two or more configurations attempt to generate different json models with the same path: " + model.path()); + return; + } + this.modelsToGenerate.put(model.path(), model); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/generator/ModelGeneration.java b/core/src/main/java/net/momirealms/craftengine/core/pack/generator/ModelGeneration.java new file mode 100644 index 000000000..b401fe9f1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/generator/ModelGeneration.java @@ -0,0 +1,96 @@ +package net.momirealms.craftengine.core.pack.generator; + +import com.google.gson.JsonObject; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +public class ModelGeneration { + private final Key path; + private final String parentModelPath; + private final Map texturesOverride; + + public ModelGeneration(Key path, String parentModelPath, Map texturesOverride) { + this.path = path; + this.parentModelPath = parentModelPath; + this.texturesOverride = texturesOverride; + } + + public ModelGeneration(Key path, Section section) { + this.path = path; + this.parentModelPath = Objects.requireNonNull(section.getString("parent")); + Section texturesSection = section.getSection("textures"); + if (texturesSection != null) { + this.texturesOverride = new LinkedHashMap<>(); + for (Map.Entry entry : texturesSection.getStringRouteMappedValues(false).entrySet()) { + if (entry.getValue() instanceof String p) { + this.texturesOverride.put(entry.getKey(), p); + } + } + } else { + this.texturesOverride = Collections.emptyMap(); + } + } + + public ModelGeneration(Key path, Map map) { + this.path = path; + this.parentModelPath = Objects.requireNonNull((String) map.get("parent")); + Map texturesMap = MiscUtils.castToMap(map.get("textures"), true); + if (texturesMap != null) { + this.texturesOverride = new LinkedHashMap<>(); + for (Map.Entry entry : texturesMap.entrySet()) { + if (entry.getValue() instanceof String p) { + this.texturesOverride.put(entry.getKey(), p); + } + } + } else { + this.texturesOverride = Collections.emptyMap(); + } + } + + public Key path() { + return path; + } + + public String parentModelPath() { + return parentModelPath; + } + + public Map texturesOverride() { + return texturesOverride; + } + + public JsonObject getJson() { + JsonObject model = new JsonObject(); + model.addProperty("parent", parentModelPath); + if (this.texturesOverride != null && !this.texturesOverride.isEmpty()) { + JsonObject textures = new JsonObject(); + for (Map.Entry entry : this.texturesOverride.entrySet()) { + textures.addProperty(entry.getKey(), entry.getValue()); + } + model.add("textures", textures); + } + return model; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ModelGeneration that = (ModelGeneration) o; + return this.path.equals(that.path) && parentModelPath.equals(that.parentModelPath) && Objects.equals(texturesOverride, that.texturesOverride); + } + + @Override + public int hashCode() { + int result = path.hashCode(); + result = 31 * result + parentModelPath.hashCode(); + result = 31 * result + texturesOverride.hashCode(); + return result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/generator/ModelGenerator.java b/core/src/main/java/net/momirealms/craftengine/core/pack/generator/ModelGenerator.java new file mode 100644 index 000000000..fe376684d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/generator/ModelGenerator.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.generator; + +import java.util.Collection; + +public interface ModelGenerator { + Collection modelsToGenerate(); + + void clearModelsToGenerate(); + + void prepareModelGeneration(ModelGeneration model); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java new file mode 100644 index 000000000..c54a838c4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java @@ -0,0 +1,89 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.tint.Tint; +import net.momirealms.craftengine.core.pack.model.tint.Tints; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class BaseItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final String path; + private final List tints; + private final ModelGeneration modelGeneration; + + public BaseItemModel(String path, List tints, @Nullable ModelGeneration modelGeneration) { + this.path = path; + this.tints = tints; + this.modelGeneration = modelGeneration; + } + + public List tints() { + return tints; + } + + public String path() { + return path; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("model", path); + if (!tints.isEmpty()) { + JsonArray array = new JsonArray(); + for (Tint tint : tints) { + array.add(tint.get()); + } + json.add("tints", array); + } + return json; + } + + @Override + public Key type() { + return ItemModels.MODEL; + } + + @Override + public List modelsToGenerate() { + if (this.modelGeneration == null) { + return List.of(); + } else { + return List.of(this.modelGeneration); + } + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + String modelPath = Objects.requireNonNull(arguments.get("path"), "path").toString(); + Map generation = MiscUtils.castToMap(arguments.get("generation"), true); + ModelGeneration modelGeneration = null; + if (generation != null) { + modelGeneration = new ModelGeneration(Key.of(modelPath), generation); + } + if (arguments.containsKey("tints")) { + List tints = new ArrayList<>(); + List> tintList = (List>) arguments.get("tints"); + for (Map tint : tintList) { + tints.add(Tints.fromMap(tint)); + } + return new BaseItemModel(modelPath, tints, modelGeneration); + } else { + return new BaseItemModel(modelPath, List.of(), modelGeneration); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/CompositeItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/CompositeItemModel.java new file mode 100644 index 000000000..3c4a1471c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/CompositeItemModel.java @@ -0,0 +1,63 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CompositeItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final List models; + + public CompositeItemModel(List models) { + this.models = models; + } + + public List models() { + return models; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + JsonArray array = new JsonArray(); + for (ItemModel model : models) { + array.add(model.get()); + } + json.add("models", array); + return json; + } + + @Override + public Key type() { + return ItemModels.COMPOSITE; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + for (ItemModel model : this.models) { + models.addAll(model.modelsToGenerate()); + } + return models; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + List> models = (List>) arguments.get("models"); + List modelList = new ArrayList<>(); + for (Map model : models) { + modelList.add(ItemModels.fromMap(model)); + } + return new CompositeItemModel(modelList); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ConditionItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ConditionItemModel.java new file mode 100644 index 000000000..01b8152ee --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ConditionItemModel.java @@ -0,0 +1,72 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.condition.ConditionProperties; +import net.momirealms.craftengine.core.pack.model.condition.ConditionProperty; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ConditionItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final ConditionProperty property; + private final ItemModel onTrue; + private final ItemModel onFalse; + + public ConditionItemModel(ConditionProperty property, ItemModel onTrue, ItemModel onFalse) { + this.property = property; + this.onTrue = onTrue; + this.onFalse = onFalse; + } + + public ConditionProperty property() { + return property; + } + + public ItemModel onTrue() { + return onTrue; + } + + public ItemModel onFalse() { + return onFalse; + } + + @Override + public Key type() { + return ItemModels.CONDITION; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + models.addAll(onTrue.modelsToGenerate()); + models.addAll(onFalse.modelsToGenerate()); + return models; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.add("on_true", onTrue.get()); + json.add("on_false", onFalse.get()); + property.accept(json); + return json; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + ConditionProperty property = ConditionProperties.fromMap(arguments); + Map onTrue = Objects.requireNonNull((Map) arguments.get("on-true")); + Map onFalse = Objects.requireNonNull((Map) arguments.get("on-false")); + return new ConditionItemModel(property, ItemModels.fromMap(onTrue), ItemModels.fromMap(onFalse)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/EmptyItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/EmptyItemModel.java new file mode 100644 index 000000000..4d51274a1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/EmptyItemModel.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class EmptyItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private static final EmptyItemModel INSTANCE = new EmptyItemModel(); + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + return json; + } + + @Override + public Key type() { + return ItemModels.EMPTY; + } + + @Override + public List modelsToGenerate() { + return List.of(); + } + + public static class Factory implements ItemModelFactory { + + @Override + public ItemModel create(Map arguments) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModel.java new file mode 100644 index 000000000..61f7b8bd1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModel.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.function.Supplier; + +public interface ItemModel extends Supplier { + + Key type(); + + List modelsToGenerate(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModelFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModelFactory.java new file mode 100644 index 000000000..43b9631bf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModelFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model; + +import java.util.Map; + +public interface ItemModelFactory { + + ItemModel create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java new file mode 100644 index 000000000..37df55401 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.pack.model; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class ItemModels { + public static final Key EMPTY = Key.of("minecraft:empty"); + public static final Key MODEL = Key.of("minecraft:model"); + public static final Key COMPOSITE = Key.of("minecraft:composite"); + public static final Key CONDITION = Key.of("minecraft:condition"); + public static final Key RANGE_DISPATCH = Key.of("minecraft:range_dispatch"); + public static final Key SELECT = Key.of("minecraft:select"); + public static final Key SPECIAL = Key.of("minecraft:special"); + + static { + register(EMPTY, EmptyItemModel.FACTORY); + register(COMPOSITE, CompositeItemModel.FACTORY); + register(MODEL, BaseItemModel.FACTORY); + register(CONDITION, ConditionItemModel.FACTORY); + register(SPECIAL, SpecialItemModel.FACTORY); + register(RANGE_DISPATCH, RangeDispatchItemModel.FACTORY); + register(SELECT, SelectItemModel.FACTORY); + } + + public static void register(Key key, ItemModelFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_MODEL_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.ITEM_MODEL_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static ItemModel fromMap(Map map) { + String type = (String) map.getOrDefault("type", "minecraft:model"); + Key key = Key.withDefaultNamespace(type, "minecraft"); + ItemModelFactory factory = BuiltInRegistries.ITEM_MODEL_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown model type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/LegacyModelPredicate.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/LegacyModelPredicate.java new file mode 100644 index 000000000..10ab58f4a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/LegacyModelPredicate.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.pack.model; + +import net.momirealms.craftengine.core.util.Key; + +public interface LegacyModelPredicate { + + String legacyPredicateId(Key material); + + Number toLegacyValue(T value); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java new file mode 100644 index 000000000..b5af44f76 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java @@ -0,0 +1,112 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchProperties; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchProperty; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RangeDispatchItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final RangeDispatchProperty property; + private final float scale; + private final ItemModel fallBack; + private final Map entries; + + public RangeDispatchItemModel(@NotNull RangeDispatchProperty property, + float scale, + @Nullable ItemModel fallBack, + @NotNull Map entries) { + this.property = property; + this.scale = scale; + this.fallBack = fallBack; + this.entries = entries; + } + + public RangeDispatchProperty property() { + return property; + } + + public float scale() { + return scale; + } + + public ItemModel fallBack() { + return fallBack; + } + + public Map entries() { + return entries; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + property.accept(json); + JsonArray array = new JsonArray(); + for (Map.Entry entry : entries.entrySet()) { + float threshold = entry.getKey(); + ItemModel model = entry.getValue(); + JsonObject jo = new JsonObject(); + jo.addProperty("threshold", threshold); + jo.add("model", model.get()); + array.add(jo); + } + if (scale != 1) { + json.addProperty("scale", scale); + } + if (fallBack != null) { + json.add("fallback", fallBack.get()); + } + return json; + } + + @Override + public Key type() { + return ItemModels.RANGE_DISPATCH; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + if (fallBack != null) { + models.addAll(fallBack.modelsToGenerate()); + } + for (ItemModel model : entries.values()) { + models.addAll(model.modelsToGenerate()); + } + return models; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + RangeDispatchProperty property = RangeDispatchProperties.fromMap(arguments); + float scale = MiscUtils.getAsFloat(arguments.getOrDefault("scale", 1.0)); + Map fallback = MiscUtils.castToMap(arguments.get("fallback"), true); + List> entries = (List>) arguments.get("entries"); + if (entries != null && !entries.isEmpty()) { + Map entryMap = new HashMap<>(); + for (Map entry : entries) { + float threshold = MiscUtils.getAsFloat(entry.getOrDefault("threshold", 1)); + Map model = MiscUtils.castToMap(entry.getOrDefault("model", fallback), false); + entryMap.put(threshold, ItemModels.fromMap(model)); + } + return new RangeDispatchItemModel(property, scale, fallback == null ? null : ItemModels.fromMap(fallback), entryMap); + } + throw new IllegalArgumentException("No entries set for range dispatch"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java new file mode 100644 index 000000000..2c51fc6c1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java @@ -0,0 +1,123 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.select.SelectProperties; +import net.momirealms.craftengine.core.pack.model.select.SelectProperty; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.incendo.cloud.type.Either; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SelectItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final SelectProperty property; + private final Map>, ItemModel> whenMap; + private final ItemModel fallBack; + + public SelectItemModel(@NotNull SelectProperty property, + @NotNull Map>, ItemModel> whenMap, + @Nullable ItemModel fallBack) { + this.property = property; + this.whenMap = whenMap; + this.fallBack = fallBack; + } + + public SelectProperty property() { + return property; + } + + public Map>, ItemModel> whenMap() { + return whenMap; + } + + public ItemModel fallBack() { + return fallBack; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + property.accept(json); + JsonArray array = new JsonArray(); + json.add("cases", array); + for (Map.Entry>, ItemModel> entry : whenMap.entrySet()) { + JsonObject item = new JsonObject(); + ItemModel itemModel = entry.getValue(); + item.add("model", itemModel.get()); + Either> either = entry.getKey(); + if (either.primary().isPresent()) { + item.addProperty("when", either.primary().get()); + } else { + List list = either.fallback().get(); + JsonArray whens = new JsonArray(); + for (String e : list) { + whens.add(e); + } + item.add("when", whens); + } + array.add(item); + } + if (fallBack != null) { + json.add("fallback", fallBack.get()); + } + return json; + } + + @Override + public Key type() { + return ItemModels.SELECT; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + if (fallBack != null) { + models.addAll(fallBack.modelsToGenerate()); + } + for (ItemModel itemModel : whenMap.values()) { + models.addAll(itemModel.modelsToGenerate()); + } + return models; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + SelectProperty property = SelectProperties.fromMap(arguments); + Map fallback = MiscUtils.castToMap(arguments.get("fallback"), true); + List> cases = (List>) arguments.get("cases"); + if (cases != null && !cases.isEmpty()) { + Map>, ItemModel> whenMap = new HashMap<>(); + for (Map c : cases) { + Object when = c.get("when"); + if (when == null) continue; + Either> either; + if (when instanceof List whenList) { + List whens = new ArrayList<>(whenList.size()); + for (Object o : whenList) { + whens.add(o.toString()); + } + either = Either.ofFallback(whens); + } else { + either = Either.ofPrimary(when.toString()); + } + Map model = MiscUtils.castToMap(c.get("model"), false); + whenMap.put(either, ItemModels.fromMap(model)); + } + return new SelectItemModel(property, whenMap, fallback == null ? null : ItemModels.fromMap(fallback)); + } + throw new IllegalArgumentException("No cases set for select"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SpecialItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SpecialItemModel.java new file mode 100644 index 000000000..430ea580f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SpecialItemModel.java @@ -0,0 +1,60 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.special.SpecialModel; +import net.momirealms.craftengine.core.pack.model.special.SpecialModels; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class SpecialItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final SpecialModel specialModel; + private final String base; + + public SpecialItemModel(SpecialModel specialModel, String base) { + this.specialModel = specialModel; + this.base = base; + } + + public SpecialModel specialModel() { + return specialModel; + } + + public String base() { + return base; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.add("model", specialModel.get()); + json.addProperty("base", base); + return json; + } + + @Override + public Key type() { + return ItemModels.SPECIAL; + } + + @Override + public List modelsToGenerate() { + return List.of(); + } + + public static class Factory implements ItemModelFactory { + + @Override + public ItemModel create(Map arguments) { + String base = Objects.requireNonNull(arguments.get("base")).toString(); + Map model = MiscUtils.castToMap(arguments.get("model"), false); + return new SpecialItemModel(SpecialModels.fromMap(model), base); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/BrokenConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/BrokenConditionProperty.java new file mode 100644 index 000000000..7672eb5a3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/BrokenConditionProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class BrokenConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.BROKEN; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.ELYTRA)) return "broken"; + throw new IllegalArgumentException("Unsupported material: " + material); + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new BrokenConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java new file mode 100644 index 000000000..c0e1e83e6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class ConditionProperties { + public static final Key BROKEN = Key.of("minecraft:broken"); + public static final Key BUNDLE_HAS_SELECTED_ITEM = Key.of("minecraft:bundle/has_selected_item"); + public static final Key CARRIED = Key.of("minecraft:carried"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DAMAGED = Key.of("minecraft:damaged"); + public static final Key EXTENDED_VIEW = Key.of("minecraft:extended_view"); + public static final Key FISHING_ROD_CAST = Key.of("minecraft:fishing_rod/cast"); + public static final Key HAS_COMPONENT = Key.of("minecraft:has_component"); + public static final Key KEYBIND_DOWN = Key.of("minecraft:keybind_down"); + public static final Key SELECTED = Key.of("minecraft:selected"); + public static final Key USING_ITEM = Key.of("minecraft:using_item"); + public static final Key VIEW_ENTITY = Key.of("minecraft:view_entity"); + + static { + register(BROKEN, BrokenConditionProperty.FACTORY); + register(BUNDLE_HAS_SELECTED_ITEM, SimpleConditionProperty.FACTORY); + register(CARRIED, SimpleConditionProperty.FACTORY); + register(DAMAGED, DamagedConditionProperty.FACTORY); + register(EXTENDED_VIEW, SimpleConditionProperty.FACTORY); + register(FISHING_ROD_CAST, RodCastConditionProperty.FACTORY); + register(SELECTED, SimpleConditionProperty.FACTORY); + register(USING_ITEM, UsingItemConditionProperty.FACTORY); + register(VIEW_ENTITY, SimpleConditionProperty.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataConditionProperty.FACTORY); + register(HAS_COMPONENT, HasComponentConditionProperty.FACTORY); + register(KEYBIND_DOWN, KeyBindDownConditionProperty.FACTORY); + } + + public static void register(Key key, ConditionPropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.CONDITION_PROPERTY_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.CONDITION_PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static ConditionProperty fromMap(Map map) { + String type = (String) map.get("property"); + if (type == null) { + throw new NullPointerException("property type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + ConditionPropertyFactory factory = BuiltInRegistries.CONDITION_PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperty.java new file mode 100644 index 000000000..4680c534e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperty.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Consumer; + +public interface ConditionProperty extends Consumer { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionPropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionPropertyFactory.java new file mode 100644 index 000000000..b3d60032b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionPropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import java.util.Map; + +public interface ConditionPropertyFactory { + + ConditionProperty create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java new file mode 100644 index 000000000..3cfea5b88 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class CustomModelDataConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final int index; + + public CustomModelDataConditionProperty(int index) { + this.index = index; + } + + @Override + public Key type() { + return ConditionProperties.CUSTOM_MODEL_DATA; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (index != 0) + jsonObject.addProperty("index", index); + } + + public static class Factory implements ConditionPropertyFactory { + + @Override + public ConditionProperty create(Map arguments) { + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataConditionProperty(index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/DamagedConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/DamagedConditionProperty.java new file mode 100644 index 000000000..c6ace3972 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/DamagedConditionProperty.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class DamagedConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.DAMAGED; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + return "damaged"; + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new DamagedConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java new file mode 100644 index 000000000..790e8b87d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class HasComponentConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final String component; + private final boolean ignoreDefault; + + public HasComponentConditionProperty(String component, boolean ignoreDefault) { + this.component = component; + this.ignoreDefault = ignoreDefault; + } + + @Override + public Key type() { + return ConditionProperties.HAS_COMPONENT; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("component", component); + if (ignoreDefault) { + jsonObject.addProperty("ignore_default", true); + } + } + + public static class Factory implements ConditionPropertyFactory { + + @Override + public ConditionProperty create(Map arguments) { + boolean ignoreDefault = (boolean) arguments.getOrDefault("ignore-default", false); + String component = Objects.requireNonNull(arguments.get("component"), "component").toString(); + return new HasComponentConditionProperty(component, ignoreDefault); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java new file mode 100644 index 000000000..19df014e9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class KeyBindDownConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final String keybind; + + public KeyBindDownConditionProperty(String keybind) { + this.keybind = keybind; + } + + @Override + public Key type() { + return ConditionProperties.KEYBIND_DOWN; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("keybind", keybind); + } + + public static class Factory implements ConditionPropertyFactory { + + @Override + public ConditionProperty create(Map arguments) { + String keybind = Objects.requireNonNull(arguments.get("keybind"), "keybind").toString(); + return new KeyBindDownConditionProperty(keybind); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/RodCastConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/RodCastConditionProperty.java new file mode 100644 index 000000000..25640c0c7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/RodCastConditionProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class RodCastConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.FISHING_ROD_CAST; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.FISHING_ROD)) return "cast"; + throw new IllegalArgumentException("Unsupported material: " + material); + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new RodCastConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/SimpleConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/SimpleConditionProperty.java new file mode 100644 index 000000000..70d9709e5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/SimpleConditionProperty.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleConditionProperty(Key type) { + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + return new SimpleConditionProperty(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/UsingItemConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/UsingItemConditionProperty.java new file mode 100644 index 000000000..8365a10d1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/UsingItemConditionProperty.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class UsingItemConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.USING_ITEM; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.SHIELD)) return "blocking"; + if (material.equals(ItemKeys.TRIDENT)) return "throwing"; + if (material.equals(ItemKeys.CROSSBOW) || material.equals(ItemKeys.BOW)) return "pulling"; + if (material.equals(ItemKeys.GOAT_HORN)) return "tooting"; + throw new IllegalArgumentException("Unsupported material: " + material); + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new UsingItemConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java new file mode 100644 index 000000000..0481ace29 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class CompassRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final String target; + + public CompassRangeDispatchProperty(String target) { + this.target = target; + } + + @Override + public Key type() { + return RangeDispatchProperties.COMPASS; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("target", target); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + String target = Objects.requireNonNull(arguments.get("target")).toString(); + return new CompassRangeDispatchProperty(target); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java new file mode 100644 index 000000000..311c32197 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class CrossBowPullingRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public Key type() { + return RangeDispatchProperties.CROSSBOW_PULL; + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.CROSSBOW) || material.equals(ItemKeys.BOW)) return "pull"; + throw new IllegalArgumentException("Unsupported material: " + material); + } + + @Override + public Number toLegacyValue(Float value) { + return value; + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + return new CrossBowPullingRangeDispatchProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java new file mode 100644 index 000000000..52a0aab71 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class CustomModelDataRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private final int index; + + public CustomModelDataRangeDispatchProperty(int index) { + this.index = index; + } + + @Override + public Key type() { + return RangeDispatchProperties.CUSTOM_MODEL_DATA; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("index", index); + } + + @Override + public String legacyPredicateId(Key material) { + return "custom_model_data"; + } + + @Override + public Number toLegacyValue(Float value) { + return value.intValue(); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataRangeDispatchProperty(index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java new file mode 100644 index 000000000..1bdf0e52a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class DamageRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private final boolean normalize; + + public DamageRangeDispatchProperty(boolean normalize) { + this.normalize = normalize; + } + + @Override + public Key type() { + return RangeDispatchProperties.DAMAGE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (!normalize) { + jsonObject.addProperty("normalize", false); + } + } + + @Override + public String legacyPredicateId(Key material) { + if (this.normalize) return "damage"; + throw new RuntimeException("Enable 'normalize' option if you want to use 'damage' on 1.21.3 and below"); + } + + @Override + public Number toLegacyValue(Float value) { + if (this.normalize) return value; + throw new RuntimeException("Enable 'normalize' option if you want to use 'damage' on 1.21.3 and below"); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + boolean normalize = (boolean) arguments.getOrDefault("normalize", true); + return new DamageRangeDispatchProperty(normalize); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/NormalizeRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/NormalizeRangeDispatchProperty.java new file mode 100644 index 000000000..39877b474 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/NormalizeRangeDispatchProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class NormalizeRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + private final boolean normalize; + + public NormalizeRangeDispatchProperty(Key type, boolean normalize) { + this.type = type; + this.normalize = normalize; + } + + @Override + public Key type() { + return type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (!normalize) { + jsonObject.addProperty("normalize", false); + } + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + boolean normalize = (boolean) arguments.getOrDefault("normalize", true); + return new NormalizeRangeDispatchProperty(type, normalize); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java new file mode 100644 index 000000000..087a3acaa --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class RangeDispatchProperties { + public static final Key BUNDLE_FULLNESS = Key.of("minecraft:bundle/fullness"); + public static final Key COMPASS = Key.of("minecraft:compass"); + public static final Key COOLDOWN = Key.of("minecraft:cooldown"); + public static final Key COUNT = Key.of("minecraft:count"); + public static final Key CROSSBOW_PULL = Key.of("minecraft:crossbow/pull"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DAMAGE = Key.of("minecraft:damage"); + public static final Key TIME = Key.of("minecraft:time"); + public static final Key USE_CYCLE = Key.of("minecraft:use_cycle"); + public static final Key USE_DURATION = Key.of("minecraft:use_duration"); + + static { + register(BUNDLE_FULLNESS, SimpleRangeDispatchProperty.FACTORY); + register(COOLDOWN, SimpleRangeDispatchProperty.FACTORY); + register(CROSSBOW_PULL, CrossBowPullingRangeDispatchProperty.FACTORY); + register(COMPASS, CompassRangeDispatchProperty.FACTORY); + register(COUNT, NormalizeRangeDispatchProperty.FACTORY); + register(DAMAGE, DamageRangeDispatchProperty.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataRangeDispatchProperty.FACTORY); + register(TIME, TimeRangeDispatchProperty.FACTORY); + register(USE_CYCLE, UseCycleRangeDispatchProperty.FACTORY); + register(USE_DURATION, UseDurationRangeDispatchProperty.FACTORY); + } + + public static void register(Key key, RangeDispatchPropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.RANGE_DISPATCH_PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static RangeDispatchProperty fromMap(Map map) { + String type = (String) map.get("property"); + if (type == null) { + throw new NullPointerException("property type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + RangeDispatchPropertyFactory factory = BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperty.java new file mode 100644 index 000000000..c6fb47b48 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperty.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Consumer; + +public interface RangeDispatchProperty extends Consumer { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchPropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchPropertyFactory.java new file mode 100644 index 000000000..0d5a274de --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchPropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import java.util.Map; + +public interface RangeDispatchPropertyFactory { + + RangeDispatchProperty create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/SimpleRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/SimpleRangeDispatchProperty.java new file mode 100644 index 000000000..e354b683c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/SimpleRangeDispatchProperty.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleRangeDispatchProperty(Key type) { + this.type = type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type.toString()); + } + + @Override + public Key type() { + return type; + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + return new SimpleRangeDispatchProperty(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java new file mode 100644 index 000000000..de8bc007f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class TimeRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final String source; + private final boolean wobble; + + public TimeRangeDispatchProperty(String source, boolean wobble) { + this.source = source; + this.wobble = wobble; + } + + @Override + public Key type() { + return RangeDispatchProperties.TIME; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("source", source); + if (!wobble) { + jsonObject.addProperty("wobble", false); + } + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + String source = Objects.requireNonNull(arguments.get("source")).toString(); + boolean wobble = (boolean) arguments.getOrDefault("wobble", true); + return new TimeRangeDispatchProperty(source, wobble); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java new file mode 100644 index 000000000..ff2e71104 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class UseCycleRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final int period; + + public UseCycleRangeDispatchProperty(int period) { + this.period = period; + } + + @Override + public Key type() { + return RangeDispatchProperties.USE_CYCLE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("period", period); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + int period = MiscUtils.getAsInt(arguments.getOrDefault("period", 0)); + return new UseCycleRangeDispatchProperty(period); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java new file mode 100644 index 000000000..4b7f9a6fb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class UseDurationRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final boolean remaining; + + public UseDurationRangeDispatchProperty(boolean remaining) { + this.remaining = remaining; + } + + @Override + public Key type() { + return RangeDispatchProperties.USE_DURATION; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (remaining) { + jsonObject.addProperty("remaining", true); + } + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + boolean remaining = (boolean) arguments.getOrDefault("remaining", false); + return new UseDurationRangeDispatchProperty(remaining); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java new file mode 100644 index 000000000..92c67a2a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class BlockStateSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final String blockStateProperty; + + public BlockStateSelectProperty(String blockStateProperty) { + this.blockStateProperty = blockStateProperty; + } + + @Override + public Key type() { + return SelectProperties.BLOCK_STATE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("block_state_property", blockStateProperty); + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + String blockStateProperty = Objects.requireNonNull(arguments.get("block-state-property")).toString(); + return new BlockStateSelectProperty(blockStateProperty); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/ChargeTypeSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/ChargeTypeSelectProperty.java new file mode 100644 index 000000000..db7967830 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/ChargeTypeSelectProperty.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class ChargeTypeSelectProperty implements SelectProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return SelectProperties.CHARGE_TYPE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.CROSSBOW)) return "firework"; + throw new IllegalArgumentException("Unsupported material: " + material); + } + + @Override + public Number toLegacyValue(String value) { + if (value.equals("rocket")) return 1; + return 0; + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + return new ChargeTypeSelectProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java new file mode 100644 index 000000000..600f50e5b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class CustomModelDataSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final int index; + + public CustomModelDataSelectProperty(int index) { + this.index = index; + } + + @Override + public Key type() { + return SelectProperties.CUSTOM_MODEL_DATA; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("index", index); + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataSelectProperty(index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java new file mode 100644 index 000000000..e89314e55 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Objects; + +public class LocalTimeSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final String pattern; + private final String locale; + private final String timeZone; + + public LocalTimeSelectProperty(@NotNull String pattern, + @Nullable String locale, + @Nullable String timeZone) { + this.pattern = pattern; + this.locale = locale; + this.timeZone = timeZone; + } + + @Override + public Key type() { + return SelectProperties.LOCAL_TIME; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("pattern", pattern); + if (locale != null) { + jsonObject.addProperty("locale", locale); + } + if (timeZone != null) { + jsonObject.addProperty("time_zone", timeZone); + } + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + String pattern = Objects.requireNonNull(arguments.get("pattern")).toString(); + String locale = (String) arguments.get("locale"); + String timeZone = (String) arguments.get("time-zone"); + return new LocalTimeSelectProperty(pattern, locale, timeZone); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/MainHandSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/MainHandSelectProperty.java new file mode 100644 index 000000000..0a8912bfb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/MainHandSelectProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class MainHandSelectProperty implements SelectProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return SelectProperties.MAIN_HAND; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + return "lefthanded"; + } + + @Override + public Number toLegacyValue(String value) { + if (value.equals("left")) return 1; + return 0; + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + return new MainHandSelectProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java new file mode 100644 index 000000000..bd01a1d6a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class SelectProperties { + public static final Key BLOCK_STATE = Key.of("minecraft:block_state"); + public static final Key CHARGE_TYPE = Key.of("minecraft:charge_type"); + public static final Key CONTEXT_DIMENSION = Key.of("minecraft:context_dimension"); + public static final Key CONTEXT_ENTITY_TYPE = Key.of("minecraft:context_entity_type"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DISPLAY_CONTEXT = Key.of("minecraft:display_context"); + public static final Key LOCAL_TIME = Key.of("minecraft:local_time"); + public static final Key MAIN_HAND = Key.of("minecraft:main_hand"); + public static final Key TRIM_MATERIAL = Key.of("minecraft:trim_material"); + + static { + register(CHARGE_TYPE, ChargeTypeSelectProperty.FACTORY); + register(CONTEXT_DIMENSION, SimpleSelectProperty.FACTORY); + register(CONTEXT_ENTITY_TYPE, SimpleSelectProperty.FACTORY); + register(DISPLAY_CONTEXT, SimpleSelectProperty.FACTORY); + register(MAIN_HAND, MainHandSelectProperty.FACTORY); + register(TRIM_MATERIAL, TrimMaterialSelectProperty.FACTORY); + register(BLOCK_STATE, BlockStateSelectProperty.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataSelectProperty.FACTORY); + register(LOCAL_TIME, LocalTimeSelectProperty.FACTORY); + } + + public static void register(Key key, SelectPropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SELECT_PROPERTY_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.SELECT_PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static SelectProperty fromMap(Map map) { + String type = (String) map.get("property"); + if (type == null) { + throw new NullPointerException("property type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + SelectPropertyFactory factory = BuiltInRegistries.SELECT_PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java new file mode 100644 index 000000000..7e236d0b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Consumer; + +public interface SelectProperty extends Consumer { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectPropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectPropertyFactory.java new file mode 100644 index 000000000..e44598784 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectPropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import java.util.Map; + +public interface SelectPropertyFactory { + + SelectProperty create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SimpleSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SimpleSelectProperty.java new file mode 100644 index 000000000..d40592bb3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SimpleSelectProperty.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleSelectProperty(Key type) { + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + return new SimpleSelectProperty(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/TrimMaterialSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/TrimMaterialSelectProperty.java new file mode 100644 index 000000000..8223abe7b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/TrimMaterialSelectProperty.java @@ -0,0 +1,63 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.HashMap; +import java.util.Map; + +public class TrimMaterialSelectProperty implements SelectProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private static final Map LEGACY_TRIM_DATA = new HashMap<>(); + static { + LEGACY_TRIM_DATA.put("minecraft:quartz", 0.1f); + LEGACY_TRIM_DATA.put("minecraft:iron", 0.2f); + LEGACY_TRIM_DATA.put("minecraft:netherite", 0.3f); + LEGACY_TRIM_DATA.put("minecraft:redstone", 0.4f); + LEGACY_TRIM_DATA.put("minecraft:copper", 0.5f); + LEGACY_TRIM_DATA.put("minecraft:gold", 0.6f); + LEGACY_TRIM_DATA.put("minecraft:emerald", 0.7f); + LEGACY_TRIM_DATA.put("minecraft:diamond", 0.8f); + LEGACY_TRIM_DATA.put("minecraft:lapis", 0.9f); + LEGACY_TRIM_DATA.put("minecraft:amethyst", 1.0f); + // INVALID + LEGACY_TRIM_DATA.put("minecraft:resin", 0F); + } + + @Override + public Key type() { + return SelectProperties.TRIM_MATERIAL; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + String s = material.toString(); + if (s.contains("helmet") || s.contains("chestplate") || s.contains("leggings") || s.contains("boots")) { + return "trim"; + } + throw new IllegalArgumentException("Unsupported material " + material); + } + + @Override + public Number toLegacyValue(String value) { + Float f = LEGACY_TRIM_DATA.get(value); + if (f == null) { + throw new IllegalArgumentException("Invalid trim material '" + value + "'"); + } + return f; + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + return new TrimMaterialSelectProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java new file mode 100644 index 000000000..847ad6c0d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class BannerSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String color; + + public BannerSpecialModel(String color) { + this.color = color; + } + + @Override + public Key type() { + return SpecialModels.BANNER; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("color", color); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + String color = Objects.requireNonNull(arguments.get("color"), "color").toString(); + return new BannerSpecialModel(color); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java new file mode 100644 index 000000000..318f18252 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class BedSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String texture; + + public BedSpecialModel(String texture) { + this.texture = texture; + } + + @Override + public Key type() { + return SpecialModels.BED; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("texture", texture); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + String color = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + return new BedSpecialModel(color); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java new file mode 100644 index 000000000..7e1511e0f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; +import java.util.Objects; + +public class ChestSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String texture; + private final float openness; + + public ChestSpecialModel(String texture, float openness) { + this.texture = texture; + this.openness = openness; + } + + @Override + public Key type() { + return SpecialModels.CHEST; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("texture", texture); + json.addProperty("openness", openness); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + float openness = MiscUtils.getAsFloat(arguments.getOrDefault("openness", 0)); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + if (openness > 1 || openness < 0) { + throw new IllegalArgumentException("Invalid openness: " + openness + ". Valid range 0~1"); + } + return new ChestSpecialModel(texture, openness); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java new file mode 100644 index 000000000..680b7cda2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; +import java.util.Objects; + +public class HeadSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String kind; + private final String texture; + private final int animation; + + public HeadSpecialModel(String kind, String texture, int animation) { + this.kind = kind; + this.texture = texture; + this.animation = animation; + } + + @Override + public Key type() { + return SpecialModels.HEAD; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("kind", kind); + json.addProperty("texture", texture); + json.addProperty("animation", animation); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + String kind = Objects.requireNonNull(arguments.get("kind"), "kind").toString(); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + int animation = MiscUtils.getAsInt(arguments.getOrDefault("animation", 0)); + return new HeadSpecialModel(kind, texture, animation); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java new file mode 100644 index 000000000..bc80c2693 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +public class ShulkerBoxSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String texture; + private final float openness; + private final Direction orientation; + + public ShulkerBoxSpecialModel(String texture, float openness, Direction orientation) { + this.texture = texture; + this.openness = openness; + this.orientation = orientation; + } + + @Override + public Key type() { + return SpecialModels.SHULKER_BOX; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("texture", texture); + json.addProperty("openness", openness); + json.addProperty("orientation", orientation.name().toLowerCase(Locale.ENGLISH)); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + float openness = MiscUtils.getAsFloat(arguments.getOrDefault("openness", 0)); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + Direction orientation = Direction.valueOf(arguments.getOrDefault("orientation", "down").toString().toUpperCase(Locale.ENGLISH)); + if (openness > 1 || openness < 0) { + throw new IllegalArgumentException("Invalid openness: " + openness + ". Valid range 0~1"); + } + return new ShulkerBoxSpecialModel(texture, openness, orientation); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java new file mode 100644 index 000000000..2779c7807 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class SignSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final Key type; + private final String woodType; + private final String texture; + + public SignSpecialModel(Key type, String woodType, String texture) { + this.type = type; + this.woodType = woodType; + this.texture = texture; + } + + @Override + public Key type() { + return type; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("wood_type", woodType); + json.addProperty("texture", texture); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + Key type = Key.of(arguments.get("type").toString()); + String woodType = Objects.requireNonNull(arguments.get("wood-type"), "wood-type").toString(); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + return new SignSpecialModel(type, woodType, texture); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SimpleSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SimpleSpecialModel.java new file mode 100644 index 000000000..c971e102c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SimpleSpecialModel.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleSpecialModel(Key type) { + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + Key type = Key.of(arguments.get("type").toString()); + return new SimpleSpecialModel(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModel.java new file mode 100644 index 000000000..173f6c916 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModel.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Supplier; + +public interface SpecialModel extends Supplier { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModelFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModelFactory.java new file mode 100644 index 000000000..ca740f8df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModelFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import java.util.Map; + +public interface SpecialModelFactory { + + SpecialModel create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java new file mode 100644 index 000000000..40ab72ed4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class SpecialModels { + public static final Key BANNER = Key.of("minecraft:banner"); + public static final Key BED = Key.of("minecraft:bed"); + public static final Key CONDUIT = Key.of("minecraft:conduit"); + public static final Key CHEST = Key.of("minecraft:chest"); + public static final Key DECORATED_POT = Key.of("minecraft:decorated_pot"); + public static final Key HANGING_SIGN = Key.of("minecraft:hanging_sign"); + public static final Key HEAD = Key.of("minecraft:head"); + public static final Key SHIELD = Key.of("minecraft:shield"); + public static final Key SHULKER_BOX = Key.of("minecraft:shulker_box"); + public static final Key STANDING_SIGN = Key.of("minecraft:standing_sign"); + public static final Key TRIDENT = Key.of("minecraft:trident"); + + static { + register(TRIDENT, SimpleSpecialModel.FACTORY); + register(DECORATED_POT, SimpleSpecialModel.FACTORY); + register(CONDUIT, SimpleSpecialModel.FACTORY); + register(SHIELD, SimpleSpecialModel.FACTORY); + register(HANGING_SIGN, SignSpecialModel.FACTORY); + register(STANDING_SIGN, SignSpecialModel.FACTORY); + register(CHEST, ChestSpecialModel.FACTORY); + register(BANNER, BannerSpecialModel.FACTORY); + register(BED, BedSpecialModel.FACTORY); + register(HEAD, HeadSpecialModel.FACTORY); + } + + public static void register(Key key, SpecialModelFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SPECIAL_MODEL_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.SPECIAL_MODEL_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static SpecialModel fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("special model type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + SpecialModelFactory factory = BuiltInRegistries.SPECIAL_MODEL_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown special model type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java new file mode 100644 index 000000000..a34494783 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.Map; + +public class ConstantTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final Either> value; + + public ConstantTint(Either> value) { + this.value = value; + } + + @Override + public Key type() { + return Tints.CONSTANT; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + applyAnyTint(json, value, "value"); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + Object value = arguments.get("value"); + return new ConstantTint(parseTintValue(value)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java new file mode 100644 index 000000000..f524bd1af --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.Map; + +public class CustomModelDataTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final Either> value; + private final int index; + + public CustomModelDataTint(Either> value, int index) { + this.index = index; + this.value = value; + } + + @Override + public Key type() { + return Tints.CUSTOM_MODEL_DATA; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + if (index != 0) + json.addProperty("index", index); + applyAnyTint(json, value, "default"); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + Object value = arguments.get("default"); + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataTint(parseTintValue(value), index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java new file mode 100644 index 000000000..562b351e4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class GrassTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final float temperature; + private final float downfall; + + public GrassTint(float temperature, float downfall) { + this.temperature = temperature; + this.downfall = downfall; + } + + @Override + public Key type() { + return Tints.GRASS; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("temperature", temperature); + json.addProperty("downfall", downfall); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + float temperature = MiscUtils.getAsFloat(arguments.getOrDefault("temperature", 0)); + float downfall = MiscUtils.getAsFloat(arguments.getOrDefault("downfall", 0)); + if (temperature > 1 || temperature < 0) { + throw new IllegalArgumentException("Invalid temperature: " + temperature + ". Valid range 0~1"); + } + if (downfall > 1 || downfall < 0) { + throw new IllegalArgumentException("Invalid downfall: " + downfall + ". Valid range 0~1"); + } + return new GrassTint(temperature, downfall); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/SimpleDefaultTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/SimpleDefaultTint.java new file mode 100644 index 000000000..1b055abe3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/SimpleDefaultTint.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.Map; + +public class SimpleDefaultTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final Either> value; + private final Key type; + + public SimpleDefaultTint(Either> value, Key type) { + this.value = value; + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + applyAnyTint(json, value, "default"); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + Object value = arguments.get("default"); + Key type = Key.of(arguments.get("type").toString()); + return new SimpleDefaultTint(parseTintValue(value), type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tint.java new file mode 100644 index 000000000..364145257 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tint.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.function.Supplier; + +public interface Tint extends Supplier { + + Key type(); + + default void applyAnyTint(JsonObject json, Either> value, String key) { + if (value.primary().isPresent()) { + json.addProperty(key, value.primary().get()); + } else { + List list = value.fallback().get(); + if (list.size() != 3) { + throw new RuntimeException("Invalid tint value list size: " + list.size() + " which is expected to be 3"); + } + JsonArray array = new JsonArray(); + for (int i : list) { + array.add(i); + } + json.add(key, array); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/TintFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/TintFactory.java new file mode 100644 index 000000000..31fd5c7f2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/TintFactory.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import org.incendo.cloud.type.Either; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public interface TintFactory { + + Tint create(Map arguments); + + default Either> parseTintValue(Object value) { + if (value instanceof Number i) { + return Either.ofPrimary(i.intValue()); + } else if (value instanceof List list) { + if (list.size() != 3) { + throw new IllegalArgumentException("Invalid tint value list size: " + list.size() + " which is expected to be 3"); + } + List intList = new ArrayList<>(); + for (Object o : list) { + intList.add(Integer.parseInt(o.toString())); + } + return Either.ofFallback(intList); + } + throw new IllegalArgumentException("Invalid tint value: " + value); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java new file mode 100644 index 000000000..24e0f3cda --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class Tints { + public static final Key CONSTANT = Key.of("minecraft:constant"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DYE = Key.of("minecraft:dye"); + public static final Key FIREWORK = Key.of("minecraft:firework"); + public static final Key GRASS = Key.of("minecraft:grass"); + public static final Key MAP_COLOR = Key.of("minecraft:map_color"); + public static final Key POTION = Key.of("minecraft:potion"); + public static final Key TEAM = Key.of("minecraft:team"); + + static { + register(CONSTANT, ConstantTint.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataTint.FACTORY); + register(GRASS, GrassTint.FACTORY); + register(DYE, SimpleDefaultTint.FACTORY); + register(FIREWORK, SimpleDefaultTint.FACTORY); + register(MAP_COLOR, SimpleDefaultTint.FACTORY); + register(POTION, SimpleDefaultTint.FACTORY); + register(TEAM, SimpleDefaultTint.FACTORY); + } + + public static void register(Key key, TintFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TINT_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.TINT_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Tint fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("tint type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + TintFactory factory = BuiltInRegistries.TINT_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown tint type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java new file mode 100644 index 000000000..f17b0449f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -0,0 +1,228 @@ +package net.momirealms.craftengine.core.plugin; + +import dev.dejvokep.boostedyaml.YamlDocument; +import net.momirealms.craftengine.core.block.BlockManager; +import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.font.FontManager; +import net.momirealms.craftengine.core.font.FontManagerImpl; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.RecipeManager; +import net.momirealms.craftengine.core.pack.PackManager; +import net.momirealms.craftengine.core.pack.PackManagerImpl; +import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManagerImpl; +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.plugin.dependency.Dependency; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManagerImpl; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.locale.TranslationManagerImpl; +import net.momirealms.craftengine.core.plugin.logger.PluginLogger; +import net.momirealms.craftengine.core.plugin.logger.filter.LogFilter; +import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; +import net.momirealms.craftengine.core.world.WorldManager; +import org.apache.logging.log4j.LogManager; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public abstract class CraftEngine implements Plugin { + public static final String NAMESPACE = "craftengine"; + private static CraftEngine instance; + protected DependencyManager dependencyManager; + protected SchedulerAdapter scheduler; + protected NetworkManager networkManager; + protected ClassPathAppender classPathAppender; + protected FontManager fontManager; + protected PackManager packManager; + protected ConfigManager configManager; + protected ItemManager itemManager; + protected RecipeManager recipeManager; + protected BlockManager blockManager; + protected TranslationManager translationManager; + protected WorldManager worldManager; + protected FurnitureManager furnitureManager; + protected CraftEngineCommandManager commandManager; + protected SenderFactory senderFactory; + protected TemplateManager templateManager; + protected PluginLogger logger; + + protected CraftEngine() { + instance = this; + } + + @Override + public void load() { + ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addFilter(new LogFilter()); + this.dependencyManager = new DependencyManagerImpl(this); + ArrayList dependenciesToLoad = new ArrayList<>(); + dependenciesToLoad.addAll(commonDependencies()); + dependenciesToLoad.addAll(platformDependencies()); + this.dependencyManager.loadDependencies(dependenciesToLoad); + this.translationManager = new TranslationManagerImpl(this); + } + + @Override + public void reload() { + this.translationManager.reload(); + this.configManager.reload(); + this.templateManager.reload(); + this.furnitureManager.reload(); + this.fontManager.reload(); + this.itemManager.reload(); + this.recipeManager.reload(); + this.blockManager.reload(); + this.worldManager.reload(); + this.packManager.reload(); + this.blockManager.delayedLoad(); + + this.scheduler.async().execute(() -> { + this.recipeManager.delayedLoad(); + this.packManager.generateResourcePack(); + }); + } + + @Override + public void enable() { + this.networkManager.enable(); + this.configManager = new ConfigManager(this); + this.packManager = new PackManagerImpl(this); + this.fontManager = new FontManagerImpl(this); + this.templateManager = new TemplateManagerImpl(this); + this.commandManager.registerDefaultFeatures(); + // delay the reload so other plugins can register some parsers + this.scheduler.sync().runDelayed(() -> { + this.registerParsers(); + this.reload(); + this.worldManager.delayedLoad(); + this.furnitureManager.delayedLoad(); + }); + } + + @Override + public void disable() { + if (this.senderFactory != null) this.senderFactory.close(); + if (this.commandManager != null) this.commandManager.unregisterFeatures(); + if (this.networkManager != null) this.networkManager.shutdown(); + if (this.fontManager != null) this.fontManager.disable(); + if (this.packManager != null) this.packManager.disable(); + if (this.itemManager != null) this.itemManager.disable(); + if (this.blockManager != null) this.blockManager.disable(); + if (this.furnitureManager != null) this.furnitureManager.disable(); + if (this.templateManager != null) this.templateManager.disable(); + if (this.worldManager != null) this.worldManager.disable(); + if (this.scheduler != null) this.scheduler.shutdownScheduler(); + if (this.scheduler != null) this.scheduler.shutdownExecutor(); + } + + protected abstract void registerParsers(); + + protected abstract List platformDependencies(); + + protected List commonDependencies() { + return List.of( +// Dependencies.BOOSTED_YAML, + Dependencies.BSTATS_BASE, + Dependencies.CAFFEINE, + Dependencies.GEANTY_REF, + Dependencies.CLOUD_CORE, Dependencies.CLOUD_SERVICES, + Dependencies.GSON, + Dependencies.SLF4J_API, Dependencies.SLF4J_SIMPLE, + Dependencies.COMMONS_IO, + Dependencies.ZSTD, + Dependencies.BYTE_BUDDY, + Dependencies.SNAKE_YAML + ); + } + + @Override + public DependencyManager dependencyManager() { + return dependencyManager; + } + + @Override + public SchedulerAdapter scheduler() { + return scheduler; + } + + @Override + public ClassPathAppender classPathAppender() { + return classPathAppender; + } + + @SuppressWarnings("unchecked") + @Override + public ItemManager itemManager() { + return (ItemManager) itemManager; + } + + @Override + public BlockManager blockManager() { + return blockManager; + } + + @Override + public NetworkManager networkManager() { + return networkManager; + } + + @Override + public FontManager fontManager() { + return fontManager; + } + + @Override + public ConfigManager configManager() { + return configManager; + } + + @Override + public PluginLogger logger() { + return logger; + } + + @Override + public TranslationManager translationManager() { + return translationManager; + } + + @Override + public TemplateManager templateManager() { + return templateManager; + } + + @Override + public FurnitureManager furnitureManager() { + return furnitureManager; + } + + @Override + public SenderFactory senderFactory() { + return senderFactory; + } + + public WorldManager worldManager() { + return worldManager; + } + + public static CraftEngine instance() { + if (instance == null) { + throw new IllegalStateException("CraftEngine has not been initialized"); + } + return instance; + } + + public YamlDocument loadOrCreateYamlData(String fileName) { + File file = new File(this.dataFolderFile(), fileName); + if (!file.exists()) { + this.saveResource(fileName); + } + return this.loadYamlData(file); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java new file mode 100644 index 000000000..32aebf99d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -0,0 +1,76 @@ +package net.momirealms.craftengine.core.plugin; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.momirealms.craftengine.core.block.BlockManager; +import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.font.FontManager; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.logger.PluginLogger; +import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Path; + +public interface Plugin extends Reloadable { + + InputStream resourceStream(String filePath); + + PluginLogger logger(); + + ClassPathAppender classPathAppender(); + + File dataFolderFile(); + + Path dataFolderPath(); + + DependencyManager dependencyManager(); + + SchedulerAdapter scheduler(); + + void saveResource(String filePath); + + YamlDocument loadYamlConfig(String filePath, GeneralSettings generalSettings, LoaderSettings loaderSettings, DumperSettings dumperSettings, UpdaterSettings updaterSettings); + + YamlDocument loadYamlData(File file); + + String pluginVersion(); + + String serverVersion(); + + ItemManager itemManager(); + + BlockManager blockManager(); + + NetworkManager networkManager(); + + FontManager fontManager(); + + ConfigManager configManager(); + + TranslationManager translationManager(); + + TemplateManager templateManager(); + + FurnitureManager furnitureManager(); + + SenderFactory senderFactory(); + + boolean isPluginEnabled(String plugin); + + String parse(Player player, String text); + + Path resolveConfig(String filePath); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/PluginProperties.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/PluginProperties.java new file mode 100644 index 000000000..191daaa65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/PluginProperties.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.plugin; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class PluginProperties { + private final HashMap propertyMap; + + private PluginProperties(HashMap propertyMap) { + this.propertyMap = propertyMap; + } + + public static String getValue(String key) { + if (!SingletonHolder.INSTANCE.propertyMap.containsKey(key)) { + throw new RuntimeException("Unknown key: " + key); + } + return SingletonHolder.INSTANCE.propertyMap.get(key); + } + + private static class SingletonHolder { + + private static final PluginProperties INSTANCE = getInstance(); + + private static PluginProperties getInstance() { + try (InputStream inputStream = PluginProperties.class.getClassLoader().getResourceAsStream("craft-engine.properties")) { + HashMap versionMap = new HashMap<>(); + Properties properties = new Properties(); + properties.load(inputStream); + for (Map.Entry entry : properties.entrySet()) { + if (entry.getKey() instanceof String key && entry.getValue() instanceof String value) { + versionMap.put(key, value); + } + } + return new PluginProperties(versionMap); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java new file mode 100644 index 000000000..01fae3bee --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.plugin; + +public interface Reloadable { + + default void reload() { + unload(); + load(); + } + + default void enable() { + } + + default void unload() { + } + + default void load() { + } + + default void disable() { + unload(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ClassPathAppender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ClassPathAppender.java new file mode 100644 index 000000000..d89096c97 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ClassPathAppender.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.classpath; + +import java.nio.file.Path; + +public interface ClassPathAppender extends AutoCloseable { + + void addJarToClasspath(Path file); + + @Override + default void close() { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ReflectionClassPathAppender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ReflectionClassPathAppender.java new file mode 100644 index 000000000..b1f828f33 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ReflectionClassPathAppender.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.plugin.classpath; + +import net.momirealms.craftengine.core.plugin.Plugin; + +import java.net.MalformedURLException; +import java.net.URLClassLoader; +import java.nio.file.Path; + +public class ReflectionClassPathAppender implements ClassPathAppender { + private final URLClassLoaderAccess classLoaderAccess; + + public ReflectionClassPathAppender(ClassLoader classLoader) throws IllegalStateException { + if (classLoader instanceof URLClassLoader) { + this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) classLoader); + } else { + throw new IllegalStateException("ClassLoader is not instance of URLClassLoader"); + } + } + + public ReflectionClassPathAppender(Plugin plugin) throws IllegalStateException { + this(plugin.getClass().getClassLoader()); + } + + @Override + public void addJarToClasspath(Path file) { + try { + this.classLoaderAccess.addURL(file.toUri().toURL()); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/URLClassLoaderAccess.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/URLClassLoaderAccess.java new file mode 100644 index 000000000..cee999970 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/URLClassLoaderAccess.java @@ -0,0 +1,143 @@ +package net.momirealms.craftengine.core.plugin.classpath; + +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Collection; + +public abstract class URLClassLoaderAccess { + + public static URLClassLoaderAccess create(URLClassLoader classLoader) { + if (Reflection.isSupported()) { + return new Reflection(classLoader); + } else if (Unsafe.isSupported()) { + return new Unsafe(classLoader); + } else { + return Noop.INSTANCE; + } + } + + private final URLClassLoader classLoader; + + protected URLClassLoaderAccess(URLClassLoader classLoader) { + this.classLoader = classLoader; + } + + public abstract void addURL(@NotNull URL url); + + private static void throwError(Throwable cause) throws UnsupportedOperationException { + throw new UnsupportedOperationException(""" + Plugin is unable to inject into the plugin URLClassLoader. + You may be able to fix this problem by adding the following command-line argument \ + directly after the 'java' command in your start script:\s + '--add-opens java.base/java.lang=ALL-UNNAMED'""", cause); + } + + private static class Reflection extends URLClassLoaderAccess { + private static final Method ADD_URL_METHOD; + + static { + Method addUrlMethod; + try { + addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + addUrlMethod.setAccessible(true); + } catch (Exception e) { + addUrlMethod = null; + } + ADD_URL_METHOD = addUrlMethod; + } + + private static boolean isSupported() { + return ADD_URL_METHOD != null; + } + + Reflection(URLClassLoader classLoader) { + super(classLoader); + } + + @Override + public void addURL(@NotNull URL url) { + try { + ADD_URL_METHOD.invoke(super.classLoader, url); + } catch (ReflectiveOperationException e) { + URLClassLoaderAccess.throwError(e); + } + } + } + + private static class Unsafe extends URLClassLoaderAccess { + private static final sun.misc.Unsafe UNSAFE; + + static { + sun.misc.Unsafe unsafe; + try { + Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + unsafe = (sun.misc.Unsafe) unsafeField.get(null); + } catch (Throwable t) { + unsafe = null; + } + UNSAFE = unsafe; + } + + private static boolean isSupported() { + return UNSAFE != null; + } + + private final Collection unopenedURLs; + private final Collection pathURLs; + + @SuppressWarnings("unchecked") + Unsafe(URLClassLoader classLoader) { + super(classLoader); + + Collection unopenedURLs; + Collection pathURLs; + try { + Object ucp = fetchField(URLClassLoader.class, classLoader, "ucp"); + unopenedURLs = (Collection) fetchField(ucp.getClass(), ucp, "unopenedUrls"); + pathURLs = (Collection) fetchField(ucp.getClass(), ucp, "path"); + } catch (Throwable e) { + unopenedURLs = null; + pathURLs = null; + } + + this.unopenedURLs = unopenedURLs; + this.pathURLs = pathURLs; + } + + private static Object fetchField(final Class clazz, final Object object, final String name) throws NoSuchFieldException { + Field field = clazz.getDeclaredField(name); + long offset = UNSAFE.objectFieldOffset(field); + return UNSAFE.getObject(object, offset); + } + + @Override + public void addURL(@NotNull URL url) { + if (this.unopenedURLs == null || this.pathURLs == null) { + URLClassLoaderAccess.throwError(new NullPointerException("unopenedURLs or pathURLs")); + } + + synchronized (this.unopenedURLs) { + this.unopenedURLs.add(url); + this.pathURLs.add(url); + } + } + } + + private static class Noop extends URLClassLoaderAccess { + private static final Noop INSTANCE = new Noop(); + + private Noop() { + super(null); + } + + @Override + public void addURL(@NotNull URL url) { + URLClassLoaderAccess.throwError(null); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandFeature.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandFeature.java new file mode 100644 index 000000000..20aeef66b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandFeature.java @@ -0,0 +1,71 @@ +package net.momirealms.craftengine.core.plugin.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.core.plugin.Plugin; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; + +public abstract class AbstractCommandFeature implements CommandFeature { + protected final CraftEngineCommandManager commandManager; + private final Plugin plugin; + protected CommandConfig commandConfig; + + public AbstractCommandFeature(CraftEngineCommandManager commandManager, Plugin plugin) { + this.commandManager = commandManager; + this.plugin = plugin; + } + + public abstract Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder); + + @Override + @SuppressWarnings("unchecked") + public Command registerCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + Command command = (Command) assembleCommand(manager, builder).build(); + manager.command(command); + return command; + } + + @Override + public void registerRelatedFunctions() { + // empty + } + + @Override + public void unregisterRelatedFunctions() { + // empty + } + + @Override + @SuppressWarnings("unchecked") + public void handleFeedback(CommandContext context, TranslatableComponent.Builder key, Component... args) { + if (context.flags().hasFlag("silent")) { + return; + } + commandManager.handleCommandFeedback((C) context.sender(), key, args); + } + + @Override + public void handleFeedback(C sender, TranslatableComponent.Builder key, Component... args) { + commandManager.handleCommandFeedback(sender, key, args); + } + + @Override + public CraftEngineCommandManager commandManager() { + return commandManager; + } + + @Override + public CommandConfig commandConfig() { + return commandConfig; + } + + public void setCommandConfig(CommandConfig commandConfig) { + this.commandConfig = commandConfig; + } + + @Override + public Plugin plugin() { + return plugin; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java new file mode 100644 index 000000000..1e3ee7914 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java @@ -0,0 +1,176 @@ +package net.momirealms.craftengine.core.plugin.command; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import net.momirealms.craftengine.core.plugin.locale.CraftEngineCaptionFormatter; +import net.momirealms.craftengine.core.plugin.locale.CraftEngineCaptionProvider; +import net.momirealms.craftengine.core.util.ArrayUtils; +import net.momirealms.craftengine.core.util.TriConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.Command; +import org.incendo.cloud.caption.Caption; +import org.incendo.cloud.caption.StandardCaptionKeys; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.exception.*; +import org.incendo.cloud.exception.handling.ExceptionContext; +import org.incendo.cloud.minecraft.extras.MinecraftExceptionHandler; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; + +public abstract class AbstractCommandManager implements CraftEngineCommandManager { + protected final HashSet> registeredRootCommandComponents = new HashSet<>(); + protected final HashSet> registeredFeatures = new HashSet<>(); + protected final org.incendo.cloud.CommandManager commandManager; + protected final Plugin plugin; + private final CraftEngineCaptionFormatter captionFormatter; + private final MinecraftExceptionHandler.Decorator decorator = (formatter, ctx, msg) -> msg; + private TriConsumer feedbackConsumer; + + public AbstractCommandManager(Plugin plugin, org.incendo.cloud.CommandManager commandManager) { + this.commandManager = commandManager; + this.plugin = plugin; + this.inject(); + this.feedbackConsumer = defaultFeedbackConsumer(); + this.captionFormatter = new CraftEngineCaptionFormatter<>(plugin.translationManager()); + } + + @Override + public void setFeedbackConsumer(@NotNull TriConsumer feedbackConsumer) { + this.feedbackConsumer = feedbackConsumer; + } + + @Override + public TriConsumer defaultFeedbackConsumer() { + return ((sender, node, component) -> { + wrapSender(sender).sendMessage( + component, true + ); + }); + } + + protected abstract Sender wrapSender(C c); + + private void inject() { + getCommandManager().captionRegistry().registerProvider(new CraftEngineCaptionProvider<>()); + injectExceptionHandler(InvalidSyntaxException.class, MinecraftExceptionHandler.createDefaultInvalidSyntaxHandler(), StandardCaptionKeys.EXCEPTION_INVALID_SYNTAX); + injectExceptionHandler(InvalidCommandSenderException.class, MinecraftExceptionHandler.createDefaultInvalidSenderHandler(), StandardCaptionKeys.EXCEPTION_INVALID_SENDER); + injectExceptionHandler(NoPermissionException.class, MinecraftExceptionHandler.createDefaultNoPermissionHandler(), StandardCaptionKeys.EXCEPTION_NO_PERMISSION); + injectExceptionHandler(ArgumentParseException.class, MinecraftExceptionHandler.createDefaultArgumentParsingHandler(), StandardCaptionKeys.EXCEPTION_INVALID_ARGUMENT); + injectExceptionHandler(CommandExecutionException.class, MinecraftExceptionHandler.createDefaultCommandExecutionHandler(), StandardCaptionKeys.EXCEPTION_UNEXPECTED); + } + + @SuppressWarnings("unchecked") + private void injectExceptionHandler(Class type, MinecraftExceptionHandler.MessageFactory factory, Caption key) { + getCommandManager().exceptionController().registerHandler(type, ctx -> { + final @Nullable ComponentLike message = factory.message(captionFormatter, (ExceptionContext) ctx); + if (message != null) { + handleCommandFeedback(ctx.context().sender(), key.key(), decorator.decorate(captionFormatter, ctx, message.asComponent()).asComponent()); + } + }); + } + + @Override + public CommandConfig getCommandConfig(YamlDocument document, String featureID) { + Section section = document.getSection(featureID); + if (section == null) return null; + return new CommandConfig.Builder() + .permission(section.getString("permission")) + .usages(section.getStringList("usage")) + .enable(section.getBoolean("enable", false)) + .build(); + } + + @Override + public Collection> buildCommandBuilders(CommandConfig config) { + ArrayList> list = new ArrayList<>(); + for (String usage : config.getUsages()) { + if (!usage.startsWith("/")) continue; + String command = usage.substring(1).trim(); + String[] split = command.split(" "); + Command.Builder builder = new ConfigurableCommandBuilder.BasicConfigurableCommandBuilder<>(getCommandManager(), split[0]) + .nodes(ArrayUtils.subArray(split, 1)) + .permission(config.getPermission()) + .build(); + list.add(builder); + } + return list; + } + + @Override + public void registerFeature(CommandFeature feature, CommandConfig config) { + if (!config.isEnable()) throw new RuntimeException("Registering a disabled command feature is not allowed"); + for (Command.Builder builder : buildCommandBuilders(config)) { + Command command = feature.registerCommand(commandManager, builder); + this.registeredRootCommandComponents.add(command.rootComponent()); + } + feature.registerRelatedFunctions(); + this.registeredFeatures.add(feature); + ((AbstractCommandFeature) feature).setCommandConfig(config); + } + + @Override + public void registerDefaultFeatures() { + YamlDocument document = plugin.loadYamlConfig(commandsFile, + GeneralSettings.DEFAULT, + LoaderSettings + .builder() + .setAutoUpdate(true) + .build(), + DumperSettings.DEFAULT, + UpdaterSettings + .builder() + .setVersioning(new BasicVersioning("config-version")) + .build() + ); + try { + document.save(new File(plugin.dataFolderFile(), "commands.yml")); + } catch (IOException e) { + throw new RuntimeException(e); + } + this.features().values().forEach(feature -> { + CommandConfig config = getCommandConfig(document, feature.getFeatureID()); + if (config.isEnable()) { + registerFeature(feature, config); + } + }); + } + + @Override + public void unregisterFeatures() { + this.registeredRootCommandComponents.forEach(component -> this.commandManager.commandRegistrationHandler().unregisterRootCommand(component)); + this.registeredRootCommandComponents.clear(); + this.registeredFeatures.forEach(CommandFeature::unregisterRelatedFunctions); + this.registeredFeatures.clear(); + } + + @Override + public org.incendo.cloud.CommandManager getCommandManager() { + return commandManager; + } + + @Override + public void handleCommandFeedback(C sender, TranslatableComponent.Builder key, Component... args) { + TranslatableComponent component = key.arguments(args).build(); + this.feedbackConsumer.accept(sender, component.key(), plugin.translationManager().render(component)); + } + + @Override + public void handleCommandFeedback(C sender, String node, Component component) { + this.feedbackConsumer.accept(sender, node, component); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandConfig.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandConfig.java new file mode 100644 index 000000000..63f4fd6f9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandConfig.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.plugin.command; + +import java.util.ArrayList; +import java.util.List; + +public class CommandConfig { + private boolean enable = false; + private List usages = new ArrayList<>(); + private String permission = null; + + private CommandConfig() { + } + + public CommandConfig(boolean enable, List usages, String permission) { + this.enable = enable; + this.usages = usages; + this.permission = permission; + } + + public boolean isEnable() { + return enable; + } + + public List getUsages() { + return usages; + } + + public String getPermission() { + return permission; + } + + public static class Builder { + private final CommandConfig config; + + public Builder() { + this.config = new CommandConfig<>(); + } + + public Builder usages(List usages) { + config.usages = usages; + return this; + } + + public Builder permission(String permission) { + config.permission = permission; + return this; + } + + public Builder enable(boolean enable) { + config.enable = enable; + return this; + } + + public CommandConfig build() { + return config; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandFeature.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandFeature.java new file mode 100644 index 000000000..4dd1fec7d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandFeature.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.core.plugin.Plugin; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; + +public interface CommandFeature { + + Command registerCommand(org.incendo.cloud.CommandManager cloudCommandManager, Command.Builder builder); + + String getFeatureID(); + + void registerRelatedFunctions(); + + void unregisterRelatedFunctions(); + + void handleFeedback(CommandContext context, TranslatableComponent.Builder key, Component... args); + + void handleFeedback(C sender, TranslatableComponent.Builder key, Component... args); + + CraftEngineCommandManager commandManager(); + + CommandConfig commandConfig(); + + Plugin plugin(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/ConfigurableCommandBuilder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/ConfigurableCommandBuilder.java new file mode 100644 index 000000000..6922a7c36 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/ConfigurableCommandBuilder.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.plugin.command; + +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; + +public interface ConfigurableCommandBuilder { + + ConfigurableCommandBuilder permission(String permission); + + ConfigurableCommandBuilder nodes(String... subNodes); + + Command.Builder build(); + + class BasicConfigurableCommandBuilder implements ConfigurableCommandBuilder { + private Command.Builder commandBuilder; + + public BasicConfigurableCommandBuilder(CommandManager commandManager, String rootNode) { + this.commandBuilder = commandManager.commandBuilder(rootNode); + } + + @Override + public ConfigurableCommandBuilder permission(String permission) { + this.commandBuilder = this.commandBuilder.permission(permission); + return this; + } + + @Override + public ConfigurableCommandBuilder nodes(String... subNodes) { + for (String sub : subNodes) { + this.commandBuilder = this.commandBuilder.literal(sub); + } + return this; + } + + @Override + public Command.Builder build() { + return commandBuilder; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCaptionKeys.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCaptionKeys.java new file mode 100644 index 000000000..c978ee7c8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCaptionKeys.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.plugin.command; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.Caption; + +public class CraftEngineCaptionKeys { + public static final Caption ARGUMENT_PARSE_FAILURE_BLOCK_STATE = of("argument.parse.failure.block_state"); + + private CraftEngineCaptionKeys() { + } + + private static @NonNull Caption of(@NonNull String key) { + return Caption.of(key); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCommandManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCommandManager.java new file mode 100644 index 000000000..942eab2df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCommandManager.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.command; + +import dev.dejvokep.boostedyaml.YamlDocument; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.util.Index; +import net.momirealms.craftengine.core.util.TriConsumer; +import org.incendo.cloud.Command; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public interface CraftEngineCommandManager { + String commandsFile = "commands.yml"; + + void unregisterFeatures(); + + void registerFeature(CommandFeature feature, CommandConfig config); + + void registerDefaultFeatures(); + + Index> features(); + + void setFeedbackConsumer(@NotNull TriConsumer feedbackConsumer); + + TriConsumer defaultFeedbackConsumer(); + + CommandConfig getCommandConfig(YamlDocument document, String featureID); + + Collection> buildCommandBuilders(CommandConfig config); + + org.incendo.cloud.CommandManager getCommandManager(); + + void handleCommandFeedback(C sender, TranslatableComponent.Builder key, Component... args); + + void handleCommandFeedback(C sender, String node, Component component); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java new file mode 100644 index 000000000..5cde8bd5c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.command; + +import org.incendo.cloud.parser.flag.CommandFlag; + +public final class FlagKeys { + public static final String SILENT = "silent"; + public static final CommandFlag SILENT_FLAG = CommandFlag.builder("silent").withAliases("s").build(); + public static final String TO_INVENTORY = "to-inventory"; + public static final CommandFlag TO_INVENTORY_FLAG = CommandFlag.builder("to-inventory").build(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/parser/BlockStateParser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/parser/BlockStateParser.java new file mode 100644 index 000000000..ccd5998b0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/parser/BlockStateParser.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.plugin.command.parser; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCaptionKeys; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.CaptionVariable; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.exception.parsing.ParserException; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.BlockingSuggestionProvider; + +public class BlockStateParser implements ArgumentParser, BlockingSuggestionProvider.Strings { + + public static @NonNull ParserDescriptor blockStateParser() { + return ParserDescriptor.of(new BlockStateParser<>(), ImmutableBlockState.class); + } + + public static CommandComponent.@NonNull Builder blockStateComponent() { + return CommandComponent.builder().parser(blockStateParser()); + } + + @Override + public @NonNull ArgumentParseResult<@NonNull ImmutableBlockState> parse(@NonNull CommandContext<@NonNull C> commandContext, @NonNull CommandInput commandInput) { + String input = commandInput.readString(); + ImmutableBlockState state = net.momirealms.craftengine.core.block.BlockStateParser.deserialize(input); + if (state == null) { + return ArgumentParseResult.failure(new BlockStateParseException(input, commandContext)); + } + return ArgumentParseResult.success(state); + } + + @Override + public @NonNull Iterable<@NonNull String> stringSuggestions(@NonNull CommandContext commandContext, @NonNull CommandInput input) { + return CraftEngine.instance().blockManager().cachedSuggestions().stream().map(it -> { + return it.suggestion(); + }).toList(); + } + + public static final class BlockStateParseException extends ParserException { + + private final String input; + + public BlockStateParseException( + final @NonNull String input, + final @NonNull CommandContext context + ) { + super( + BlockStateParser.class, + context, + CraftEngineCaptionKeys.ARGUMENT_PARSE_FAILURE_BLOCK_STATE, + CaptionVariable.of("input", input) + ); + this.input = input; + } + + public @NonNull String input() { + return this.input; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/AbstractSender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/AbstractSender.java new file mode 100644 index 000000000..ff1e71fa1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/AbstractSender.java @@ -0,0 +1,91 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Tristate; + +import java.util.UUID; + +/** + * Simple implementation of {@link Sender} using a {@link SenderFactory} + * + * @param the command sender type + */ +public final class AbstractSender implements Sender { + private final Plugin plugin; + private final SenderFactory factory; + private final T sender; + + private final UUID uniqueId; + private final String name; + private final boolean isConsole; + + AbstractSender(Plugin plugin, SenderFactory factory, T sender) { + this.plugin = plugin; + this.factory = factory; + this.sender = sender; + this.uniqueId = factory.uniqueId(this.sender); + this.name = factory.name(this.sender); + this.isConsole = this.factory.isConsole(this.sender); + } + + @Override + public Plugin plugin() { + return this.plugin; + } + + @Override + public UUID uniqueId() { + return this.uniqueId; + } + + @Override + public String name() { + return this.name; + } + + @Override + public void sendMessage(Component message) { + this.factory.sendMessage(this.sender, message); + } + + @Override + public void sendMessage(Component message, boolean ignoreEmpty) { + if (ignoreEmpty && message.equals(Component.empty())) { + return; + } + sendMessage(message); + } + + @Override + public Tristate permissionState(String permission) { + return (isConsole() && this.factory.consoleHasAllPermissions()) ? Tristate.TRUE : this.factory.permissionState(this.sender, permission); + } + + @Override + public boolean hasPermission(String permission) { + return (isConsole() && this.factory.consoleHasAllPermissions()) || this.factory.hasPermission(this.sender, permission); + } + + @Override + public void performCommand(String commandLine) { + this.factory.performCommand(this.sender, commandLine); + } + + @Override + public boolean isConsole() { + return this.isConsole; + } + + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof AbstractSender that)) return false; + return this.uniqueId().equals(that.uniqueId()); + } + + @Override + public int hashCode() { + return this.uniqueId.hashCode(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/DummyConsoleSender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/DummyConsoleSender.java new file mode 100644 index 000000000..e122fc6cb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/DummyConsoleSender.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.momirealms.craftengine.core.plugin.Plugin; + +import java.util.UUID; + +public abstract class DummyConsoleSender implements Sender { + private final Plugin platform; + + public DummyConsoleSender(Plugin plugin) { + this.platform = plugin; + } + + @Override + public void performCommand(String commandLine) { + } + + @Override + public boolean isConsole() { + return true; + } + + @Override + public Plugin plugin() { + return this.platform; + } + + @Override + public UUID uniqueId() { + return Sender.CONSOLE_UUID; + } + + @Override + public String name() { + return Sender.CONSOLE_NAME; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/Sender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/Sender.java new file mode 100644 index 000000000..4cb6f3adf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/Sender.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Tristate; + +import java.util.UUID; + +public interface Sender { + UUID CONSOLE_UUID = new UUID(0, 0); // 00000000-0000-0000-0000-000000000000 + String CONSOLE_NAME = "Console"; + + Plugin plugin(); + + String name(); + + UUID uniqueId(); + + void sendMessage(Component message); + + void sendMessage(Component message, boolean ignoreEmpty); + + Tristate permissionState(String permission); + + boolean hasPermission(String permission); + + void performCommand(String commandLine); + + boolean isConsole(); + + default boolean isValid() { + return true; + } + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/SenderFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/SenderFactory.java new file mode 100644 index 000000000..f08a3caf1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/SenderFactory.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Tristate; + +import java.util.Objects; +import java.util.UUID; + +public abstract class SenderFactory

{ + private final P plugin; + + public SenderFactory(P plugin) { + this.plugin = plugin; + } + + protected P plugin() { + return this.plugin; + } + + protected abstract UUID uniqueId(T sender); + + protected abstract String name(T sender); + + protected abstract Audience audience(T sender); + + protected abstract void sendMessage(T sender, Component message); + + protected abstract Tristate permissionState(T sender, String node); + + protected abstract boolean hasPermission(T sender, String node); + + protected abstract void performCommand(T sender, String command); + + protected abstract boolean isConsole(T sender); + + protected boolean consoleHasAllPermissions() { + return true; + } + + public Sender wrap(C sender) { + Objects.requireNonNull(sender, "sender"); + return new AbstractSender<>(this.plugin, this, sender); + } + + public void close() { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java new file mode 100644 index 000000000..c6971fa1c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java @@ -0,0 +1,204 @@ +package net.momirealms.craftengine.core.plugin.config; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; +import dev.dejvokep.boostedyaml.libs.org.snakeyaml.engine.v2.common.ScalarStyle; +import dev.dejvokep.boostedyaml.libs.org.snakeyaml.engine.v2.nodes.Tag; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import dev.dejvokep.boostedyaml.utils.format.NodeRole; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.util.ReflectionUtils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; + +public class ConfigManager implements Reloadable { + private static ConfigManager instance; + protected final CraftEngine plugin; + private YamlDocument config; + protected String configVersion; + + public YamlDocument settings() { + if (config == null) { + throw new IllegalStateException("Main config not loaded"); + } + return config; + } + + protected boolean debug; + protected boolean checkUpdate; + protected boolean metrics; + protected boolean resourcePack$overrideUniform; + protected boolean resourcePack$protection$breakFormat; + protected boolean hasPAPI; + protected boolean forceUpdateLight; + protected boolean enableLightSystem; + protected int maxChainUpdate; + protected boolean removeInvalidFurniture; + protected Set furnitureToRemove; + protected float packMinVersion; + protected float packMaxVersion; + protected boolean enableSoundSystem; + protected boolean enableRecipeSystem; + + public ConfigManager(CraftEngine plugin) { + this.plugin = plugin; + instance = this; + } + + @Override + public void load() { + configVersion = PluginProperties.getValue("config"); + config = plugin.loadYamlConfig( + "config.yml", + GeneralSettings.builder() + .setRouteSeparator('.') + .setUseDefaults(false) + .build(), + LoaderSettings + .builder() + .setAutoUpdate(true) + .build(), + DumperSettings.builder() + .setEscapeUnprintable(false) + .setScalarFormatter((tag, value, role, def) -> { + if (role == NodeRole.KEY) { + return ScalarStyle.PLAIN; + } else { + return tag == Tag.STR ? ScalarStyle.DOUBLE_QUOTED : ScalarStyle.PLAIN; + } + }) + .build(), + UpdaterSettings + .builder() + .setVersioning(new BasicVersioning("config-version")) + .build() + ); + loadSettings(); + } + + @Override + public void unload() { + Reloadable.super.unload(); + } + + private void loadSettings() { + YamlDocument config = settings(); + plugin.translationManager().forceLocale(TranslationManager.parseLocale(config.getString("force-locale", ""))); + // Basics + debug = config.getBoolean("debug", false); + metrics = config.getBoolean("metrics", false); + checkUpdate = config.getBoolean("update-checker", false); + // resource pack + resourcePack$overrideUniform = config.getBoolean("resource-pack.override-uniform-font", false); + packMinVersion = getVersion(config.get("resource-pack.supported-version.min", "1.20").toString()); + packMaxVersion = getVersion(config.get("resource-pack.supported-version.max", "LATEST").toString()); + // performance + maxChainUpdate = config.getInt("performance.max-block-chain-update-limit", 64); + forceUpdateLight = config.getBoolean("performance.light-system.force-update-light", false); + enableLightSystem = config.getBoolean("performance.light-system.enable", true); + // compatibility + hasPAPI = plugin.isPluginEnabled("PlaceholderAPI"); + // furniture + removeInvalidFurniture = config.getBoolean("furniture.remove-invalid-furniture-on-chunk-load.enable", false); + furnitureToRemove = new HashSet<>(config.getStringList("furniture.remove-invalid-furniture-on-chunk-load.list")); + // block + enableSoundSystem = config.getBoolean("block.sound-system.enable", true); + // recipe + enableRecipeSystem = config.getBoolean("recipe.enable", true); + + Class modClazz = ReflectionUtils.getClazz("net.momirealms.craftengine.mod.CraftEnginePlugin"); + if (modClazz != null) { + Method setMaxChainMethod = ReflectionUtils.getStaticMethod(modClazz, new String[] {"setMaxChainUpdate"}, void.class, int.class); + try { + assert setMaxChainMethod != null; + setMaxChainMethod.invoke(null, maxChainUpdate); + } catch (IllegalAccessException | InvocationTargetException e) { + plugin.logger().warn("Failed to set max chain update", e); + } + } + } + + private static float getVersion(String version) { + if (version.equalsIgnoreCase("LATEST")) { + version = PluginProperties.getValue("latest-version"); + } + String[] split = version.split("\\.", 2); + if (split.length != 2) { + throw new IllegalArgumentException("Invalid version: " + version); + } + return Float.parseFloat(split[1]); + } + + public static String configVersion() { + return instance.configVersion; + } + + public static boolean debug() { + return instance.debug; + } + + public static boolean checkUpdate() { + return instance.checkUpdate; + } + + public static boolean metrics() { + return instance.metrics; + } + + public static boolean hasPAPI() { + return instance.hasPAPI; + } + + public static boolean resourcePack$overrideUniform() { + return instance.resourcePack$overrideUniform; + } + + public static boolean resourcePack$protection$breakFormat() { + return instance.resourcePack$protection$breakFormat; + } + + public static int maxChainUpdate() { + return instance.maxChainUpdate; + } + + public static boolean removeInvalidFurniture() { + return instance.removeInvalidFurniture; + } + + public static Set furnitureToRemove() { + return instance.furnitureToRemove; + } + + public static boolean forceUpdateLight() { + return instance.forceUpdateLight; + } + + public static boolean enableLightSystem() { + return instance.enableLightSystem; + } + + public static float packMinVersion() { + return instance.packMinVersion; + } + + public static float packMaxVersion() { + return instance.packMaxVersion; + } + + public static boolean enableSoundSystem() { + return instance.enableSoundSystem; + } + + public static boolean enableRecipeSystem() { + return instance.enableRecipeSystem; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigSectionParser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigSectionParser.java new file mode 100644 index 000000000..dec473b6c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigSectionParser.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.plugin.config; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.Map; + +public interface ConfigSectionParser extends Comparable { + + String sectionId(); + + void parseSection(Pack pack, Path path, Key id, Map section); + + int loadingSequence(); + + @Override + default int compareTo(@NotNull ConfigSectionParser another) { + return Integer.compare(loadingSequence(), another.loadingSequence()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java new file mode 100644 index 000000000..8db8ae617 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.plugin.config; + +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.nodes.MappingNode; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.ScalarNode; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class StringKeyConstructor extends SafeConstructor { + + public StringKeyConstructor(LoaderOptions loaderOptions) { + super(loaderOptions); + } + + @Override + protected Map constructMapping(MappingNode node) { + Map map = new LinkedHashMap<>(); + for (NodeTuple tuple : node.getValue()) { + Node keyNode = tuple.getKeyNode(); + Node valueNode = tuple.getValueNode(); + String key = constructScalar((ScalarNode) keyNode); + Object value = constructObject(valueNode); + map.put(key, value); + } + return map; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Animation.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Animation.java new file mode 100644 index 000000000..94cb4b0a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Animation.java @@ -0,0 +1,162 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.Map; +import java.util.UUID; + +public class Animation { + @SerializedName("uuid") + private UUID uuid; + @SerializedName("name") + private String name; + @SerializedName("loop") + private String loop; + @SerializedName("override") + private boolean override; + @SerializedName("length") + private int length; + @SerializedName("snapping") + private int snapping; + @SerializedName("selected") + private boolean selected; + @SerializedName("anim_time_update") + private String anim_time_update; + @SerializedName("blend_weight") + private String blend_weight; + @SerializedName("start_delay") + private String start_delay; + @SerializedName("loop_delay") + private String loop_delay; + @SerializedName("animators") + private Map animators; + + public UUID uuid() { + return uuid; + } + + public String name() { + return name; + } + + public String loop() { + return loop; + } + + public boolean override() { + return override; + } + + public int length() { + return length; + } + + public int snapping() { + return snapping; + } + + public boolean selected() { + return selected; + } + + public String animTimeUpdate() { + return anim_time_update; + } + + public String blendWeight() { + return blend_weight; + } + + public String startDelay() { + return start_delay; + } + + public String loopDelay() { + return loop_delay; + } + + public Map animators() { + return animators; + } + + public static class Animator { + @SerializedName("name") + private String name; + @SerializedName("type") + private String type; + @SerializedName("keyframes") + private KeyFrame[] keyframes; + + public String name() { + return name; + } + + public String type() { + return type; + } + + public KeyFrame[] keyframes() { + return keyframes; + } + + public static class KeyFrame { + @SerializedName("channel") + private String channel; + @SerializedName("data_points") + private DataPoint[] data_points; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("time") + private double time; + @SerializedName("color") + private int color; + @SerializedName("interpolation") + private String interpolation; + + public String channel() { + return channel; + } + + public DataPoint[] dataPoints() { + return data_points; + } + + public UUID uuid() { + return uuid; + } + + public double time() { + return time; + } + + public int color() { + return color; + } + + public String interpolation() { + return interpolation; + } + + public static class DataPoint { + @SerializedName("x") + private String x; + @SerializedName("y") + private String y; + @SerializedName("z") + private String z; + + public String x() { + return x; + } + + public String y() { + return y; + } + + public String z() { + return z; + } + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/BBModel.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/BBModel.java new file mode 100644 index 000000000..8c4b0e176 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/BBModel.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class BBModel { + @SerializedName("name") + private String name; + @SerializedName("meta") + private ModelMeta meta; + @SerializedName("model_identifier") + private String model_identifier; + @SerializedName("visible_box") + private int[] visible_box; + @SerializedName("elements") + private Element[] elements; + @SerializedName("outliner") + private OutLiner[] outliner; + @SerializedName("textures") + private Texture[] textures; + + public String name() { + return name; + } + + public ModelMeta meta() { + return meta; + } + + public String modelIdentifier() { + return model_identifier; + } + + public int[] visibleBox() { + return visible_box; + } + + public Element[] elements() { + return elements; + } + + public OutLiner[] outliner() { + return outliner; + } + + public Texture[] textures() { + return textures; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Element.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Element.java new file mode 100644 index 000000000..65156e5e2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Element.java @@ -0,0 +1,93 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.UUID; + +public class Element { + + @SerializedName("type") + private String type; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("name") + private String name; + @SerializedName("box_uv") + private boolean box_uv; + @SerializedName("rescale") + private boolean rescale; + @SerializedName("locked") + private boolean locked; + @SerializedName("light_emission") + private int light_emission; + @SerializedName("render_order") + private String render_order; + @SerializedName("allow_mirror_modeling") + private boolean allow_mirror_modeling; + @SerializedName("from") + private double[] from; + @SerializedName("to") + private double[] to; + @SerializedName("autouv") + private int autouv; + @SerializedName("color") + private int color; + @SerializedName("origin") + private double[] origin; + + public String type() { + return type; + } + + public UUID uuid() { + return uuid; + } + + public String name() { + return name; + } + + public boolean box_uv() { + return box_uv; + } + + public boolean rescale() { + return rescale; + } + + public boolean locked() { + return locked; + } + + public int lightEmission() { + return light_emission; + } + + public String renderOrder() { + return render_order; + } + + public boolean allowMirrorModeling() { + return allow_mirror_modeling; + } + + public double[] from() { + return from; + } + + public double[] to() { + return to; + } + + public int autoUV() { + return autouv; + } + + public int color() { + return color; + } + + public double[] origin() { + return origin; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Faces.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Faces.java new file mode 100644 index 000000000..9edbbea5d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Faces.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class Faces { + @SerializedName("north") + private Face north; + @SerializedName("east") + private Face east; + @SerializedName("south") + private Face south; + @SerializedName("west") + private Face west; + @SerializedName("up") + private Face up; + @SerializedName("down") + private Face down; + + public Face north() { + return north; + } + + public Face east() { + return east; + } + + public Face south() { + return south; + } + + public Face west() { + return west; + } + + public Face up() { + return up; + } + + public Face down() { + return down; + } + + public static class Face { + @SerializedName("uv") + private double[] uv; + @SerializedName("texture") + private int texture; + + public double[] uv() { + return uv; + } + + public int texture() { + return texture; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/ModelMeta.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/ModelMeta.java new file mode 100644 index 000000000..6fa3ccee1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/ModelMeta.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class ModelMeta { + @SerializedName("format_version") + private String format_version; + @SerializedName("model_format") + private String model_format; + @SerializedName("box_uv") + private boolean box_uv; + + public String formatVersion() { + return format_version; + } + + public String modelFormat() { + return model_format; + } + + public boolean boxUV() { + return box_uv; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/OutLiner.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/OutLiner.java new file mode 100644 index 000000000..1ced55b47 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/OutLiner.java @@ -0,0 +1,74 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.UUID; + +public class OutLiner { + @SerializedName("name") + private String name; + @SerializedName("origin") + private double[] origin; + @SerializedName("color") + private int color; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("export") + private boolean export; + @SerializedName("locked") + private boolean locked; + @SerializedName("visibility") + private boolean visibility; + @SerializedName("mirror_uv") + private boolean mirror_uv; + @SerializedName("autouv") + private boolean autouv; + @SerializedName("isOpen") + private boolean is_open; + @SerializedName("children") + private OutLiner[] children; + + public String name() { + return name; + } + + public double[] origin() { + return origin; + } + + public int color() { + return color; + } + + public UUID uuid() { + return uuid; + } + + public boolean export() { + return export; + } + + public boolean locked() { + return locked; + } + + public boolean visibility() { + return visibility; + } + + public boolean mirrorUV() { + return mirror_uv; + } + + public boolean autoUV() { + return autouv; + } + + public boolean isOpen() { + return is_open; + } + + public OutLiner[] children() { + return children; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Resolution.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Resolution.java new file mode 100644 index 000000000..5916860ae --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Resolution.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class Resolution { + @SerializedName("width") + private int width; + @SerializedName("height") + private int height; + + public int width() { + return width; + } + + public int height() { + return height; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Texture.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Texture.java new file mode 100644 index 000000000..0ccbee398 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Texture.java @@ -0,0 +1,164 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.UUID; + +public class Texture { + @SerializedName("path") + private String path; + @SerializedName("name") + private String name; + @SerializedName("folder") + private String folder; + @SerializedName("namespace") + private String namespace; + @SerializedName("id") + private String id; + @SerializedName("group") + private String group; + @SerializedName("width") + private int width; + @SerializedName("height") + private int height; + @SerializedName("uv_width") + private int uv_width; + @SerializedName("uv_height") + private int uv_height; + @SerializedName("particle") + private boolean particle; + @SerializedName("use_as_default") + private boolean use_as_default; + @SerializedName("layers_enabled") + private boolean layers_enabled; + @SerializedName("sync_to_project") + private String sync_to_project; + @SerializedName("render_mode") + private String render_mode; + @SerializedName("render_sides") + private String render_sides; + @SerializedName("frame_time") + private int frame_time; + @SerializedName("frame_order_type") + private String frame_order_type; + @SerializedName("frame_order") + private String frame_order; + @SerializedName("frame_interpolate") + private boolean frame_interpolate; + @SerializedName("visible") + private boolean visible; + @SerializedName("internal") + private boolean internal; + @SerializedName("saved") + private boolean saved; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("relative_path") + private String relative_path; + @SerializedName("source") + private String source; + + public String path() { + return path; + } + + public String name() { + return name; + } + + public String folder() { + return folder; + } + + public String namespace() { + return namespace; + } + + public String id() { + return id; + } + + public String group() { + return group; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public int uvWidth() { + return uv_width; + } + + public int uvHeight() { + return uv_height; + } + + public boolean particle() { + return particle; + } + + public boolean useAsDefault() { + return use_as_default; + } + + public boolean layersEnabled() { + return layers_enabled; + } + + public String syncToProject() { + return sync_to_project; + } + + public String renderMode() { + return render_mode; + } + + public String renderSides() { + return render_sides; + } + + public int frameTime() { + return frame_time; + } + + public String frameOrderType() { + return frame_order_type; + } + + public String frameOrder() { + return frame_order; + } + + public boolean frameInterpolate() { + return frame_interpolate; + } + + public boolean visible() { + return visible; + } + + public boolean internal() { + return internal; + } + + public boolean saved() { + return saved; + } + + public UUID uuid() { + return uuid; + } + + public String relativePath() { + return relative_path; + } + + public String source() { + return source; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java new file mode 100644 index 000000000..341a7f001 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class PlainStringTemplateArgument implements TemplateArgument { + public static final Factory FACTORY = new Factory(); + private final String value; + + public PlainStringTemplateArgument(String value) { + this.value = value; + } + + @Override + public String get() { + return value; + } + + @Override + public Key type() { + return TemplateArguments.PLAIN; + } + + public static class Factory implements TemplateArgumentFactory { + @Override + public TemplateArgument create(Map arguments) { + return new PlainStringTemplateArgument(arguments.getOrDefault("value", "").toString()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java new file mode 100644 index 000000000..89dab33a5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class SelfIncreaseIntTemplateArgument implements TemplateArgument { + public static final Factory FACTORY = new Factory(); + private final int min; + private final int max; + private int current; + + public SelfIncreaseIntTemplateArgument(int min, int max) { + this.min = min; + this.max = max; + this.current = min; + } + + @Override + public String get() { + String value = String.valueOf(current); + if (current < max) current += 1; + return value; + } + + @Override + public Key type() { + return TemplateArguments.SELF_INCREASE_INT; + } + + public int current() { + return current; + } + + public int min() { + return min; + } + + public int max() { + return max; + } + + public static class Factory implements TemplateArgumentFactory { + @Override + public TemplateArgument create(Map arguments) { + int from = MiscUtils.getAsInt(arguments.get("from")); + int to = MiscUtils.getAsInt(arguments.get("to")); + if (from > to) throw new IllegalArgumentException("from > to"); + return new SelfIncreaseIntTemplateArgument(from, to); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgument.java new file mode 100644 index 000000000..912d7e915 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgument.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Supplier; + +public interface TemplateArgument extends Supplier { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgumentFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgumentFactory.java new file mode 100644 index 000000000..63812d722 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgumentFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import java.util.Map; + +public interface TemplateArgumentFactory { + + TemplateArgument create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java new file mode 100644 index 000000000..6912ca7c7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class TemplateArguments { + public static final Key PLAIN = Key.of("craftengine:plain"); + public static final Key SELF_INCREASE_INT = Key.of("craftengine:self_increase_int"); + + public static void register(Key key, TemplateArgumentFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.TEMPLATE_ARGUMENT_FACTORY.location(), key)); + holder.bindValue(factory); + } + + static { + register(PLAIN, PlainStringTemplateArgument.FACTORY); + register(SELF_INCREASE_INT, SelfIncreaseIntTemplateArgument.FACTORY); + } + + public static TemplateArgument fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("argument type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + TemplateArgumentFactory factory = BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown argument type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java new file mode 100644 index 000000000..d0efd57b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; + +import java.util.Map; +import java.util.regex.Pattern; + +public interface TemplateManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "templates"; + Pattern PATTERN = Pattern.compile("\\{[^{}]+}"); + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Map applyTemplates(Map input); + + default int loadingSequence() { + return LoadingSequence.TEMPLATE; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java new file mode 100644 index 000000000..f555287fe --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java @@ -0,0 +1,188 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.PreConditions; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.regex.Matcher; + +import static net.momirealms.craftengine.core.util.MiscUtils.castToList; +import static net.momirealms.craftengine.core.util.MiscUtils.castToMap; + +public class TemplateManagerImpl implements TemplateManager { + private final CraftEngine plugin; + private final Map templates = new HashMap<>(); + + public TemplateManagerImpl(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void unload() { + this.templates.clear(); + } + + @Override + public void parseSection(Pack pack, + Path path, + Key id, + Map section) { + if (PreConditions.runIfTrue(this.templates.containsKey(id), () -> this.plugin.logger().warn(path, "Template duplicates: " + id))) return; + this.templates.put(id, section); + } + + @Override + public Map applyTemplates(Map input) { + Objects.requireNonNull(input, "Input must not be null"); + Map result = new LinkedHashMap<>(); + applyTemplatesRecursive("", input, result, Collections.emptyMap()); + return result; + } + + private void applyTemplatesRecursive(String currentPath, + Map input, + Map result, + Map> parentArguments) { + if (input.containsKey("template")) { + TemplateProcessingResult processingResult = processTemplates(input, parentArguments); + List templates = processingResult.templates(); + Object overrides = processingResult.overrides(); + Map> arguments = mergeArguments(parentArguments, processingResult.arguments()); + + for (Object template : templates) { + if (template instanceof Map mapTemplate) { + handleMapTemplate(currentPath, castToMap(mapTemplate, false), overrides, arguments, result); + } else if (template instanceof List listTemplate) { + handleListTemplate(currentPath, castToList(listTemplate, false), overrides, arguments, result); + } else if (template instanceof String stringTemplate) { + result.put(currentPath, applyArgument(stringTemplate, arguments)); + } else { + result.put(currentPath, template); + } + } + } else { + Map innerResult = currentPath.isEmpty() ? result : new LinkedHashMap<>(); + if (!currentPath.isEmpty()) result.put(currentPath, innerResult); + + input.forEach((key, value) -> processValue( + value, + processedValue -> innerResult.put(key, processedValue), + parentArguments + )); + } + } + + private TemplateProcessingResult processTemplates(Map input, Map> parentArguments) { + List templateIds = MiscUtils.getAsStringList(input.get("template")); + List templateList = new ArrayList<>(); + for (String templateId : templateIds) { + Object template = Optional.ofNullable(templates.get(Key.of(templateId))) + .orElseThrow(() -> new IllegalArgumentException("Template not found: " + templateId)); + templateList.add(template); + } + Map> arguments = getArguments( + castToMap(input.getOrDefault("arguments", Collections.emptyMap()), false) + ); + arguments.putAll(parentArguments); + return new TemplateProcessingResult( + templateList, + input.get("overrides"), + arguments + ); + } + + private Map> getArguments(@NotNull Map argumentMap) { + Map> result = new HashMap<>(); + argumentMap.forEach((key, value) -> { + String placeholder = "{" + key + "}"; + if (value instanceof Map nestedMap) { + result.put(placeholder, TemplateArguments.fromMap(castToMap(nestedMap, false))); + } else { + result.put(placeholder, value::toString); + } + }); + return result; + } + + private String applyArgument(String input, Map> arguments) { + StringBuilder result = new StringBuilder(); + Matcher matcher = PATTERN.matcher(input); + while (matcher.find()) { + String placeholder = matcher.group(); + Supplier replacer = arguments.get(placeholder); + matcher.appendReplacement(result, replacer != null ? replacer.get() : placeholder); + } + matcher.appendTail(result); + return result.toString(); + } + + private void processValue(Object value, + Consumer resultConsumer, + Map> arguments) { + if (value instanceof Map mapValue) { + Map nestedResult = new LinkedHashMap<>(); + applyTemplatesRecursive("", castToMap(mapValue, false), nestedResult, arguments); + resultConsumer.accept(nestedResult); + } else if (value instanceof List listValue) { + List nestedList = new ArrayList<>(); + processList(castToList(listValue, false), nestedList, arguments); + resultConsumer.accept(nestedList); + } else if (value instanceof String strValue) { + resultConsumer.accept(applyArgument(strValue, arguments)); + } else { + resultConsumer.accept(value); + } + } + + private void processList(List inputList, List resultList, Map> arguments) { + for (Object item : inputList) { + processValue(item, resultList::add, arguments); + } + } + + private void handleMapTemplate(String currentPath, Map template, + Object overrides, + Map> arguments, + Map result) { + Map merged = new LinkedHashMap<>(template); + if (overrides != null) { + merged.putAll(castToMap(overrides, false)); + } + applyTemplatesRecursive(currentPath, merged, result, arguments); + } + + private void handleListTemplate(String currentPath, + List template, + Object overrides, + Map> arguments, + Map result) { + List merged = (overrides instanceof List overrideList && !overrideList.isEmpty()) + ? castToList(overrideList, false) + : template; + List processedList = new ArrayList<>(); + processList(merged, processedList, arguments); + result.put(currentPath, processedList); + } + + private record TemplateProcessingResult( + List templates, + Object overrides, + Map> arguments + ) {} + + private static Map> mergeArguments( + Map> parent, + Map> child + ) { + Map> merged = new HashMap<>(parent); + merged.putAll(child); + return merged; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java new file mode 100644 index 000000000..115368464 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java @@ -0,0 +1,182 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation; + +import java.util.Collections; +import java.util.List; + +public class Dependencies { + + public static final Dependency ASM = new Dependency( + "asm", + "org.ow2.asm", + "asm", + "asm", + Collections.emptyList() + ); + public static final Dependency ASM_COMMONS = new Dependency( + "asm-commons", + "org.ow2.asm", + "asm-commons", + "asm-commons", + Collections.emptyList() + ); + public static final Dependency JAR_RELOCATOR = new Dependency( + "jar-relocator", + "me.lucko", + "jar-relocator", + "jar-relocator", + Collections.emptyList() + ); + public static final Dependency GEANTY_REF = new Dependency( + "geantyref", + "io{}leangen{}geantyref", + "geantyref", + "geantyref", + List.of(Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_CORE = new Dependency( + "cloud-core", + "org{}incendo", + "cloud-core", + "cloud-core", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_BRIGADIER = new Dependency( + "cloud-brigadier", + "org{}incendo", + "cloud-brigadier", + "cloud-brigadier", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_SERVICES = new Dependency( + "cloud-services", + "org{}incendo", + "cloud-services", + "cloud-services", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_BUKKIT = new Dependency( + "cloud-bukkit", + "org{}incendo", + "cloud-bukkit", + "cloud-bukkit", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref"), + Relocation.of("adventure", "net{}kyori{}adventure"), + Relocation.of("examination", "net{}kyori{}examination"), + Relocation.of("option", "net{}kyori{}option")) + ); + public static final Dependency CLOUD_PAPER = new Dependency( + "cloud-paper", + "org{}incendo", + "cloud-paper", + "cloud-paper", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref"), + Relocation.of("adventure", "net{}kyori{}adventure"), + Relocation.of("examination", "net{}kyori{}examination"), + Relocation.of("option", "net{}kyori{}option")) + ); + public static final Dependency CLOUD_MINECRAFT_EXTRAS = new Dependency( + "cloud-minecraft-extras", + "org{}incendo", + "cloud-minecraft-extras", + "cloud-minecraft-extras", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref"), + Relocation.of("adventure", "net{}kyori{}adventure"), + Relocation.of("examination", "net{}kyori{}examination"), + Relocation.of("option", "net{}kyori{}option")) + ); + public static final Dependency BOOSTED_YAML = new Dependency( + "boosted-yaml", + "dev{}dejvokep", + "boosted-yaml", + "boosted-yaml", + List.of(Relocation.of("boostedyaml", "dev{}dejvokep{}boostedyaml")) + ); + public static final Dependency BSTATS_BASE = new Dependency( + "bstats-base", + "org{}bstats", + "bstats-base", + "bstats-base", + List.of(Relocation.of("bstats", "org{}bstats")) + ); + public static final Dependency BSTATS_BUKKIT = new Dependency( + "bstats-bukkit", + "org{}bstats", + "bstats-bukkit", + "bstats-bukkit", + List.of(Relocation.of("bstats", "org{}bstats")) + ) { + @Override + public String getVersion() { + return Dependencies.BSTATS_BASE.getVersion(); + } + }; + public static final Dependency GSON = new Dependency( + "gson", + "com.google.code.gson", + "gson", + "gson", + Collections.emptyList() + ); + public static final Dependency CAFFEINE = new Dependency( + "caffeine", + "com{}github{}ben-manes{}caffeine", + "caffeine", + "caffeine", + List.of(Relocation.of("caffeine", "com{}github{}benmanes{}caffeine")) + ); + public static final Dependency ZSTD = new Dependency( + "zstd-jni", + "com.github.luben", + "zstd-jni", + "zstd-jni", + Collections.emptyList() + ); + public static final Dependency SLF4J_API = new Dependency( + "slf4j-api", + "org.slf4j", + "slf4j-api", + "slf4j-api", + Collections.emptyList() + ); + public static final Dependency SLF4J_SIMPLE = new Dependency( + "slf4j-simple", + "org.slf4j", + "slf4j-simple", + "slf4j-simple", + Collections.emptyList() + ) { + @Override + public String getVersion() { + return Dependencies.SLF4J_API.getVersion(); + } + }; + public static final Dependency COMMONS_IO = new Dependency( + "commons-io", + "commons-io", + "commons-io", + "commons-io", + List.of(Relocation.of("commons", "org{}apache{}commons")) + ); + public static final Dependency BYTE_BUDDY = new Dependency( + "byte-buddy", + "net{}bytebuddy", + "byte-buddy", + "byte-buddy", + List.of(Relocation.of("bytebuddy", "net{}bytebuddy")) + ); + public static final Dependency SNAKE_YAML = new Dependency( + "snake-yaml", + "org{}yaml", + "snakeyaml", + "snakeyaml", + List.of(Relocation.of("snakeyaml", "org{}yaml{}snakeyaml")) + ); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependency.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependency.java new file mode 100644 index 000000000..0bf50cb9d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependency.java @@ -0,0 +1,92 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation; + +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +public class Dependency { + private final String id; + private final String groupId; + private final String rawArtifactId; + private final String customArtifactID; + private final List relocations; + + public Dependency(String id, String groupId, String rawArtifactId, String customArtifactID, List relocations) { + this.id = id; + this.groupId = groupId; + this.rawArtifactId = rawArtifactId; + this.customArtifactID = customArtifactID; + this.relocations = relocations; + } + + public String id() { + return id; + } + + public String groupId() { + return groupId; + } + + public String rawArtifactId() { + return rawArtifactId; + } + + public String customArtifactID() { + return customArtifactID; + } + + public List relocations() { + return relocations; + } + + private static final String MAVEN_FORMAT = "%s/%s/%s/%s-%s.jar"; + + public String mavenPath() { + return String.format(MAVEN_FORMAT, + rewriteEscaping(groupId).replace(".", "/"), + rewriteEscaping(rawArtifactId), + getVersion(), + rewriteEscaping(rawArtifactId), + getVersion() + ); + } + + public String fileName(String classifier) { + String name = customArtifactID.toLowerCase(Locale.ROOT).replace('_', '-'); + String extra = classifier == null || classifier.isEmpty() + ? "" + : "-" + classifier; + return name + "-" + this.getVersion() + extra + ".jar"; + } + + public String getVersion() { + return PluginProperties.getValue(id); + } + + private static String rewriteEscaping(String s) { + return s.replace("{}", "."); + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Dependency that)) return false; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public String toString() { + return "Dependency{" + + "id='" + id + '\'' + + ", groupId='" + groupId + '\'' + + '}'; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyDownloadException.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyDownloadException.java new file mode 100644 index 000000000..00bf570a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyDownloadException.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +public class DependencyDownloadException extends Exception { + public DependencyDownloadException() { + } + + public DependencyDownloadException(String message) { + super(message); + } + + public DependencyDownloadException(String message, Throwable cause) { + super(message, cause); + } + + public DependencyDownloadException(Throwable cause) { + super(cause); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManager.java new file mode 100644 index 000000000..54b17e5af --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManager.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import java.util.Collection; +import java.util.Set; + +/** + * Loads and manages runtime dependencies for the plugin. + */ +public interface DependencyManager extends AutoCloseable { + + /** + * Loads dependencies. + * + * @param dependencies the dependencies to load + */ + void loadDependencies(Collection dependencies); + + /** + * Obtains an isolated classloader containing the given dependencies. + * + * @param dependencies the dependencies + * @return the classloader + */ + ClassLoader obtainClassLoaderWith(Set dependencies); + + @Override + void close(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManagerImpl.java new file mode 100644 index 000000000..0f3f15376 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManagerImpl.java @@ -0,0 +1,197 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; +import net.momirealms.craftengine.core.plugin.dependency.classloader.IsolatedClassLoader; +import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation; +import net.momirealms.craftengine.core.plugin.dependency.relocation.RelocationHandler; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; + +public class DependencyManagerImpl implements DependencyManager { + private final DependencyRegistry registry; + private final Path cacheDirectory; + private final ClassPathAppender classPathAppender; + private final Map loaded = Collections.synchronizedMap(new HashMap<>()); + private final Map, IsolatedClassLoader> loaders = new HashMap<>(); + private final RelocationHandler relocationHandler; + private final Executor loadingExecutor; + private final Plugin plugin; + + public DependencyManagerImpl(Plugin plugin) { + this.plugin = plugin; + this.registry = new DependencyRegistry(); + this.cacheDirectory = setupCacheDirectory(plugin); + this.classPathAppender = plugin.classPathAppender(); + this.loadingExecutor = plugin.scheduler().async(); + this.relocationHandler = new RelocationHandler(this); + } + + @Override + public ClassLoader obtainClassLoaderWith(Set dependencies) { + Set set = new HashSet<>(dependencies); + + for (Dependency dependency : dependencies) { + if (!this.loaded.containsKey(dependency)) { + throw new IllegalStateException("Dependency " + dependency.id() + " is not loaded."); + } + } + + synchronized (this.loaders) { + IsolatedClassLoader classLoader = this.loaders.get(set); + if (classLoader != null) { + return classLoader; + } + + URL[] urls = set.stream() + .map(this.loaded::get) + .map(file -> { + try { + return file.toUri().toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + }) + .toArray(URL[]::new); + + classLoader = new IsolatedClassLoader(urls); + this.loaders.put(set, classLoader); + return classLoader; + } + } + + @Override + public void loadDependencies(Collection dependencies) { + CountDownLatch latch = new CountDownLatch(dependencies.size()); + + for (Dependency dependency : dependencies) { + if (this.loaded.containsKey(dependency)) { + latch.countDown(); + continue; + } + + this.loadingExecutor.execute(() -> { + try { + loadDependency(dependency); + } catch (Throwable e) { + this.plugin.logger().warn("Unable to load dependency " + dependency.id(), e); + } finally { + latch.countDown(); + } + }); + } + + try { + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private void loadDependency(Dependency dependency) throws Exception { + if (this.loaded.containsKey(dependency)) { + return; + } + + Path file = remapDependency(dependency, downloadDependency(dependency)); + + this.loaded.put(dependency, file); + + if (this.classPathAppender != null && this.registry.shouldAutoLoad(dependency)) { + this.classPathAppender.addJarToClasspath(file); + } + } + + private Path downloadDependency(Dependency dependency) throws DependencyDownloadException { + String fileName = dependency.fileName(null); + Path file = this.cacheDirectory.resolve(fileName); + // if the file already exists, don't attempt to re-download it. + if (Files.exists(file)) { + return file; + } + DependencyDownloadException lastError = null; + List repository = DependencyRepository.getByID("maven"); + if (!repository.isEmpty()) { + int i = 0; + while (i < repository.size()) { + try { + plugin.logger().info("Downloading dependency(" + fileName + ")[" + repository.get(i).getUrl() + dependency.mavenPath() + "]"); + repository.get(i).download(dependency, file); + plugin.logger().info("Successfully downloaded " + fileName); + return file; + } catch (DependencyDownloadException e) { + lastError = e; + i++; + } + } + } + throw Objects.requireNonNull(lastError); + } + + private Path remapDependency(Dependency dependency, Path normalFile) throws Exception { + List rules = new ArrayList<>(dependency.relocations()); + if (rules.isEmpty()) { + return normalFile; + } + + Path remappedFile = this.cacheDirectory.resolve(dependency.fileName(DependencyRegistry.isGsonRelocated() ? "remapped-legacy" : "remapped")); + + // if the remapped source exists already, just use that. + if (Files.exists(remappedFile)) { + return remappedFile; + } + + plugin.logger().info("Remapping " + dependency.fileName(null)); + relocationHandler.remap(normalFile, remappedFile, rules); + plugin.logger().info("Successfully remapped " + dependency.fileName(null)); + return remappedFile; + } + + private static Path setupCacheDirectory(Plugin plugin) { + Path cacheDirectory = plugin.dataFolderPath().resolve("libs"); + try { + if (Files.exists(cacheDirectory) && (Files.isDirectory(cacheDirectory) || Files.isSymbolicLink(cacheDirectory))) { + return cacheDirectory; + } + + try { + Files.createDirectories(cacheDirectory); + } catch (FileAlreadyExistsException e) { + // ignore + } + } catch (IOException e) { + throw new RuntimeException("Unable to create libs directory", e); + } + + return cacheDirectory; + } + + @Override + public void close() { + IOException firstEx = null; + + for (IsolatedClassLoader loader : this.loaders.values()) { + try { + loader.close(); + } catch (IOException ex) { + if (firstEx == null) { + firstEx = ex; + } else { + firstEx.addSuppressed(ex); + } + } + } + + if (firstEx != null) { + plugin.logger().severe(firstEx.getMessage(), firstEx); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRegistry.java new file mode 100644 index 000000000..9e7328d86 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRegistry.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import com.google.gson.JsonElement; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class DependencyRegistry { + private static final Set DO_NOT_AUTO_LOAD = Stream.of( + Dependencies.ASM, Dependencies.ASM_COMMONS, Dependencies.JAR_RELOCATOR, Dependencies.ZSTD + ).map(Dependency::id).collect(Collectors.toSet()); + + private static final String GROUP_ID = "net.momirealms"; + + public boolean shouldAutoLoad(Dependency dependency) { + return !DO_NOT_AUTO_LOAD.contains(dependency.id()); + } + + @SuppressWarnings("ConstantConditions") + public static boolean isGsonRelocated() { + return JsonElement.class.getName().startsWith(GROUP_ID); + } + + private static boolean classExists(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + private static boolean slf4jPresent() { + return classExists("org.slf4j.Logger") && classExists("org.slf4j.LoggerFactory"); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRepository.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRepository.java new file mode 100644 index 000000000..51de4e608 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRepository.java @@ -0,0 +1,93 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +public enum DependencyRepository { + /** + * Maven Central + */ + MAVEN_CENTRAL("maven", "https://repo1.maven.org/maven2/") { + @Override + protected URLConnection openConnection(Dependency dependency) throws IOException { + URLConnection connection = super.openConnection(dependency); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + return connection; + } + }, + /** + * Maven Central Mirror + */ + MAVEN_CENTRAL_MIRROR("maven", "https://maven.aliyun.com/repository/public/"); + + private final String url; + private final String id; + + DependencyRepository(String id, String url) { + this.url = url; + this.id = id; + } + + public String getUrl() { + return url; + } + + public static List getByID(String id) { + ArrayList repositories = new ArrayList<>(); + for (DependencyRepository repository : values()) { + if (id.equals(repository.id)) { + repositories.add(repository); + } + } + // 中国大陆优先使用国内阿里云镜像 + if (id.equals("maven") && Locale.getDefault() == Locale.SIMPLIFIED_CHINESE) { + Collections.reverse(repositories); + } + return repositories; + } + + protected URLConnection openConnection(Dependency dependency) throws IOException { + URL dependencyUrl = new URL(this.url + dependency.mavenPath()); + return dependencyUrl.openConnection(); + } + + public byte[] downloadRaw(Dependency dependency) throws DependencyDownloadException { + try { + URLConnection connection = openConnection(dependency); + try (InputStream in = connection.getInputStream()) { + byte[] bytes = in.readAllBytes(); + if (bytes.length == 0) { + throw new DependencyDownloadException("Empty stream"); + } + return bytes; + } + } catch (Exception e) { + throw new DependencyDownloadException(e); + } + } + + public byte[] download(Dependency dependency) throws DependencyDownloadException { + return downloadRaw(dependency); + } + + public void download(Dependency dependency, Path file) throws DependencyDownloadException { + try { + Files.write(file, download(dependency)); + } catch (IOException e) { + throw new DependencyDownloadException(e); + } + } + + public String id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/classloader/IsolatedClassLoader.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/classloader/IsolatedClassLoader.java new file mode 100644 index 000000000..19e769536 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/classloader/IsolatedClassLoader.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.plugin.dependency.classloader; + +import java.net.URL; +import java.net.URLClassLoader; + +public class IsolatedClassLoader extends URLClassLoader { + static { + ClassLoader.registerAsParallelCapable(); + } + + public IsolatedClassLoader(URL[] urls) { + super(urls, ClassLoader.getSystemClassLoader().getParent()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/Relocation.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/Relocation.java new file mode 100644 index 000000000..2833d3f3d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/Relocation.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.plugin.dependency.relocation; + +import java.util.Objects; + +public final class Relocation { + private static final String RELOCATION_PREFIX = "net.momirealms.craftengine.libraries."; + + public static Relocation of(String id, String pattern) { + return new Relocation(pattern.replace("{}", "."), RELOCATION_PREFIX + id); + } + + private final String pattern; + private final String relocatedPattern; + + private Relocation(String pattern, String relocatedPattern) { + this.pattern = pattern; + this.relocatedPattern = relocatedPattern; + } + + public String getPattern() { + return this.pattern; + } + + public String getRelocatedPattern() { + return this.relocatedPattern; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Relocation that = (Relocation) o; + return Objects.equals(this.pattern, that.pattern) && + Objects.equals(this.relocatedPattern, that.relocatedPattern); + } + + @Override + public int hashCode() { + return Objects.hash(this.pattern, this.relocatedPattern); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/RelocationHandler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/RelocationHandler.java new file mode 100644 index 000000000..1feb1eb3d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/RelocationHandler.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.plugin.dependency.relocation; + +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.plugin.dependency.Dependency; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; +import net.momirealms.craftengine.core.plugin.dependency.classloader.IsolatedClassLoader; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class RelocationHandler { + public static final Set DEPENDENCIES = Set.of(Dependencies.ASM, Dependencies.ASM_COMMONS, Dependencies.JAR_RELOCATOR); + private static final String JAR_RELOCATOR_CLASS = "me.lucko.jarrelocator.JarRelocator"; + private static final String JAR_RELOCATOR_RUN_METHOD = "run"; + + private final Constructor jarRelocatorConstructor; + private final Method jarRelocatorRunMethod; + + public RelocationHandler(DependencyManager dependencyManager) { + ClassLoader classLoader = null; + try { + dependencyManager.loadDependencies(DEPENDENCIES); + classLoader = dependencyManager.obtainClassLoaderWith(DEPENDENCIES); + Class jarRelocatorClass = classLoader.loadClass(JAR_RELOCATOR_CLASS); + this.jarRelocatorConstructor = jarRelocatorClass.getDeclaredConstructor(File.class, File.class, Map.class); + this.jarRelocatorConstructor.setAccessible(true); + this.jarRelocatorRunMethod = jarRelocatorClass.getDeclaredMethod(JAR_RELOCATOR_RUN_METHOD); + this.jarRelocatorRunMethod.setAccessible(true); + } catch (Exception e) { + try { + if (classLoader instanceof IsolatedClassLoader isolatedClassLoader) { + isolatedClassLoader.close(); + } + } catch (IOException ex) { + e.addSuppressed(ex); + } + throw new RuntimeException(e); + } + } + + public void remap(Path input, Path output, List relocations) throws Exception { + Map mappings = new HashMap<>(); + for (Relocation relocation : relocations) { + mappings.put(relocation.getPattern(), relocation.getRelocatedPattern()); + } + + Object relocator = this.jarRelocatorConstructor.newInstance(input.toFile(), output.toFile(), mappings); + this.jarRelocatorRunMethod.invoke(relocator); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionFormatter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionFormatter.java new file mode 100644 index 000000000..917c60e1e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionFormatter.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.Caption; +import org.incendo.cloud.caption.CaptionVariable; +import org.incendo.cloud.minecraft.extras.caption.ComponentCaptionFormatter; + +import java.util.List; + +public class CraftEngineCaptionFormatter implements ComponentCaptionFormatter { + private final TranslationManager translationManager; + + public CraftEngineCaptionFormatter(final TranslationManager translationManager) { + this.translationManager = translationManager; + } + + @Override + public @NonNull Component formatCaption(@NonNull Caption captionKey, @NonNull C recipient, @NonNull String caption, @NonNull List<@NonNull CaptionVariable> variables) { + Component component = ComponentCaptionFormatter.translatable().formatCaption(captionKey, recipient, caption, variables); + return translationManager.render(component); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionProvider.java new file mode 100644 index 000000000..44c080490 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionProvider.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.CaptionProvider; +import org.incendo.cloud.caption.DelegatingCaptionProvider; + +public final class CraftEngineCaptionProvider extends DelegatingCaptionProvider { + private static final CaptionProvider PROVIDER = CaptionProvider.constantProvider() + .build(); + + @SuppressWarnings("unchecked") + @Override + public @NonNull CaptionProvider delegate() { + return (CaptionProvider) PROVIDER; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java new file mode 100644 index 000000000..565700c63 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; + +public interface MessageConstants { + TranslatableComponent.Builder COMMAND_RELOAD_SUCCESS = Component.translatable().key("command.reload.success"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistry.java new file mode 100644 index 000000000..0d55bfa99 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistry.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.translation.Translator; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; + +import static java.util.Objects.requireNonNull; + +public interface MiniMessageTranslationRegistry extends Translator { + static @NotNull MiniMessageTranslationRegistry create(final Key name, final MiniMessage miniMessage) { + return new MiniMessageTranslationRegistryImpl(requireNonNull(name, "name"), requireNonNull(miniMessage, "MiniMessage")); + } + + void register(@NotNull String key, @NotNull Locale locale, @NotNull String format); + + void unregister(@NotNull String key); + + boolean contains(@NotNull String key); + + String miniMessageTranslation(@NotNull String key, @NotNull Locale locale); + + void defaultLocale(@NotNull Locale defaultLocale); + + default void registerAll(final @NotNull Locale locale, final @NotNull Map bundle) { + this.registerAll(locale, bundle.keySet(), bundle::get); + } + + default void registerAll(final @NotNull Locale locale, final @NotNull Set keys, final Function function) { + IllegalArgumentException firstError = null; + int errorCount = 0; + for (final String key : keys) { + try { + this.register(key, locale, function.apply(key)); + } catch (final IllegalArgumentException e) { + if (firstError == null) { + firstError = e; + } + errorCount++; + } + } + if (firstError != null) { + if (errorCount == 1) { + throw firstError; + } else if (errorCount > 1) { + throw new IllegalArgumentException(String.format("Invalid key (and %d more)", errorCount - 1), firstError); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistryImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistryImpl.java new file mode 100644 index 000000000..8c9ba034b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistryImpl.java @@ -0,0 +1,222 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.internal.Internals; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.util.TriState; +import net.kyori.examination.Examinable; +import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; + +import static java.util.Objects.requireNonNull; + +public class MiniMessageTranslationRegistryImpl implements Examinable, MiniMessageTranslationRegistry { + private final Key name; + private final Map translations = new ConcurrentHashMap<>(); + private Locale defaultLocale = Locale.US; + private final MiniMessage miniMessage; + + MiniMessageTranslationRegistryImpl(final Key name, final MiniMessage miniMessage) { + this.name = name; + this.miniMessage = miniMessage; + } + + @Override + public void register(final @NotNull String key, final @NotNull Locale locale, final @NotNull String format) { + this.translations.computeIfAbsent(key, Translation::new).register(locale, format); + } + + @Override + public void unregister(final @NotNull String key) { + this.translations.remove(key); + } + + @Override + public boolean contains(final @NotNull String key) { + return this.translations.containsKey(key); + } + + @Override + public @NotNull Key name() { + return name; + } + + @Override + public @Nullable MessageFormat translate(@NotNull String key, @NotNull Locale locale) { + // No need to implement this method + return null; + } + + @Override + public @Nullable Component translate(@NotNull TranslatableComponent component, @NotNull Locale locale) { + Translation translation = translations.get(component.key()); + if (translation == null) { + return null; + } + String miniMessageString = translation.translate(locale); + if (miniMessageString == null) { + return null; + } + if (miniMessageString.isEmpty()) { + return Component.empty(); + } + final Component resultingComponent; + if (component.arguments().isEmpty()) { + resultingComponent = this.miniMessage.deserialize(miniMessageString); + } else { + resultingComponent = this.miniMessage.deserialize(miniMessageString, new ArgumentTag(component.arguments())); + } + if (component.children().isEmpty()) { + return resultingComponent; + } else { + return resultingComponent.children(component.children()); + } + } + + @Override + public String miniMessageTranslation(@NotNull String key, @NotNull Locale locale) { + Translation translation = translations.get(key); + if (translation == null) { + return null; + } + return translation.translate(locale); + } + + @Override + public @NotNull TriState hasAnyTranslations() { + if (!this.translations.isEmpty()) { + return TriState.TRUE; + } + return TriState.FALSE; + } + + @Override + public void defaultLocale(final @NotNull Locale defaultLocale) { + this.defaultLocale = requireNonNull(defaultLocale, "defaultLocale"); + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of(ExaminableProperty.of("translations", this.translations)); + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof MiniMessageTranslationRegistryImpl that)) return false; + return this.name.equals(that.name) + && this.translations.equals(that.translations) + && this.defaultLocale.equals(that.defaultLocale); + } + + @Override + public int hashCode() { + return Objects.hash(this.name, this.translations, this.defaultLocale); + } + + @Override + public String toString() { + return Internals.toString(this); + } + + public static class ArgumentTag implements TagResolver { + private static final String NAME_0 = "argument"; + private static final String NAME_1 = "arg"; + + private final List argumentComponents; + + public ArgumentTag(final @NotNull List argumentComponents) { + this.argumentComponents = Objects.requireNonNull(argumentComponents, "argumentComponents"); + } + + @Override + public @Nullable Tag resolve(final @NotNull String name, final @NotNull ArgumentQueue arguments, final @NotNull Context ctx) throws ParsingException { + if (!has(name)) { + return null; + } + + final int index = arguments.popOr("No argument number provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + + if (index < 0 || index >= argumentComponents.size()) { + throw ctx.newException("Invalid argument number", arguments); + } + + return Tag.inserting(argumentComponents.get(index)); + } + + @Override + public boolean has(final @NotNull String name) { + return name.equals(NAME_0) || name.equals(NAME_1); + } + } + + final class Translation implements Examinable { + private final String key; + private final Map formats; + + Translation(final @NotNull String key) { + this.key = requireNonNull(key, "translation key"); + this.formats = new ConcurrentHashMap<>(); + } + + void register(final @NotNull Locale locale, final @NotNull String format) { + if (this.formats.putIfAbsent(requireNonNull(locale, "locale"), requireNonNull(format, "message format")) != null) { + throw new IllegalArgumentException(String.format("Translation already exists: %s for %s", this.key, locale)); + } + } + + @Nullable String translate(final @NotNull Locale locale) { + String format = this.formats.get(requireNonNull(locale, "locale")); + if (format == null) { + format = this.formats.get(new Locale(locale.getLanguage())); // try without country + if (format == null) { + format = this.formats.get(MiniMessageTranslationRegistryImpl.this.defaultLocale); // try local default locale + } + } + return format; + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of( + ExaminableProperty.of("key", this.key), + ExaminableProperty.of("formats", this.formats) + ); + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof Translation that)) return false; + return this.key.equals(that.key) && + this.formats.equals(that.formats); + } + + @Override + public int hashCode() { + return Objects.hash(this.key, this.formats); + } + + @Override + public String toString() { + return Internals.toString(this); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslator.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslator.java new file mode 100644 index 000000000..de6febf2f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslator.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; +import net.kyori.adventure.translation.Translator; +import net.kyori.examination.Examinable; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +public interface MiniMessageTranslator extends Translator, Examinable { + static @NotNull MiniMessageTranslator translator() { + return MiniMessageTranslatorImpl.INSTANCE; + } + + static @NotNull TranslatableComponentRenderer renderer() { + return MiniMessageTranslatorImpl.INSTANCE.renderer; + } + + static @NotNull Component render(final @NotNull Component component, final @NotNull Locale locale) { + return renderer().render(component, locale); + } + + @NotNull Iterable sources(); + + boolean addSource(final @NotNull Translator source); + + boolean removeSource(final @NotNull Translator source); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java new file mode 100644 index 000000000..8f06cf4ae --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java @@ -0,0 +1,74 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; +import net.kyori.adventure.translation.Translator; +import net.kyori.adventure.util.TriState; +import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.MessageFormat; +import java.util.Collections; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; + +public class MiniMessageTranslatorImpl implements MiniMessageTranslator { + private static final Key NAME = Key.key("craftengine", "main"); + static final MiniMessageTranslatorImpl INSTANCE = new MiniMessageTranslatorImpl(); + final TranslatableComponentRenderer renderer = TranslatableComponentRenderer.usingTranslationSource(this); + private final Set sources = Collections.newSetFromMap(new ConcurrentHashMap<>()); + + @Override + public @NotNull Key name() { + return NAME; + } + + @Override + public @NotNull TriState hasAnyTranslations() { + if (!this.sources.isEmpty()) { + return TriState.TRUE; + } + return TriState.FALSE; + } + + @Override + public @Nullable MessageFormat translate(@NotNull String key, @NotNull Locale locale) { + // No need to implement this method + return null; + } + + @Override + public @Nullable Component translate(@NotNull TranslatableComponent component, @NotNull Locale locale) { + for (final Translator source : this.sources) { + final Component translation = source.translate(component, locale); + if (translation != null) return translation; + } + return null; + } + + @Override + public @NotNull Iterable sources() { + return Collections.unmodifiableSet(this.sources); + } + + @Override + public boolean addSource(final @NotNull Translator source) { + if (source == this) throw new IllegalArgumentException("MiniMessageTranslationSource"); + return this.sources.add(source); + } + + @Override + public boolean removeSource(final @NotNull Translator source) { + return this.sources.remove(source); + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of(ExaminableProperty.of("sources", this.sources)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java new file mode 100644 index 000000000..c6fae6ef4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.translation.Translator; +import net.momirealms.craftengine.core.plugin.Reloadable; +import org.jetbrains.annotations.Nullable; + +import java.util.Locale; + +public interface TranslationManager extends Reloadable { + default String miniMessageTranslation(String key) { + return miniMessageTranslation(key, null); + } + + void forceLocale(Locale locale); + + String miniMessageTranslation(String key, @Nullable Locale locale); + + default Component render(Component component) { + return render(component, null); + } + + Component render(Component component, @Nullable Locale locale); + + static @Nullable Locale parseLocale(@Nullable String locale) { + return locale == null || locale.isEmpty() ? null : Translator.parseLocale(locale); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java new file mode 100644 index 000000000..519eb96e9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -0,0 +1,189 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Pair; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class TranslationManagerImpl implements TranslationManager { + private static final Locale DEFAULT_LOCALE = Locale.ENGLISH; + private Locale forceLocale = null; + + private final Plugin plugin; + private final Set installed = ConcurrentHashMap.newKeySet(); + private MiniMessageTranslationRegistry registry; + private final Path translationsDirectory; + + public TranslationManagerImpl(Plugin plugin) { + this.plugin = plugin; + this.translationsDirectory = this.plugin.dataFolderPath().resolve("translations"); + } + + @Override + public void forceLocale(Locale locale) { + forceLocale = locale; + } + + @Override + public void reload() { + // remove any previous registry + if (this.registry != null) { + MiniMessageTranslator.translator().removeSource(this.registry); + this.installed.clear(); + } + + String supportedLocales = PluginProperties.getValue("lang"); + for (String lang : supportedLocales.split(",")) { + this.plugin.saveResource("translations/" + lang + ".yml"); + } + + this.registry = MiniMessageTranslationRegistry.create(Key.key("craftengine", "main"), AdventureHelper.miniMessage()); + this.registry.defaultLocale(DEFAULT_LOCALE); + this.loadFromFileSystem(this.translationsDirectory, false); + MiniMessageTranslator.translator().addSource(this.registry); + } + + @Override + public String miniMessageTranslation(String key, @Nullable Locale locale) { + if (forceLocale != null) { + return registry.miniMessageTranslation(key, forceLocale); + } + if (locale == null) { + locale = Locale.getDefault(); + if (locale == null) { + locale = DEFAULT_LOCALE; + } + } + return registry.miniMessageTranslation(key, locale); + } + + @Override + public Component render(Component component, @Nullable Locale locale) { + if (forceLocale != null) { + return MiniMessageTranslator.render(component, forceLocale); + } + if (locale == null) { + locale = Locale.getDefault(); + if (locale == null) { + locale = DEFAULT_LOCALE; + } + } + return MiniMessageTranslator.render(component, locale); + } + + public void loadFromFileSystem(Path directory, boolean suppressDuplicatesError) { + List translationFiles; + try (Stream stream = Files.list(directory)) { + translationFiles = stream.filter(TranslationManagerImpl::isTranslationFile).collect(Collectors.toList()); + } catch (IOException e) { + translationFiles = Collections.emptyList(); + } + + if (translationFiles.isEmpty()) { + return; + } + + Map> loaded = new HashMap<>(); + for (Path translationFile : translationFiles) { + try { + Pair> result = loadTranslationFile(translationFile); + loaded.put(result.left(), result.right()); + } catch (Exception e) { + if (!suppressDuplicatesError || !isAdventureDuplicatesException(e)) { + this.plugin.logger().warn("Error loading locale file: " + translationFile.getFileName(), e); + } + } + } + + // try registering the locale without a country code - if we don't already have a registration for that + loaded.forEach((locale, bundle) -> { + Locale localeWithoutCountry = new Locale(locale.getLanguage()); + if (!locale.equals(localeWithoutCountry) && !localeWithoutCountry.equals(DEFAULT_LOCALE) && this.installed.add(localeWithoutCountry)) { + try { + this.registry.registerAll(localeWithoutCountry, bundle); + } catch (IllegalArgumentException e) { + // ignore + } + } + }); + + Locale localLocale = Locale.getDefault(); + if (!this.installed.contains(localLocale) && forceLocale == null) { + plugin.logger().warn(localLocale.toString().toLowerCase(Locale.ENGLISH) + ".yml not exists, using " + DEFAULT_LOCALE.toString().toLowerCase(Locale.ENGLISH) + ".yml as default locale."); + } + } + + public static boolean isTranslationFile(Path path) { + return path.getFileName().toString().endsWith(".yml"); + } + + private static boolean isAdventureDuplicatesException(Exception e) { + return e instanceof IllegalArgumentException && (e.getMessage().startsWith("Invalid key") || e.getMessage().startsWith("Translation already exists")); + } + + @SuppressWarnings("unchecked") + private Pair> loadTranslationFile(Path translationFile) { + String fileName = translationFile.getFileName().toString(); + String localeString = fileName.substring(0, fileName.length() - ".yml".length()); + Locale locale = TranslationManager.parseLocale(localeString); + if (locale == null) { + throw new IllegalStateException("Unknown locale '" + localeString + "' - unable to register."); + } + + Map bundle = new HashMap<>(); + YamlDocument document = plugin.loadYamlConfig("translations" + File.separator + translationFile.getFileName(), + GeneralSettings.DEFAULT, + LoaderSettings + .builder() + .setAutoUpdate(true) + .build(), + DumperSettings.DEFAULT, + UpdaterSettings + .builder() + .setVersioning(new BasicVersioning("config-version")) + .build() + ); + try { + document.save(new File(plugin.dataFolderFile(), "translations" + File.separator + translationFile.getFileName())); + } catch (IOException e) { + throw new IllegalStateException("Could not update translation file: " + translationFile.getFileName(), e); + } + Map map = document.getStringRouteMappedValues(false); + map.remove("config-version"); + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() instanceof List list) { + List strList = (List) list; + StringJoiner stringJoiner = new StringJoiner(""); + for (String str : strList) { + stringJoiner.add(str); + } + bundle.put(entry.getKey(), stringJoiner.toString()); + } else if (entry.getValue() instanceof String str) { + bundle.put(entry.getKey(), str); + } + } + + this.registry.registerAll(locale, bundle); + this.installed.add(locale); + + return Pair.of(locale, bundle); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/JavaPluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/JavaPluginLogger.java new file mode 100644 index 000000000..207f2dcec --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/JavaPluginLogger.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JavaPluginLogger implements PluginLogger { + private final Logger logger; + + public JavaPluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String s) { + this.logger.info(s); + } + + @Override + public void warn(String s) { + this.logger.warning(s); + } + + @Override + public void warn(String s, Throwable t) { + this.logger.log(Level.WARNING, s, t); + } + + @Override + public void severe(String s) { + this.logger.severe(s); + } + + @Override + public void severe(String s, Throwable t) { + this.logger.log(Level.SEVERE, s, t); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Log4jPluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Log4jPluginLogger.java new file mode 100644 index 000000000..dec393a44 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Log4jPluginLogger.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import org.apache.logging.log4j.Logger; + +public class Log4jPluginLogger implements PluginLogger { + private final Logger logger; + + public Log4jPluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String s) { + this.logger.info(s); + } + + @Override + public void warn(String s) { + this.logger.warn(s); + } + + @Override + public void warn(String s, Throwable t) { + this.logger.warn(s, t); + } + + @Override + public void severe(String s) { + this.logger.error(s); + } + + @Override + public void severe(String s, Throwable t) { + this.logger.error(s, t); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/PluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/PluginLogger.java new file mode 100644 index 000000000..7dad02ad6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/PluginLogger.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import java.io.File; +import java.nio.file.Path; + +public interface PluginLogger { + void info(String s); + + void warn(String s); + + default void warn(File file, String s) { + warn("Error in file: " + file.getAbsolutePath() + " - " + s); + } + + default void warn(Path file, String s) { + warn("Error in file: " + file.toAbsolutePath() + " - " + s); + } + + default void warn(Path file, String s, Throwable t) { + warn("Error in file: " + file.toAbsolutePath() + " - " + s, t); + } + + void warn(String s, Throwable t); + + void severe(String s); + + void severe(String s, Throwable t); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Slf4jPluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Slf4jPluginLogger.java new file mode 100644 index 000000000..042940aca --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Slf4jPluginLogger.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import org.slf4j.Logger; + +public class Slf4jPluginLogger implements PluginLogger { + private final Logger logger; + + public Slf4jPluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String s) { + this.logger.info(s); + } + + @Override + public void warn(String s) { + this.logger.warn(s); + } + + @Override + public void warn(String s, Throwable t) { + this.logger.warn(s, t); + } + + @Override + public void severe(String s) { + this.logger.error(s); + } + + @Override + public void severe(String s, Throwable t) { + this.logger.error(s, t); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/Log4JFilter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/Log4JFilter.java new file mode 100644 index 000000000..0f067c61a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/Log4JFilter.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.plugin.logger.filter; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.message.Message; + +public interface Log4JFilter { + Filter.Result filter(LogEvent event); + + Filter.Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t); + + Filter.Result filter(Logger logger, Level level, Marker marker, String msg, Object... params); + + Filter.Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/LogFilter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/LogFilter.java new file mode 100644 index 000000000..2a8505326 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/LogFilter.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.plugin.logger.filter; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.filter.AbstractFilter; +import org.apache.logging.log4j.message.Message; + +public class LogFilter extends AbstractFilter implements Log4JFilter { + + private static Result validateMessage(Message message) { + if (message == null) { + return Result.NEUTRAL; + } + return validateMessage(message.getFormattedMessage()); + } + + private static Result validateMessage(String message) { + return message.startsWith("\"CraftEngine v") + ? Result.DENY + : Result.NEUTRAL; + } + + @Override + public Result filter(LogEvent event) { + Message candidate = null; + if (event != null) { + candidate = event.getMessage(); + } + return validateMessage(candidate); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) { + return validateMessage(msg); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) { + return validateMessage(msg); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) { + if (msg != null && level == Level.WARN) { + return validateMessage(msg.toString()); + } + return Result.NEUTRAL; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ImageTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ImageTag.java new file mode 100644 index 000000000..cf653a5d1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ImageTag.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.font.BitmapImage; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; + +public class ImageTag implements TagResolver { + public static final ImageTag INSTANCE = new ImageTag(); + + public static ImageTag instance() { + return INSTANCE; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String namespace = arguments.popOr("No argument namespace provided").toString(); + String id = arguments.popOr("No argument id provided").toString(); + Optional optional = CraftEngine.instance().fontManager().bitmapImageByImageId(Key.of(namespace, id)); + if (optional.isPresent()) { + if (arguments.hasNext()) { + int row = arguments.popOr("No argument row provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + int column = arguments.popOr("No argument column provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(row,column)))); + } else { + return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(0,0)))); + } + } else { + throw ctx.newException("Invalid image id", arguments); + } + } + + @Override + public boolean has(@NotNull String name) { + return "image".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/PlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/PlaceholderTag.java new file mode 100644 index 000000000..b77ac0e7d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/PlaceholderTag.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PlaceholderTag implements TagResolver { + private final Player player; + + public PlaceholderTag(Player player) { + this.player = player; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name) || !ConfigManager.hasPAPI()) { + return null; + } + String placeholder = arguments.popOr("No argument placeholder provided").toString(); + String parsed = CraftEngine.instance().parse(player, "%" + placeholder + "%"); + return Tag.inserting(AdventureHelper.miniMessage(parsed)); + } + + @Override + public boolean has(@NotNull String name) { + return "papi".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ConnectionState.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ConnectionState.java new file mode 100644 index 000000000..54f3de300 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ConnectionState.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.plugin.network; + +public enum ConnectionState { + HANDSHAKING, + STATUS, + LOGIN, + PLAY, + CONFIGURATION +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java new file mode 100644 index 000000000..7f5a3bb65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.plugin.network; + +import io.netty.channel.Channel; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.ApiStatus; + +public interface NetWorkUser { + boolean isOnline(); + + Channel nettyChannel(); + + Plugin plugin(); + + void sendPacket(Object packet, boolean immediately); + + /** + * This is not a stable api for developers to use + * + * @return connection state + */ + @ApiStatus.Internal + ConnectionState decoderState(); + + /** + * This is not a stable api for developers to use + * + * @return connection state + */ + @ApiStatus.Internal + ConnectionState encoderState(); + + int clientSideSectionCount(); + + Key clientSideDimension(); + + Object serverPlayer(); + + Object platformPlayer(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java new file mode 100644 index 000000000..2a8341e1f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.plugin.network; + +import io.netty.channel.Channel; +import net.momirealms.craftengine.core.entity.player.Player; + +import java.util.Collection; + +public interface NetworkManager { + void setUser(Channel channel, NetWorkUser user); + + NetWorkUser getUser(Channel channel); + + NetWorkUser removeUser(Channel channel); + + Channel getChannel(Player player); + + Collection onlineUsers(); + + void init(); + + void enable(); + + void shutdown(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java new file mode 100644 index 000000000..1198fa6ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java @@ -0,0 +1,105 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import net.momirealms.craftengine.core.plugin.Plugin; + +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.Arrays; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public abstract class AbstractJavaScheduler implements SchedulerAdapter { + private static final int PARALLELISM = 16; + + private final Plugin plugin; + + private final ScheduledThreadPoolExecutor scheduler; + private final ForkJoinPool worker; + + public AbstractJavaScheduler(Plugin plugin) { + this.plugin = plugin; + + this.scheduler = new ScheduledThreadPoolExecutor(4, r -> { + Thread thread = Executors.defaultThreadFactory().newThread(r); + thread.setName("craft-engine-scheduler"); + return thread; + }); + this.scheduler.setRemoveOnCancelPolicy(true); + this.scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); + this.worker = new ForkJoinPool(PARALLELISM, new WorkerThreadFactory(), new ExceptionHandler(), false); + } + + @Override + public Executor async() { + return this.worker; + } + + @Override + public SchedulerTask asyncLater(Runnable task, long delay, TimeUnit unit) { + ScheduledFuture future = this.scheduler.schedule(() -> this.worker.execute(task), delay, unit); + return new AsyncTask(future); + } + + @Override + public SchedulerTask asyncRepeating(Runnable task, long delay, long interval, TimeUnit unit) { + ScheduledFuture future = this.scheduler.scheduleAtFixedRate(() -> this.worker.execute(task), delay, interval, unit); + return new AsyncTask(future); + } + + @Override + public void shutdownScheduler() { + this.scheduler.shutdown(); + try { + if (!this.scheduler.awaitTermination(1, TimeUnit.MINUTES)) { + this.plugin.logger().severe("Timed out waiting for the CraftEngine scheduler to terminate"); + reportRunningTasks(thread -> thread.getName().equals("craft-engine-scheduler")); + } + } catch (InterruptedException e) { + plugin.logger().warn("Thread is interrupted", e); + } + } + + @Override + public void shutdownExecutor() { + this.worker.shutdown(); + try { + if (!this.worker.awaitTermination(1, TimeUnit.MINUTES)) { + this.plugin.logger().severe("Timed out waiting for the CraftEngine worker thread pool to terminate"); + reportRunningTasks(thread -> thread.getName().startsWith("craft-engine-worker-")); + } + } catch (InterruptedException e) { + plugin.logger().warn("Thread is interrupted", e); + } + } + + private void reportRunningTasks(Predicate predicate) { + Thread.getAllStackTraces().forEach((thread, stack) -> { + if (predicate.test(thread)) { + this.plugin.logger().warn("Thread " + thread.getName() + " is blocked, and may be the reason for the slow shutdown!\n" + + Arrays.stream(stack).map(el -> " " + el).collect(Collectors.joining("\n")) + ); + } + }); + } + + private static final class WorkerThreadFactory implements ForkJoinPool.ForkJoinWorkerThreadFactory { + private static final AtomicInteger COUNT = new AtomicInteger(0); + + @Override + public ForkJoinWorkerThread newThread(ForkJoinPool pool) { + ForkJoinWorkerThread thread = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool); + thread.setDaemon(true); + thread.setName("craft-engine-worker-" + COUNT.getAndIncrement()); + return thread; + } + } + + private final class ExceptionHandler implements UncaughtExceptionHandler { + + @Override + public void uncaughtException(Thread t, Throwable e) { + AbstractJavaScheduler.this.plugin.logger().warn("Thread " + t.getName() + " threw an uncaught exception", e); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AsyncTask.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AsyncTask.java new file mode 100644 index 000000000..93f6f0258 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AsyncTask.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import java.util.concurrent.ScheduledFuture; + +public class AsyncTask implements SchedulerTask { + private final ScheduledFuture future; + + public AsyncTask(ScheduledFuture future) { + this.future = future; + } + + @Override + public void cancel() { + future.cancel(false); + } + + @Override + public boolean cancelled() { + return future.isCancelled(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/DummyTask.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/DummyTask.java new file mode 100644 index 000000000..f12e8ba74 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/DummyTask.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +public class DummyTask implements SchedulerTask { + + @Override + public void cancel() { + } + + @Override + public boolean cancelled() { + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/RegionExecutor.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/RegionExecutor.java new file mode 100644 index 000000000..cbe7c938a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/RegionExecutor.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import java.util.concurrent.Executor; + +public interface RegionExecutor extends Executor { + + void run(Runnable runnable, W world, int x, int z); + + default void run(Runnable runnable) { + run(runnable, null, 0, 0); + } + + void runDelayed(Runnable runnable, W world, int x, int z); + + default void runDelayed(Runnable runnable) { + runDelayed(runnable, null, 0, 0); + } + + SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period); + + SchedulerTask runAsyncLater(Runnable runnable, long delay); + + SchedulerTask runLater(Runnable runnable, long delay, W world, int x, int z); + + SchedulerTask runRepeating(Runnable runnable, long delay, long period, W world, int x, int z); + + default SchedulerTask runRepeating(Runnable runnable, long delay, long period) { + return runRepeating(runnable, delay, period, null, 0, 0); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerAdapter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerAdapter.java new file mode 100644 index 000000000..fd7af51e3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerAdapter.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + +public interface SchedulerAdapter { + + Executor async(); + + RegionExecutor sync(); + + default void executeAsync(Runnable task) { + async().execute(task); + } + + default void executeSync(Runnable task, W world, int x, int z) { + sync().run(task, world, x, z); + } + + default void executeSync(Runnable task) { + sync().run(task, null, 0, 0); + } + + SchedulerTask asyncLater(Runnable task, long delay, TimeUnit unit); + + SchedulerTask asyncRepeating(Runnable task, long delay, long interval, TimeUnit unit); + + void shutdownScheduler(); + + void shutdownExecutor(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerTask.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerTask.java new file mode 100644 index 000000000..c90de4fb9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerTask.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +public interface SchedulerTask { + + void cancel(); + + boolean cancelled(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java new file mode 100644 index 000000000..01d643c65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.PropertyFactory; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.recipe.RecipeFactory; +import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; +import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; +import net.momirealms.craftengine.core.loot.provider.NumberProviderFactory; +import net.momirealms.craftengine.core.pack.model.ItemModelFactory; +import net.momirealms.craftengine.core.pack.model.condition.ConditionPropertyFactory; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchPropertyFactory; +import net.momirealms.craftengine.core.pack.model.select.SelectPropertyFactory; +import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; +import net.momirealms.craftengine.core.pack.model.tint.TintFactory; +import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public class BuiltInRegistries { + public static final Registry BLOCK = createRegistry(Registries.BLOCK); + public static final Registry OPTIMIZED_ITEM_ID = createRegistry(Registries.OPTIMIZED_ITEM_ID); + public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); + public static final Registry BLOCK_BEHAVIOR_FACTORY = createRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); + public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); + public static final Registry LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); + public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); + public static final Registry NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); + public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); + public static final Registry TEMPLATE_ARGUMENT_FACTORY = createRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); + public static final Registry ITEM_MODEL_FACTORY = createRegistry(Registries.ITEM_MODEL_FACTORY); + public static final Registry TINT_FACTORY = createRegistry(Registries.TINT_FACTORY); + public static final Registry SPECIAL_MODEL_FACTORY = createRegistry(Registries.SPECIAL_MODEL_FACTORY); + public static final Registry RANGE_DISPATCH_PROPERTY_FACTORY = createRegistry(Registries.RANGE_DISPATCH_PROPERTY_FACTORY); + public static final Registry CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY); + public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); + public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); + + private static Registry createRegistry(ResourceKey> key) { + return new MappedRegistry<>(key); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java new file mode 100644 index 000000000..06e1c25f9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java @@ -0,0 +1,214 @@ +package net.momirealms.craftengine.core.registry; + +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public interface Holder { + + T value(); + + boolean isBound(); + + boolean matchesKey(Key id); + + boolean matchesKey(ResourceKey key); + + boolean matchesPredicate(Predicate> predicate); + + boolean hasTag(ResourceKey tag); + + Stream> tags(); + + Optional> keyOptional(); + + HolderKind kind(); + + boolean serializableIn(Owner owner); + + default String registeredName() { + return this.keyOptional().map(key -> key.location().toString()).orElse("[unregistered]"); + } + + static Holder direct(T value) { + return new Direct<>(value); + } + + record Direct(T value) implements Holder { + @Override + public boolean isBound() { + return true; + } + + @Override + public boolean matchesKey(Key id) { + return false; + } + + @Override + public boolean matchesKey(ResourceKey key) { + return false; + } + + @Override + public boolean hasTag(ResourceKey tag) { + return false; + } + + @Override + public boolean matchesPredicate(Predicate> predicate) { + return false; + } + + @Override + public Optional> keyOptional() { + return Optional.empty(); + } + + @Override + public HolderKind kind() { + return HolderKind.DIRECT; + } + + @Override + public boolean serializableIn(Owner owner) { + return true; + } + + @Override + public Stream> tags() { + return Stream.of(); + } + + @Override + public String toString() { + return "Direct{" + this.value + "}"; + } + } + + enum HolderKind { + REFERENCE, + DIRECT + } + + class Reference implements Holder { + private final Owner owner; + @Nullable + private ResourceKey key; + @Nullable + private T value; + @Nullable + private Set> tags; + + public Reference(Owner owner, @Nullable ResourceKey key, @Nullable T value) { + this.owner = owner; + this.key = key; + this.value = value; + } + + public static Reference create(Owner owner, ResourceKey registryKey) { + return new Reference<>(owner, registryKey, null); + } + + public ResourceKey key() { + if (this.key == null) { + throw new IllegalStateException("Trying to access unbound value '" + this.value + "' from registry " + this.owner); + } + return this.key; + } + + @Override + public T value() { + if (this.value == null) { + throw new IllegalStateException("Trying to access unbound value '" + this.key + "' from registry " + this.owner); + } + return this.value; + } + + @Override + public boolean matchesKey(Key id) { + return this.key().location().equals(id); + } + + @Override + public boolean matchesKey(ResourceKey key) { + return this.key() == key; + } + + private Set> boundTags() { + if (this.tags == null) { + throw new IllegalStateException("Tags not bound"); + } + return this.tags; + } + + @Override + public boolean hasTag(ResourceKey tag) { + return this.boundTags().contains(tag); + } + + @Override + public boolean matchesPredicate(Predicate> predicate) { + return predicate.test(this.key()); + } + + @Override + public boolean serializableIn(Owner owner) { + return this.owner.canSerializeIn(owner); + } + + @Override + public Optional> keyOptional() { + return Optional.of(this.key()); + } + + @Override + public HolderKind kind() { + return HolderKind.REFERENCE; + } + + @Override + public boolean isBound() { + return this.key != null && this.value != null; + } + + public void bindKey(ResourceKey registryKey) { + if (this.key != null && registryKey != this.key) { + throw new IllegalStateException("Can't change holder key: existing=" + this.key + ", new=" + registryKey); + } + this.key = registryKey; + } + + public void bindValue(T value) { + this.value = value; + } + + public void bindTags(Collection> tags) { + this.tags = Collections.unmodifiableSet(new ReferenceOpenHashSet<>(tags)); + } + + @Override + public Stream> tags() { + return this.boundTags().stream(); + } + + @Override + public String toString() { + return "Reference{" + this.key + "=" + this.value + "}"; + } + } + + interface Owner { + default boolean canSerializeIn(Owner other) { + return other == this; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java new file mode 100644 index 000000000..2a20fd589 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java @@ -0,0 +1,104 @@ +package net.momirealms.craftengine.core.registry; + +import com.google.common.collect.Maps; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import javax.annotation.Nullable; +import java.util.*; + +public class MappedRegistry implements WritableRegistry { + private final ResourceKey> key; + private final Map> byId = new HashMap<>(2048); + private final Map, Holder.Reference> byResourceKey = new HashMap<>(2048); + + public MappedRegistry(ResourceKey> key) { + this.key = key; + } + + @Override + public ResourceKey> key() { + return this.key; + } + + @Override + public Holder.Reference registerForHolder(ResourceKey key) { + Objects.requireNonNull(key); + if (!key.registry().equals(this.key.location())) { + throw new IllegalStateException(key + " is not allowed to be registered in " + this.key); + } + if (this.byId.containsKey(key.location())) { + throw new IllegalStateException("Adding duplicate key '" + key + "' to registry"); + } else { + Holder.Reference reference = this.byResourceKey.computeIfAbsent(key, k -> Holder.Reference.create(this, k)); + this.byResourceKey.put(key, reference); + this.byId.put(key.location(), reference); + return reference; + } + } + + @Override + public Holder.Reference register(ResourceKey key, T value) { + Holder.Reference holder = registerForHolder(key); + holder.bindValue(value); + return holder; + } + + @Nullable + @Override + public T getValue(@Nullable ResourceKey key) { + return getValueFromNullable(this.byResourceKey.get(key)); + } + + @Override + public Optional> get(Key id) { + return Optional.ofNullable(this.byId.get(id)); + } + + @Override + public Optional> get(ResourceKey key) { + return Optional.ofNullable(this.byResourceKey.get(key)); + } + + @Nullable + @Override + public T getValue(@Nullable Key id) { + Holder.Reference reference = this.byId.get(id); + return getValueFromNullable(reference); + } + + @Nullable + private static T getValueFromNullable(@Nullable Holder.Reference entry) { + return entry != null ? entry.value() : null; + } + + @Override + public Set keySet() { + return Collections.unmodifiableSet(this.byId.keySet()); + } + + @Override + public Set> registryKeySet() { + return Collections.unmodifiableSet(this.byResourceKey.keySet()); + } + + @Override + public boolean containsKey(Key id) { + return this.byId.containsKey(id); + } + + @Override + public boolean containsKey(ResourceKey key) { + return this.byResourceKey.containsKey(key); + } + + @Override + public Set, T>> entrySet() { + return Collections.unmodifiableSet(Maps.transformValues(this.byResourceKey, Holder::value).entrySet()); + } + + @Override + public boolean isEmpty() { + return this.byResourceKey.isEmpty(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java new file mode 100644 index 000000000..bb829c583 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.PropertyFactory; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.recipe.RecipeFactory; +import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; +import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; +import net.momirealms.craftengine.core.loot.provider.NumberProviderFactory; +import net.momirealms.craftengine.core.pack.model.ItemModelFactory; +import net.momirealms.craftengine.core.pack.model.condition.ConditionPropertyFactory; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchPropertyFactory; +import net.momirealms.craftengine.core.pack.model.select.SelectPropertyFactory; +import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; +import net.momirealms.craftengine.core.pack.model.tint.TintFactory; +import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public class Registries { + public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root"); + public static final ResourceKey> BLOCK = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("block")); + public static final ResourceKey> OPTIMIZED_ITEM_ID = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("optimized_item_id")); + public static final ResourceKey> PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory")); + public static final ResourceKey> BLOCK_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_factory")); + public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); + public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); + public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); + public static final ResourceKey> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); + public static final ResourceKey> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); + public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); + public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); + public static final ResourceKey> TINT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("tint_factory")); + public static final ResourceKey> SPECIAL_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("special_model_factory")); + public static final ResourceKey> RANGE_DISPATCH_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("range_dispatch_property_factory")); + public static final ResourceKey> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); + public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); + public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java new file mode 100644 index 000000000..4540d9c19 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public interface Registry extends Holder.Owner { + + ResourceKey> key(); + + @Nullable + T getValue(@Nullable ResourceKey key); + + @Nullable + T getValue(@Nullable Key id); + + Set keySet(); + + Set, T>> entrySet(); + + Set> registryKeySet(); + + boolean containsKey(Key id); + + boolean containsKey(ResourceKey key); + + Optional> get(Key id); + + Optional> get(ResourceKey key); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java new file mode 100644 index 000000000..bd485a885 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.util.ResourceKey; + +public interface WritableRegistry extends Registry { + + Holder.Reference registerForHolder(ResourceKey key); + + Holder.Reference register(ResourceKey key, T value); + + boolean isEmpty(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java new file mode 100644 index 000000000..9cb93b0ba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -0,0 +1,268 @@ +package net.momirealms.craftengine.core.util; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.sound.Sound; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.title.Title; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +/** + * Helper class for handling Adventure components and related functionalities. + */ +public class AdventureHelper { + + private final MiniMessage miniMessage; + private final MiniMessage miniMessageStrict; + private final GsonComponentSerializer gsonComponentSerializer; + private final Cache miniMessageToJsonCache = Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(); + public static boolean legacySupport = false; + + private AdventureHelper() { + this.miniMessage = MiniMessage.builder().build(); + this.miniMessageStrict = MiniMessage.builder().strict(true).build(); + this.gsonComponentSerializer = GsonComponentSerializer.builder().build(); + } + + private static class SingletonHolder { + private static final AdventureHelper INSTANCE = new AdventureHelper(); + } + + /** + * Retrieves the singleton instance of AdventureHelper. + * + * @return the singleton instance + */ + public static AdventureHelper getInstance() { + return SingletonHolder.INSTANCE; + } + + /** + * Converts a MiniMessage string to a Component. + * + * @param text the MiniMessage string + * @return the resulting Component + */ + public static Component miniMessage(String text) { + if (legacySupport) { + return miniMessage().deserialize(legacyToMiniMessage(text)); + } else { + return miniMessage().deserialize(text); + } + } + + /** + * Retrieves the MiniMessage instance. + * + * @return the MiniMessage instance + */ + public static MiniMessage miniMessage() { + return getInstance().miniMessage; + } + + /** + * Retrieves the GsonComponentSerializer instance. + * + * @return the GsonComponentSerializer instance + */ + public static GsonComponentSerializer getGson() { + return getInstance().gsonComponentSerializer; + } + + /** + * Converts a MiniMessage string to a JSON string. + * + * @param miniMessage the MiniMessage string + * @return the JSON string representation + */ + public static String miniMessageToJson(String miniMessage) { + AdventureHelper instance = getInstance(); + return instance.miniMessageToJsonCache.get(miniMessage, (text) -> instance.gsonComponentSerializer.serialize(miniMessage(text))); + } + + /** + * Sends a title to an audience. + * + * @param audience the audience to send the title to + * @param title the title component + * @param subtitle the subtitle component + * @param fadeIn the fade-in duration in ticks + * @param stay the stay duration in ticks + * @param fadeOut the fade-out duration in ticks + */ + public static void sendTitle(Audience audience, Component title, Component subtitle, int fadeIn, int stay, int fadeOut) { + audience.showTitle(Title.title(title, subtitle, Title.Times.times(Duration.ofMillis(fadeIn * 50L), Duration.ofMillis(stay * 50L), Duration.ofMillis(fadeOut * 50L)))); + } + + /** + * Sends an action bar message to an audience. + * + * @param audience the audience to send the action bar message to + * @param actionBar the action bar component + */ + public static void sendActionBar(Audience audience, Component actionBar) { + audience.sendActionBar(actionBar); + } + + /** + * Sends a message to an audience. + * + * @param audience the audience to send the message to + * @param message the message component + */ + public static void sendMessage(Audience audience, Component message) { + audience.sendMessage(message); + } + + /** + * Plays a sound for an audience. + * + * @param audience the audience to play the sound for + * @param sound the sound to play + */ + public static void playSound(Audience audience, Sound sound) { + audience.playSound(sound); + } + + /** + * Surrounds text with a MiniMessage font tag. + * + * @param text the text to surround + * @param font the font as a {@link Key} + * @return the text surrounded by the MiniMessage font tag + */ + public static String surroundWithMiniMessageFont(String text, Key font) { + return "" + text + ""; + } + + /** + * Surrounds text with a MiniMessage font tag. + * + * @param text the text to surround + * @param font the font as a {@link String} + * @return the text surrounded by the MiniMessage font tag + */ + public static String surroundWithMiniMessageFont(String text, String font) { + return "" + text + ""; + } + + /** + * Converts a JSON string to a MiniMessage string. + * + * @param json the JSON string + * @return the MiniMessage string representation + */ + public static String jsonToMiniMessage(String json) { + return getInstance().miniMessageStrict.serialize(getInstance().gsonComponentSerializer.deserialize(json)); + } + + /** + * Converts a JSON string to a Component. + * + * @param json the JSON string + * @return the resulting Component + */ + public static Component jsonToComponent(String json) { + return getInstance().gsonComponentSerializer.deserialize(json); + } + + /** + * Converts a Component to a JSON string. + * + * @param component the Component to convert + * @return the JSON string representation + */ + public static String componentToJson(Component component) { + return getGson().serialize(component); + } + + /** + * Checks if a character is a legacy color code. + * + * @param c the character to check + * @return true if the character is a color code, false otherwise + */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public static boolean isLegacyColorCode(char c) { + return c == '§' || c == '&'; + } + + /** + * Converts a legacy color code string to a MiniMessage string. + * + * @param legacy the legacy color code string + * @return the MiniMessage string representation + */ + public static String legacyToMiniMessage(String legacy) { + StringBuilder stringBuilder = new StringBuilder(); + char[] chars = legacy.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (!isLegacyColorCode(chars[i])) { + stringBuilder.append(chars[i]); + continue; + } + if (i + 1 >= chars.length) { + stringBuilder.append(chars[i]); + continue; + } + switch (chars[i+1]) { + case '0' -> stringBuilder.append(""); + case '1' -> stringBuilder.append(""); + case '2' -> stringBuilder.append(""); + case '3' -> stringBuilder.append(""); + case '4' -> stringBuilder.append(""); + case '5' -> stringBuilder.append(""); + case '6' -> stringBuilder.append(""); + case '7' -> stringBuilder.append(""); + case '8' -> stringBuilder.append(""); + case '9' -> stringBuilder.append(""); + case 'a' -> stringBuilder.append(""); + case 'b' -> stringBuilder.append(""); + case 'c' -> stringBuilder.append(""); + case 'd' -> stringBuilder.append(""); + case 'e' -> stringBuilder.append(""); + case 'f' -> stringBuilder.append(""); + case 'r' -> stringBuilder.append(""); + case 'l' -> stringBuilder.append(""); + case 'm' -> stringBuilder.append(""); + case 'o' -> stringBuilder.append(""); + case 'n' -> stringBuilder.append(""); + case 'k' -> stringBuilder.append(""); + case 'x' -> { + if (i + 13 >= chars.length + || !isLegacyColorCode(chars[i+2]) + || !isLegacyColorCode(chars[i+4]) + || !isLegacyColorCode(chars[i+6]) + || !isLegacyColorCode(chars[i+8]) + || !isLegacyColorCode(chars[i+10]) + || !isLegacyColorCode(chars[i+12])) { + stringBuilder.append(chars[i]); + continue; + } + stringBuilder + .append("<#") + .append(chars[i+3]) + .append(chars[i+5]) + .append(chars[i+7]) + .append(chars[i+9]) + .append(chars[i+11]) + .append(chars[i+13]) + .append(">"); + i += 12; + } + default -> { + stringBuilder.append(chars[i]); + continue; + } + } + i++; + } + return stringBuilder.toString(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java new file mode 100644 index 000000000..162f6fbf5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.core.util; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ArrayUtils { + + private ArrayUtils() {} + + public static T[] subArray(T[] array, int index) { + if (index < 0) { + throw new IllegalArgumentException("Index should be a value no lower than 0"); + } + if (array.length <= index) { + @SuppressWarnings("unchecked") + T[] emptyArray = (T[]) Array.newInstance(array.getClass().getComponentType(), 0); + return emptyArray; + } + @SuppressWarnings("unchecked") + T[] subArray = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length - index); + System.arraycopy(array, index, subArray, 0, array.length - index); + return subArray; + } + + public static List splitArray(T[] array, int chunkSize) { + List result = new ArrayList<>(); + for (int i = 0; i < array.length; i += chunkSize) { + int end = Math.min(array.length, i + chunkSize); + @SuppressWarnings("unchecked") + T[] chunk = (T[]) Array.newInstance(array.getClass().getComponentType(), end - i); + System.arraycopy(array, i, chunk, 0, end - i); + result.add(chunk); + } + return result; + } + + public static T[] appendElementToArray(T[] array, T element) { + T[] newArray = Arrays.copyOf(array, array.length + 1); + newArray[array.length] = element; + return newArray; + } + + public static String[] splitValue(String value) { + return value.substring(value.indexOf('[') + 1, value.lastIndexOf(']')) + .replaceAll("\\s", "") + .split(","); + } + + public static boolean isEmpty(Object[] array) { + return array == null || array.length == 0; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java b/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java new file mode 100644 index 000000000..d9decdb44 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.util; + +public interface Cancellable { + + boolean isCancelled(); + + void setCancelled(boolean cancel); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java new file mode 100644 index 000000000..fe8c26071 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.core.util; + +import java.util.stream.IntStream; + +public class CharacterUtils { + + private CharacterUtils() {} + + public static char[] decodeUnicodeToChars(String unicodeString) { + String processedString = unicodeString.replace("\\u", ""); + int length = processedString.length() / 4; + char[] chars = new char[length]; + for (int i = 0; i < length; i++) { + int codePoint = Integer.parseInt(processedString.substring(i * 4, i * 4 + 4), 16); + if (Character.isSupplementaryCodePoint(codePoint)) { + chars[i] = Character.highSurrogate(codePoint); + chars[++i] = Character.lowSurrogate(codePoint); + } else { + chars[i] = (char) codePoint; + } + } + return chars; + } + + public static int charsToCodePoint(char[] chars) { + if (chars.length == 1) { + return chars[0]; + } else if (chars.length == 2) { + if (Character.isHighSurrogate(chars[0]) && Character.isLowSurrogate(chars[1])) { + return Character.toCodePoint(chars[0], chars[1]); + } else { + throw new IllegalArgumentException("Invalid surrogate pair: not a valid high and low surrogate combination."); + } + } else { + throw new IllegalArgumentException("The given chars array must contain either 1 or 2 characters."); + } + } + + public static int[] charsToCodePoints(char[] chars) { + return IntStream.range(0, chars.length) + .filter(i -> !Character.isLowSurrogate(chars[i])) + .map(i -> { + char c1 = chars[i]; + if (Character.isHighSurrogate(c1)) { + if (i + 1 < chars.length && Character.isLowSurrogate(chars[i + 1])) { + char c2 = chars[++i]; + return Character.toCodePoint(c1, c2); + } else { + throw new IllegalArgumentException("Illegal surrogate pair: High surrogate without matching low surrogate at index " + i); + } + } else { + return c1; + } + }).toArray(); + } + + public static String encodeCharToUnicode(char c) { + return String.format("\\u%04x", (int) c); + } + + public static String encodeCharsToUnicode(char[] chars) { + StringBuilder builder = new StringBuilder(); + for (char value : chars) { + builder.append(encodeCharToUnicode(value)); + } + return builder.toString(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java new file mode 100644 index 000000000..44d222cd9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java @@ -0,0 +1,316 @@ +package net.momirealms.craftengine.core.util; + +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.world.Vec3i; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Random; +import java.util.function.Predicate; + +public enum Direction { + DOWN(0, 1, -1, AxisDirection.NEGATIVE, Axis.Y, new Vec3i(0, -1, 0)), + UP(1, 0, -1, AxisDirection.POSITIVE, Axis.Y, new Vec3i(0, 1, 0)), + NORTH(2, 3, 2, AxisDirection.NEGATIVE, Axis.Z, new Vec3i(0, 0, -1)), + SOUTH(3, 2, 0, AxisDirection.POSITIVE, Axis.Z, new Vec3i(0, 0, 1)), + WEST(4, 5, 1, AxisDirection.NEGATIVE, Axis.X, new Vec3i(-1, 0, 0)), + EAST(5, 4, 3, AxisDirection.POSITIVE, Axis.X, new Vec3i(1, 0, 0)); + + private static final Direction[] VALUES = values(); + private static final Direction[] BY_3D_DATA = Arrays.stream(VALUES) + .sorted(Comparator.comparingInt(direction -> direction.data3d)) + .toArray(Direction[]::new); + private static final Direction[] BY_2D_DATA = Arrays.stream(VALUES) + .filter(direction -> direction.axis().isHorizontal()) + .sorted(Comparator.comparingInt(direction -> direction.data2d)) + .toArray(Direction[]::new); + + private final int data3d; + private final int oppositeIndex; + private final int data2d; + private final Axis axis; + private final AxisDirection axisDirection; + private final Vec3i vec; + private final int adjX; + private final int adjY; + private final int adjZ; + + Direction( + final int id, + final int idOpposite, + final int idHorizontal, + final AxisDirection direction, + final Axis axis, + final Vec3i vector + ) { + this.data3d = id; + this.data2d = idHorizontal; + this.oppositeIndex = idOpposite; + this.axis = axis; + this.axisDirection = direction; + this.vec = vector; + this.adjX = vector.x(); + this.adjY = vector.y(); + this.adjZ = vector.z(); + } + + public HorizontalDirection toHorizontalDirection() { + return switch (this) { + case DOWN, UP -> null; + case NORTH -> HorizontalDirection.NORTH; + case SOUTH -> HorizontalDirection.SOUTH; + case WEST -> HorizontalDirection.WEST; + case EAST -> HorizontalDirection.EAST; + }; + } + + public static Direction[] orderedByNearest(Entity entity) { + float xRotation = entity.getXRot() * (float) (Math.PI / 180.0); + float yRotation = -entity.getYRot() * (float) (Math.PI / 180.0); + float sinX = (float) Math.sin(xRotation); + float cosX = (float) Math.cos(xRotation); + float sinY = (float) Math.sin(yRotation); + float cosY = (float) Math.cos(yRotation); + boolean isFacingPositiveY = sinY > 0.0F; + boolean isFacingNegativeX = sinX < 0.0F; + boolean isFacingPositiveX = cosY > 0.0F; + float adjustedSinY = isFacingPositiveY ? sinY : -sinY; + float adjustedSinX = isFacingNegativeX ? -sinX : sinX; + float adjustedCosY = isFacingPositiveX ? cosY : -cosY; + float horizontalProjection = adjustedSinY * cosX; + float verticalProjection = adjustedCosY * cosX; + Direction horizontalDirection = isFacingPositiveY ? EAST : WEST; + Direction verticalDirection = isFacingNegativeX ? UP : DOWN; + Direction depthDirection = isFacingPositiveX ? SOUTH : NORTH; + if (adjustedSinY > adjustedCosY) { + if (adjustedSinX > horizontalProjection) { + return createDirectionArray(verticalDirection, horizontalDirection, depthDirection); + } else { + return verticalProjection > adjustedSinX + ? createDirectionArray(horizontalDirection, depthDirection, verticalDirection) + : createDirectionArray(horizontalDirection, verticalDirection, depthDirection); + } + } else if (adjustedSinX > verticalProjection) { + return createDirectionArray(verticalDirection, depthDirection, horizontalDirection); + } else { + return horizontalProjection > adjustedSinX + ? createDirectionArray(depthDirection, horizontalDirection, verticalDirection) + : createDirectionArray(depthDirection, verticalDirection, horizontalDirection); + } + } + + private static Direction[] createDirectionArray(Direction first, Direction second, Direction third) { + return new Direction[]{first, second, third, third.opposite(), second.opposite(), first.opposite()}; + } + + public static float getYaw(Direction direction) { + switch (direction) { + case NORTH -> { + return 180f; + } + case SOUTH -> { + return 0f; + } + case WEST -> { + return 90f; + } + case EAST -> { + return -90f; + } + default -> throw new IllegalArgumentException(); + } + } + + public int stepX() { + return this.adjX; + } + + public int stepY() { + return this.adjY; + } + + public int stepZ() { + return this.adjZ; + } + + public Vec3i vector() { + return vec; + } + + public Axis axis() { + return this.axis; + } + + public AxisDirection axisDirection() { + return axisDirection; + } + + public int data2d() { + return data2d; + } + + public int data3d() { + return data3d; + } + + public int oppositeIndex() { + return oppositeIndex; + } + + public Direction opposite() { + return VALUES[oppositeIndex]; + } + + public Direction clockWise() { + return switch (this) { + case NORTH -> EAST; + case SOUTH -> WEST; + case WEST -> NORTH; + case EAST -> SOUTH; + default -> throw new IllegalStateException(); + }; + } + + public Direction counterClockWise() { + return switch (this) { + case NORTH -> WEST; + case SOUTH -> EAST; + case WEST -> SOUTH; + case EAST -> NORTH; + default -> throw new IllegalStateException(); + }; + } + + public static Direction from3DDataValue(int id) { + return BY_3D_DATA[Math.abs(id % BY_3D_DATA.length)]; + } + + public static Direction from2DDataValue(int value) { + return BY_2D_DATA[Math.abs(value % BY_2D_DATA.length)]; + } + + public static Direction fromAxisAndDirection(Axis axis, AxisDirection direction) { + return switch (axis) { + case X -> direction == AxisDirection.POSITIVE ? EAST : WEST; + case Y -> direction == AxisDirection.POSITIVE ? UP : DOWN; + case Z -> direction == AxisDirection.POSITIVE ? SOUTH : NORTH; + }; + } + + public enum Axis implements Predicate { + X() { + @Override + public int choose(int x, int y, int z) { + return x; + } + + @Override + public double choose(double x, double y, double z) { + return x; + } + + @Override + public Direction getPositive() { + return Direction.EAST; + } + + @Override + public Direction getNegative() { + return Direction.WEST; + } + }, + Y() { + @Override + public int choose(int x, int y, int z) { + return y; + } + + @Override + public double choose(double x, double y, double z) { + return y; + } + + @Override + public Direction getPositive() { + return Direction.UP; + } + + @Override + public Direction getNegative() { + return Direction.DOWN; + } + }, + Z() { + @Override + public int choose(int x, int y, int z) { + return z; + } + + @Override + public double choose(double x, double y, double z) { + return z; + } + + @Override + public Direction getPositive() { + return Direction.SOUTH; + } + + @Override + public Direction getNegative() { + return Direction.NORTH; + } + }; + + public static final Axis[] VALUES = values(); + + public boolean isVertical() { + return this == Y; + } + + public boolean isHorizontal() { + return this == X || this == Z; + } + + public abstract Direction getPositive(); + + public abstract Direction getNegative(); + + public Direction[] getDirections() { + return new Direction[]{this.getPositive(), this.getNegative()}; + } + + public static Axis random(Random random) { + return values()[random.nextInt(VALUES.length)]; + } + + @Override + public boolean test(@Nullable Direction direction) { + return direction != null && direction.axis() == this; + } + + public abstract int choose(int x, int y, int z); + + public abstract double choose(double x, double y, double z); + } + + public enum AxisDirection { + POSITIVE(1), + NEGATIVE(-1); + + private final int step; + + AxisDirection(final int offset) { + this.step = offset; + } + + public int step() { + return this.step; + } + + public AxisDirection opposite() { + return this == POSITIVE ? NEGATIVE : POSITIVE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionCollector.java b/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionCollector.java new file mode 100644 index 000000000..868df2a03 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionCollector.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.Nullable; + +public class ExceptionCollector { + @Nullable + private T result; + + public void add(T throwable) { + if (this.result == null) { + this.result = throwable; + } else { + this.result.addSuppressed(throwable); + } + } + + public void throwIfPresent() throws T { + if (this.result != null) { + throw this.result; + } + } +} + diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FileUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/FileUtils.java new file mode 100644 index 000000000..39a13e48c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FileUtils.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.util; + +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; + +public class FileUtils { + + private FileUtils() {} + + public static void createDirectoriesSafe(Path path) throws IOException { + Files.createDirectories(Files.exists(path) ? path.toRealPath() : path); + } + + public static List getConfigsDeeply(Path configFolder) { + List validConfigs = new ArrayList<>(); + if (!Files.exists(configFolder)) return validConfigs; + Deque pathDeque = new ArrayDeque<>(); + pathDeque.push(configFolder); + while (!pathDeque.isEmpty()) { + Path path = pathDeque.pop(); + try (DirectoryStream stream = Files.newDirectoryStream(path)) { + for (Path subPath : stream) { + if (Files.isDirectory(subPath)) { + pathDeque.push(subPath); + } else if (Files.isRegularFile(subPath) && subPath.toString().endsWith(".yml")) { + validConfigs.add(subPath); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return validConfigs; + } + + public static List mergeFolder(Collection sourceFolders, Path targetFolder) throws IOException { + List duplicatedFile = new ArrayList<>(); + for (Path sourceFolder : sourceFolders) { + if (Files.exists(sourceFolder)) { + Files.walkFileTree(sourceFolder, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Path targetPath = targetFolder.resolve(sourceFolder.relativize(file)); + if (Files.exists(targetPath)) { + duplicatedFile.add(targetPath); + } else { + Files.createDirectories(targetPath.getParent()); + Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING); + } + return FileVisitResult.CONTINUE; + } + }); + } + } + return duplicatedFile; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FormatUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/FormatUtils.java new file mode 100644 index 000000000..6edc92052 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FormatUtils.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.util; + +public class FormatUtils { + + private FormatUtils() {} + + public static String miniMessageFont(String raw, String font) { + return "" + raw + ""; + } + + public static String mineDownFont(String raw, String font) { + return "[" + raw + "](font=" + font + ")"; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java new file mode 100644 index 000000000..7b298a6cd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java @@ -0,0 +1,1342 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.collect.Maps; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.handler.codec.DecoderException; +import io.netty.handler.codec.EncoderException; +import io.netty.util.ByteProcessor; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import java.nio.channels.GatheringByteChannel; +import java.nio.channels.ScatteringByteChannel; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.IntFunction; + +public class FriendlyByteBuf extends ByteBuf { + + private final ByteBuf source; + + public FriendlyByteBuf(ByteBuf parent) { + this.source = parent; + } + + public ByteBuf source() { + return source; + } + + public BlockPos readBlockPos(ByteBuf buf) { + return BlockPos.of(buf.readLong()); + } + + public FriendlyByteBuf writeBlockPos(BlockPos pos) { + this.writeLong(pos.asLong()); + return this; + } + + public static int getVarIntSize(int value) { + for (int shift = 1; shift < 5; ++shift) { + if ((value & -1 << shift * 7) == 0) { + return shift; + } + } + return 5; + } + + public static int getVarLongSize(long value) { + for (int shift = 1; shift < 10; ++shift) { + if ((value & -1L << shift * 7) == 0L) { + return shift; + } + } + return 10; + } + + public IntList readIntIdList() { + int listSize = this.readVarInt(); + IntArrayList idList = new IntArrayList(); + for (int i = 0; i < listSize; ++i) { + idList.add(this.readVarInt()); + } + return idList; + } + + public void writeIntIdList(IntList idList) { + this.writeVarInt(idList.size()); + idList.forEach(this::writeVarInt); + } + + public > M readMap(IntFunction mapFactory, FriendlyByteBuf.Reader keyReader, FriendlyByteBuf.Reader valueReader) { + int mapSize = this.readVarInt(); + M map = mapFactory.apply(mapSize); + for (int i = 0; i < mapSize; ++i) { + K key = keyReader.apply(this); + V value = valueReader.apply(this); + map.put(key, value); + } + return map; + } + + public Map readMap(FriendlyByteBuf.Reader keyReader, FriendlyByteBuf.Reader valueReader) { + return this.readMap(Maps::newHashMapWithExpectedSize, keyReader, valueReader); + } + + public void writeMap(Map map, FriendlyByteBuf.Writer keyWriter, FriendlyByteBuf.Writer valueWriter) { + this.writeVarInt(map.size()); + map.forEach((key, value) -> { + keyWriter.accept(this, key); + valueWriter.accept(this, value); + }); + } + + public void readWithCount(Consumer consumer) { + int count = this.readVarInt(); + for (int i = 0; i < count; ++i) { + consumer.accept(this); + } + } + + public > void writeEnumSet(EnumSet enumSet, Class enumType) { + E[] enumConstants = enumType.getEnumConstants(); + BitSet bitSet = new BitSet(enumConstants.length); + for (int i = 0; i < enumConstants.length; ++i) { + bitSet.set(i, enumSet.contains(enumConstants[i])); + } + this.writeFixedBitSet(bitSet, enumConstants.length); + } + + public > EnumSet readEnumSet(Class enumType) { + E[] enumConstants = enumType.getEnumConstants(); + BitSet bitSet = this.readFixedBitSet(enumConstants.length); + EnumSet enumSet = EnumSet.noneOf(enumType); + for (int i = 0; i < enumConstants.length; ++i) { + if (bitSet.get(i)) { + enumSet.add(enumConstants[i]); + } + } + return enumSet; + } + + public void writeOptional(Optional value, FriendlyByteBuf.Writer writer) { + if (value.isPresent()) { + this.writeBoolean(true); + writer.accept(this, value.get()); + } else { + this.writeBoolean(false); + } + } + + public Optional readOptional(FriendlyByteBuf.Reader reader) { + return this.readBoolean() ? Optional.of(reader.apply(this)) : Optional.empty(); + } + + @Nullable + public T readNullable(FriendlyByteBuf.Reader reader) { + return this.readBoolean() ? reader.apply(this) : null; + } + + public void writeNullable(@Nullable T value, FriendlyByteBuf.Writer writer) { + if (value != null) { + this.writeBoolean(true); + writer.accept(this, value); + } else { + this.writeBoolean(false); + } + } + + public byte[] readByteArray() { + return this.readByteArray(this.readableBytes()); + } + + public FriendlyByteBuf writeByteArray(byte[] array) { + this.writeVarInt(array.length); + this.writeBytes(array); + return this; + } + + public byte[] readByteArray(int maxSize) { + int arraySize = this.readVarInt(); + if (arraySize > maxSize) { + throw new DecoderException("ByteArray with size " + arraySize + " is bigger than allowed " + maxSize); + } else { + byte[] byteArray = new byte[arraySize]; + this.readBytes(byteArray); + return byteArray; + } + } + + public FriendlyByteBuf writeVarIntArray(int[] array) { + this.writeVarInt(array.length); + for (int value : array) { + this.writeVarInt(value); + } + return this; + } + + public int[] readVarIntArray() { + return this.readVarIntArray(this.readableBytes()); + } + + public int[] readVarIntArray(int maxSize) { + int arraySize = this.readVarInt(); + if (arraySize > maxSize) { + throw new DecoderException("VarIntArray with size " + arraySize + " is bigger than allowed " + maxSize); + } else { + int[] array = new int[arraySize]; + for (int i = 0; i < array.length; ++i) { + array[i] = this.readVarInt(); + } + return array; + } + } + + public FriendlyByteBuf writeLongArray(long[] array) { + this.writeVarInt(array.length); + for (long value : array) { + this.writeLong(value); + } + return this; + } + + public long[] readLongArray() { + return this.readLongArray(null); + } + + public long[] readLongArray(long @Nullable [] toArray) { + return this.readLongArray(toArray, this.readableBytes() / 8); + } + + public long[] readLongArray(long @Nullable [] toArray, int maxSize) { + int arraySize = this.readVarInt(); + if (toArray == null || toArray.length != arraySize) { + if (arraySize > maxSize) { + throw new DecoderException("LongArray with size " + arraySize + " is bigger than allowed " + maxSize); + } + toArray = new long[arraySize]; + } + for (int i = 0; i < toArray.length; ++i) { + toArray[i] = this.readLong(); + } + return toArray; + } + + public byte[] extractByteBufContents() { + int size = this.writerIndex(); + byte[] byteArray = new byte[size]; + this.getBytes(0, byteArray); + return byteArray; + } + + public int readVarInt() { + int value = 0; + int shift = 0; + byte byteValue; + do { + byteValue = this.readByte(); + value |= (byteValue & 127) << shift++ * 7; + if (shift > 5) { + throw new RuntimeException("VarInt too big"); + } + } while ((byteValue & 128) == 128); + return value; + } + + public long readVarLong() { + long value = 0L; + int shift = 0; + byte byteValue; + do { + byteValue = this.readByte(); + value |= (long) (byteValue & 127) << shift++ * 7; + if (shift > 10) { + throw new RuntimeException("VarLong too big"); + } + } while ((byteValue & 128) == 128); + return value; + } + + public FriendlyByteBuf writeUUID(UUID uuid) { + this.writeLong(uuid.getMostSignificantBits()); + this.writeLong(uuid.getLeastSignificantBits()); + return this; + } + + public UUID readUUID() { + return new UUID(this.readLong(), this.readLong()); + } + + public FriendlyByteBuf writeVarInt(int value) { + while ((value & -128) != 0) { + this.writeByte((value & 127) | 128); + value >>>= 7; + } + this.writeByte(value & 127); + return this; + } + + public FriendlyByteBuf writeVarLong(long value) { + while ((value & -128L) != 0L) { + this.writeByte((int) (value & 127L) | 128); + value >>>= 7; + } + this.writeByte((int) (value & 127L)); + return this; + } + + public FriendlyByteBuf writeNbt(@Nullable CompoundTag compound) { + if (compound == null) { + this.writeByte(0); + } else { + try { + NBT.writeCompound(compound, new ByteBufOutputStream(this)); + } catch (IOException e) { + throw new EncoderException("Failed to write NBT compound: " + e.getMessage(), e); + } + } + return this; + } + + @Nullable + public CompoundTag readNbt() { + int initialIndex = this.readerIndex(); + byte marker = this.readByte(); + if (marker == 0) { + return null; + } else { + this.readerIndex(initialIndex); + try { + return NBT.readCompound(new ByteBufInputStream(this)); + } catch (IOException e) { + throw new EncoderException("Failed to read NBT compound: " + e.getMessage(), e); + } + } + } + + public String readUtf() { + return this.readUtf(32767); + } + + public String readUtf(int maxLength) { + int maxEncodedLength = getMaxEncodedUtfLength(maxLength); + int length = this.readVarInt(); + if (length > maxEncodedLength) { + throw new DecoderException("Encoded string length exceeds maximum allowed: " + length + " > " + maxEncodedLength); + } + if (length < 0) { + throw new DecoderException("Encoded string length is negative: " + length); + } + String result = this.toString(this.readerIndex(), length, StandardCharsets.UTF_8); + this.readerIndex(this.readerIndex() + length); + if (result.length() > maxLength) { + throw new DecoderException("Decoded string length exceeds maximum allowed: " + result.length() + " > " + maxLength); + } + return result; + } + + public FriendlyByteBuf writeUtf(String string) { + return this.writeUtf(string, 32767); + } + + public FriendlyByteBuf writeUtf(String string, int maxLength) { + if (string.length() > maxLength) { + throw new EncoderException("String too large (was " + string.length() + " characters, max " + maxLength + ")"); + } + byte[] bytes = string.getBytes(StandardCharsets.UTF_8); + int maxEncodedLength = getMaxEncodedUtfLength(maxLength); + if (bytes.length > maxEncodedLength) { + throw new EncoderException("Encoded string too large (was " + bytes.length + " bytes, max " + maxEncodedLength + ")"); + } + this.writeVarInt(bytes.length); + this.writeBytes(bytes); + return this; + } + + private static int getMaxEncodedUtfLength(int decodedLength) { + return decodedLength * 3; + } + + public Key readKey() { + return Key.of(this.readUtf(32767)); + } + + public FriendlyByteBuf writeKey(Key id) { + this.writeUtf(id.toString()); + return this; + } + + public BitSet readBitSet() { + return BitSet.valueOf(this.readLongArray()); + } + + public void writeBitSet(BitSet bitSet) { + this.writeLongArray(bitSet.toLongArray()); + } + + public BitSet readFixedBitSet(int size) { + byte[] byteArray = new byte[MCUtils.positiveCeilDiv(size, 8)]; + this.readBytes(byteArray); + return BitSet.valueOf(byteArray); + } + + public void writeFixedBitSet(BitSet bitSet, int size) { + if (bitSet.length() > size) { + throw new EncoderException("BitSet length exceeds expected size (" + bitSet.length() + " > " + size + ")"); + } + byte[] byteArray = bitSet.toByteArray(); + this.writeBytes(Arrays.copyOf(byteArray, MCUtils.positiveCeilDiv(size, 8))); + } + + @FunctionalInterface + public interface Writer extends BiConsumer { + + default Writer> asOptional() { + return (buf, optional) -> buf.writeOptional(optional, this); + } + } + + @FunctionalInterface + public interface Reader extends Function { + + default Reader> asOptional() { + return buf -> buf.readOptional(this); + } + } + + @Override + public int capacity() { + return this.source.capacity(); + } + + @Override + public ByteBuf capacity(int i) { + return this.source.capacity(i); + } + + @Override + public int maxCapacity() { + return this.source.maxCapacity(); + } + + @Override + public ByteBufAllocator alloc() { + return this.source.alloc(); + } + + @Override + @SuppressWarnings("deprecation") + public ByteOrder order() { + return this.source.order(); + } + + @Override + @SuppressWarnings("deprecation") + public ByteBuf order(ByteOrder byteorder) { + return this.source.order(byteorder); + } + + @Override + public ByteBuf unwrap() { + return this.source.unwrap(); + } + + @Override + public boolean isDirect() { + return this.source.isDirect(); + } + + @Override + public boolean isReadOnly() { + return this.source.isReadOnly(); + } + + @Override + public ByteBuf asReadOnly() { + return this.source.asReadOnly(); + } + + @Override + public int readerIndex() { + return this.source.readerIndex(); + } + + @Override + public ByteBuf readerIndex(int i) { + return this.source.readerIndex(i); + } + + @Override + public int writerIndex() { + return this.source.writerIndex(); + } + + @Override + public ByteBuf writerIndex(int i) { + return this.source.writerIndex(i); + } + + @Override + public ByteBuf setIndex(int i, int j) { + return this.source.setIndex(i, j); + } + + @Override + public int readableBytes() { + return this.source.readableBytes(); + } + + @Override + public int writableBytes() { + return this.source.writableBytes(); + } + + @Override + public int maxWritableBytes() { + return this.source.maxWritableBytes(); + } + + @Override + public boolean isReadable() { + return this.source.isReadable(); + } + + @Override + public boolean isReadable(int i) { + return this.source.isReadable(i); + } + + @Override + public boolean isWritable() { + return this.source.isWritable(); + } + + @Override + public boolean isWritable(int i) { + return this.source.isWritable(i); + } + + @Override + public ByteBuf clear() { + return this.source.clear(); + } + + @Override + public ByteBuf markReaderIndex() { + return this.source.markReaderIndex(); + } + + @Override + public ByteBuf resetReaderIndex() { + return this.source.resetReaderIndex(); + } + + @Override + public ByteBuf markWriterIndex() { + return this.source.markWriterIndex(); + } + + @Override + public ByteBuf resetWriterIndex() { + return this.source.resetWriterIndex(); + } + + @Override + public ByteBuf discardReadBytes() { + return this.source.discardReadBytes(); + } + + @Override + public ByteBuf discardSomeReadBytes() { + return this.source.discardSomeReadBytes(); + } + + @Override + public ByteBuf ensureWritable(int i) { + return this.source.ensureWritable(i); + } + + @Override + public int ensureWritable(int i, boolean flag) { + return this.source.ensureWritable(i, flag); + } + + @Override + public boolean getBoolean(int i) { + return this.source.getBoolean(i); + } + + @Override + public byte getByte(int i) { + return this.source.getByte(i); + } + + @Override + public short getUnsignedByte(int i) { + return this.source.getUnsignedByte(i); + } + + @Override + public short getShort(int i) { + return this.source.getShort(i); + } + + @Override + public short getShortLE(int i) { + return this.source.getShortLE(i); + } + + @Override + public int getUnsignedShort(int i) { + return this.source.getUnsignedShort(i); + } + + @Override + public int getUnsignedShortLE(int i) { + return this.source.getUnsignedShortLE(i); + } + + @Override + public int getMedium(int i) { + return this.source.getMedium(i); + } + + @Override + public int getMediumLE(int i) { + return this.source.getMediumLE(i); + } + + @Override + public int getUnsignedMedium(int i) { + return this.source.getUnsignedMedium(i); + } + + @Override + public int getUnsignedMediumLE(int i) { + return this.source.getUnsignedMediumLE(i); + } + + @Override + public int getInt(int i) { + return this.source.getInt(i); + } + + @Override + public int getIntLE(int i) { + return this.source.getIntLE(i); + } + + @Override + public long getUnsignedInt(int i) { + return this.source.getUnsignedInt(i); + } + + @Override + public long getUnsignedIntLE(int i) { + return this.source.getUnsignedIntLE(i); + } + + @Override + public long getLong(int i) { + return this.source.getLong(i); + } + + @Override + public long getLongLE(int i) { + return this.source.getLongLE(i); + } + + @Override + public char getChar(int i) { + return this.source.getChar(i); + } + + @Override + public float getFloat(int i) { + return this.source.getFloat(i); + } + + @Override + public double getDouble(int i) { + return this.source.getDouble(i); + } + + @Override + public ByteBuf getBytes(int i, ByteBuf bytebuf) { + return this.source.getBytes(i, bytebuf); + } + + @Override + public ByteBuf getBytes(int i, ByteBuf bytebuf, int j) { + return this.source.getBytes(i, bytebuf, j); + } + + @Override + public ByteBuf getBytes(int i, ByteBuf bytebuf, int j, int k) { + return this.source.getBytes(i, bytebuf, j, k); + } + + @Override + public ByteBuf getBytes(int i, byte[] bytes) { + return this.source.getBytes(i, bytes); + } + + @Override + public ByteBuf getBytes(int i, byte[] bytes, int j, int k) { + return this.source.getBytes(i, bytes, j, k); + } + + @Override + public ByteBuf getBytes(int i, ByteBuffer bytebuffer) { + return this.source.getBytes(i, bytebuffer); + } + + @Override + public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException { + return this.source.getBytes(i, outputstream, j); + } + + @Override + public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException { + return this.source.getBytes(i, gatheringbytechannel, j); + } + + @Override + public int getBytes(int i, FileChannel filechannel, long j, int k) throws IOException { + return this.source.getBytes(i, filechannel, j, k); + } + + @Override + public CharSequence getCharSequence(int i, int j, Charset charset) { + return this.source.getCharSequence(i, j, charset); + } + + @Override + public ByteBuf setBoolean(int i, boolean flag) { + return this.source.setBoolean(i, flag); + } + + @Override + public ByteBuf setByte(int i, int j) { + return this.source.setByte(i, j); + } + + @Override + public ByteBuf setShort(int i, int j) { + return this.source.setShort(i, j); + } + + @Override + public ByteBuf setShortLE(int i, int j) { + return this.source.setShortLE(i, j); + } + + @Override + public ByteBuf setMedium(int i, int j) { + return this.source.setMedium(i, j); + } + + @Override + public ByteBuf setMediumLE(int i, int j) { + return this.source.setMediumLE(i, j); + } + + @Override + public ByteBuf setInt(int i, int j) { + return this.source.setInt(i, j); + } + + @Override + public ByteBuf setIntLE(int i, int j) { + return this.source.setIntLE(i, j); + } + + @Override + public ByteBuf setLong(int i, long j) { + return this.source.setLong(i, j); + } + + @Override + public ByteBuf setLongLE(int i, long j) { + return this.source.setLongLE(i, j); + } + + @Override + public ByteBuf setChar(int i, int j) { + return this.source.setChar(i, j); + } + + @Override + public ByteBuf setFloat(int i, float f) { + return this.source.setFloat(i, f); + } + + @Override + public ByteBuf setDouble(int i, double d0) { + return this.source.setDouble(i, d0); + } + + @Override + public ByteBuf setBytes(int i, ByteBuf bytebuf) { + return this.source.setBytes(i, bytebuf); + } + + @Override + public ByteBuf setBytes(int i, ByteBuf bytebuf, int j) { + return this.source.setBytes(i, bytebuf, j); + } + + @Override + public ByteBuf setBytes(int i, ByteBuf bytebuf, int j, int k) { + return this.source.setBytes(i, bytebuf, j, k); + } + + @Override + public ByteBuf setBytes(int i, byte[] bytes) { + return this.source.setBytes(i, bytes); + } + + @Override + public ByteBuf setBytes(int i, byte[] bytes, int j, int k) { + return this.source.setBytes(i, bytes, j, k); + } + + @Override + public ByteBuf setBytes(int i, ByteBuffer bytebuffer) { + return this.source.setBytes(i, bytebuffer); + } + + @Override + public int setBytes(int i, InputStream inputstream, int j) throws IOException { + return this.source.setBytes(i, inputstream, j); + } + + @Override + public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException { + return this.source.setBytes(i, scatteringbytechannel, j); + } + + @Override + public int setBytes(int i, FileChannel filechannel, long j, int k) throws IOException { + return this.source.setBytes(i, filechannel, j, k); + } + + @Override + public ByteBuf setZero(int i, int j) { + return this.source.setZero(i, j); + } + + @Override + public int setCharSequence(int i, CharSequence charsequence, Charset charset) { + return this.source.setCharSequence(i, charsequence, charset); + } + + @Override + public boolean readBoolean() { + return this.source.readBoolean(); + } + + @Override + public byte readByte() { + return this.source.readByte(); + } + + @Override + public short readUnsignedByte() { + return this.source.readUnsignedByte(); + } + + @Override + public short readShort() { + return this.source.readShort(); + } + + @Override + public short readShortLE() { + return this.source.readShortLE(); + } + + @Override + public int readUnsignedShort() { + return this.source.readUnsignedShort(); + } + + @Override + public int readUnsignedShortLE() { + return this.source.readUnsignedShortLE(); + } + + @Override + public int readMedium() { + return this.source.readMedium(); + } + + @Override + public int readMediumLE() { + return this.source.readMediumLE(); + } + + @Override + public int readUnsignedMedium() { + return this.source.readUnsignedMedium(); + } + + @Override + public int readUnsignedMediumLE() { + return this.source.readUnsignedMediumLE(); + } + + @Override + public int readInt() { + return this.source.readInt(); + } + + @Override + public int readIntLE() { + return this.source.readIntLE(); + } + + @Override + public long readUnsignedInt() { + return this.source.readUnsignedInt(); + } + + @Override + public long readUnsignedIntLE() { + return this.source.readUnsignedIntLE(); + } + + @Override + public long readLong() { + return this.source.readLong(); + } + + @Override + public long readLongLE() { + return this.source.readLongLE(); + } + + @Override + public char readChar() { + return this.source.readChar(); + } + + @Override + public float readFloat() { + return this.source.readFloat(); + } + + @Override + public double readDouble() { + return this.source.readDouble(); + } + + @Override + public ByteBuf readBytes(int i) { + return this.source.readBytes(i); + } + + @Override + public ByteBuf readSlice(int i) { + return this.source.readSlice(i); + } + + @Override + public ByteBuf readRetainedSlice(int i) { + return this.source.readRetainedSlice(i); + } + + @Override + public ByteBuf readBytes(ByteBuf bytebuf) { + return this.source.readBytes(bytebuf); + } + + @Override + public ByteBuf readBytes(ByteBuf bytebuf, int i) { + return this.source.readBytes(bytebuf, i); + } + + @Override + public ByteBuf readBytes(ByteBuf bytebuf, int i, int j) { + return this.source.readBytes(bytebuf, i, j); + } + + @Override + public ByteBuf readBytes(byte[] bytes) { + return this.source.readBytes(bytes); + } + + @Override + public ByteBuf readBytes(byte[] bytes, int i, int j) { + return this.source.readBytes(bytes, i, j); + } + + @Override + public ByteBuf readBytes(ByteBuffer bytebuffer) { + return this.source.readBytes(bytebuffer); + } + + @Override + public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException { + return this.source.readBytes(outputstream, i); + } + + @Override + public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException { + return this.source.readBytes(gatheringbytechannel, i); + } + + @Override + public CharSequence readCharSequence(int i, Charset charset) { + return this.source.readCharSequence(i, charset); + } + + @Override + public int readBytes(FileChannel filechannel, long i, int j) throws IOException { + return this.source.readBytes(filechannel, i, j); + } + + @Override + public ByteBuf skipBytes(int i) { + return this.source.skipBytes(i); + } + + @Override + public ByteBuf writeBoolean(boolean flag) { + return this.source.writeBoolean(flag); + } + + @Override + public ByteBuf writeByte(int i) { + return this.source.writeByte(i); + } + + @Override + public ByteBuf writeShort(int i) { + return this.source.writeShort(i); + } + + @Override + public ByteBuf writeShortLE(int i) { + return this.source.writeShortLE(i); + } + + @Override + public ByteBuf writeMedium(int i) { + return this.source.writeMedium(i); + } + + @Override + public ByteBuf writeMediumLE(int i) { + return this.source.writeMediumLE(i); + } + + @Override + public ByteBuf writeInt(int i) { + return this.source.writeInt(i); + } + + @Override + public ByteBuf writeIntLE(int i) { + return this.source.writeIntLE(i); + } + + @Override + public ByteBuf writeLong(long i) { + return this.source.writeLong(i); + } + + @Override + public ByteBuf writeLongLE(long i) { + return this.source.writeLongLE(i); + } + + @Override + public ByteBuf writeChar(int i) { + return this.source.writeChar(i); + } + + @Override + public ByteBuf writeFloat(float f) { + return this.source.writeFloat(f); + } + + @Override + public ByteBuf writeDouble(double d0) { + return this.source.writeDouble(d0); + } + + @Override + public ByteBuf writeBytes(ByteBuf bytebuf) { + return this.source.writeBytes(bytebuf); + } + + @Override + public ByteBuf writeBytes(ByteBuf bytebuf, int i) { + return this.source.writeBytes(bytebuf, i); + } + + @Override + public ByteBuf writeBytes(ByteBuf bytebuf, int i, int j) { + return this.source.writeBytes(bytebuf, i, j); + } + + @Override + public ByteBuf writeBytes(byte[] bytes) { + return this.source.writeBytes(bytes); + } + + @Override + public ByteBuf writeBytes(byte[] bytes, int i, int j) { + return this.source.writeBytes(bytes, i, j); + } + + @Override + public ByteBuf writeBytes(ByteBuffer bytebuffer) { + return this.source.writeBytes(bytebuffer); + } + + @Override + public int writeBytes(InputStream inputstream, int i) throws IOException { + return this.source.writeBytes(inputstream, i); + } + + @Override + public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException { + return this.source.writeBytes(scatteringbytechannel, i); + } + + @Override + public int writeBytes(FileChannel filechannel, long i, int j) throws IOException { + return this.source.writeBytes(filechannel, i, j); + } + + @Override + public ByteBuf writeZero(int i) { + return this.source.writeZero(i); + } + + @Override + public int writeCharSequence(CharSequence charsequence, Charset charset) { + return this.source.writeCharSequence(charsequence, charset); + } + + @Override + public int indexOf(int i, int j, byte b) { + return this.source.indexOf(i, j, b); + } + + @Override + public int bytesBefore(byte b) { + return this.source.bytesBefore(b); + } + + @Override + public int bytesBefore(int i, byte b) { + return this.source.bytesBefore(i, b); + } + + @Override + public int bytesBefore(int i, int j, byte b) { + return this.source.bytesBefore(i, j, b); + } + + @Override + public int forEachByte(ByteProcessor byteprocessor) { + return this.source.forEachByte(byteprocessor); + } + + @Override + public int forEachByte(int i, int j, ByteProcessor byteprocessor) { + return this.source.forEachByte(i, j, byteprocessor); + } + + @Override + public int forEachByteDesc(ByteProcessor byteprocessor) { + return this.source.forEachByteDesc(byteprocessor); + } + + @Override + public int forEachByteDesc(int i, int j, ByteProcessor byteprocessor) { + return this.source.forEachByteDesc(i, j, byteprocessor); + } + + @Override + public ByteBuf copy() { + return this.source.copy(); + } + + @Override + public ByteBuf copy(int i, int j) { + return this.source.copy(i, j); + } + + @Override + public ByteBuf slice() { + return this.source.slice(); + } + + @Override + public ByteBuf retainedSlice() { + return this.source.retainedSlice(); + } + + @Override + public ByteBuf slice(int i, int j) { + return this.source.slice(i, j); + } + + @Override + public ByteBuf retainedSlice(int i, int j) { + return this.source.retainedSlice(i, j); + } + + @Override + public ByteBuf duplicate() { + return this.source.duplicate(); + } + + @Override + public ByteBuf retainedDuplicate() { + return this.source.retainedDuplicate(); + } + + @Override + public int nioBufferCount() { + return this.source.nioBufferCount(); + } + + @Override + public ByteBuffer nioBuffer() { + return this.source.nioBuffer(); + } + + @Override + public ByteBuffer nioBuffer(int i, int j) { + return this.source.nioBuffer(i, j); + } + + @Override + public ByteBuffer internalNioBuffer(int i, int j) { + return this.source.internalNioBuffer(i, j); + } + + @Override + public ByteBuffer[] nioBuffers() { + return this.source.nioBuffers(); + } + + @Override + public ByteBuffer[] nioBuffers(int i, int j) { + return this.source.nioBuffers(i, j); + } + + @Override + public boolean hasArray() { + return this.source.hasArray(); + } + + @Override + public byte[] array() { + return this.source.array(); + } + + @Override + public int arrayOffset() { + return this.source.arrayOffset(); + } + + @Override + public boolean hasMemoryAddress() { + return this.source.hasMemoryAddress(); + } + + @Override + public long memoryAddress() { + return this.source.memoryAddress(); + } + + @Override + public String toString(Charset charset) { + return this.source.toString(charset); + } + + @Override + public @NotNull String toString(int i, int j, Charset charset) { + return this.source.toString(i, j, charset); + } + + @Override + public int hashCode() { + return this.source.hashCode(); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (!(object instanceof FriendlyByteBuf friendlyByteBuf)) return false; + return this.source.equals(friendlyByteBuf.source); + } + + @Override + public int compareTo(ByteBuf bytebuf) { + return this.source.compareTo(bytebuf); + } + + @Override + public String toString() { + return this.source.toString(); + } + + @Override + public ByteBuf retain(int i) { + return this.source.retain(i); + } + + @Override + public ByteBuf retain() { + return this.source.retain(); + } + + @Override + public ByteBuf touch() { + return this.source.touch(); + } + + @Override + public ByteBuf touch(Object object) { + return this.source.touch(object); + } + + @Override + public int refCnt() { + return this.source.refCnt(); + } + + @Override + public boolean release() { + return this.source.release(); + } + + @Override + public boolean release(int i) { + return this.source.release(i); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java new file mode 100644 index 000000000..6c6f51690 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.util; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class GsonHelper { + + private final Gson gson; + + public GsonHelper() { + this.gson = new GsonBuilder() + .disableHtmlEscaping() + .create(); + } + + public Gson getGson() { + return gson; + } + + public static Gson get() { + return SingletonHolder.INSTANCE.getGson(); + } + + private static class SingletonHolder { + private static final GsonHelper INSTANCE = new GsonHelper(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/HorizontalDirection.java b/core/src/main/java/net/momirealms/craftengine/core/util/HorizontalDirection.java new file mode 100644 index 000000000..2231c725d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/HorizontalDirection.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.util; + +public enum HorizontalDirection { + NORTH, + SOUTH, + WEST, + EAST; + + public Direction toDirection() { + return switch (this) { + case NORTH -> Direction.NORTH; + case SOUTH -> Direction.SOUTH; + case WEST -> Direction.WEST; + case EAST -> Direction.EAST; + }; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/IdList.java b/core/src/main/java/net/momirealms/craftengine/core/util/IdList.java new file mode 100644 index 000000000..122b80eb9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/IdList.java @@ -0,0 +1,66 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.collect.Iterators; +import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import org.jetbrains.annotations.Nullable; + +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +public class IdList implements IndexedIterable { + private int nextId; + private final Reference2IntMap idMap; + private final List list; + + public IdList() { + this(512); + } + + public IdList(int initialSize) { + this.list = Lists.newArrayListWithExpectedSize(initialSize); + this.idMap = new Reference2IntOpenHashMap<>(initialSize); + this.idMap.defaultReturnValue(-1); + } + + public void set(T value, int id) { + this.idMap.put(value, id); + + while(this.list.size() <= id) { + this.list.add(null); + } + + this.list.set(id, value); + if (this.nextId <= id) { + this.nextId = id + 1; + } + + } + + public void add(T value) { + this.set(value, this.nextId); + } + + public int getRawId(T value) { + return this.idMap.getInt(value); + } + + @Nullable + public final T get(int index) { + return index >= 0 && index < this.list.size() ? this.list.get(index) : null; + } + + public Iterator iterator() { + return Iterators.filter(this.list.iterator(), Objects::nonNull); + } + + public boolean containsKey(int index) { + return this.get(index) != null; + } + + public int size() { + return this.idMap.size(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/IndexedIterable.java b/core/src/main/java/net/momirealms/craftengine/core/util/IndexedIterable.java new file mode 100644 index 000000000..40d9b2953 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/IndexedIterable.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.Nullable; + +public interface IndexedIterable extends Iterable { + + int ABSENT_RAW_ID = -1; + + int getRawId(T value); + + @Nullable + T get(int index); + + default T getOrThrow(int index) { + T object = this.get(index); + if (object == null) { + throw new IllegalArgumentException("No value with id " + index); + } else { + return object; + } + } + + default int getRawIdOrThrow(T value) { + int i = this.getRawId(value); + if (i == ABSENT_RAW_ID) { + throw new IllegalArgumentException("Can't find id for '" + value + "' in map " + this); + } else { + return i; + } + } + + int size(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Instrument.java b/core/src/main/java/net/momirealms/craftengine/core/util/Instrument.java new file mode 100644 index 000000000..7c1f60dad --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Instrument.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.util; + +public enum Instrument { + HARP("harp"), + BASEDRUM("basedrum"), + SNARE("snare"), + HAT("hat"), + BASS("bass"), + FLUTE("flute"), + BELL("bell"), + GUITAR("guitar"), + CHIME("chime"), + XYLOPHONE("xylophone"), + IRON_XYLOPHONE("iron_xylophone"), + COW_BELL("cow_bell"), + DIDGERIDOO("didgeridoo"), + BIT("bit"), + BANJO("banjo"), + PLING("pling"), + ZOMBIE("zombie"), + SKELETON("skeleton"), + CREEPER("creeper"), + DRAGON("dragon"), + WITHER_SKELETON("wither_skeleton"), + PIGLIN("piglin"), + CUSTOM_HEAD("custom_head"); + + private final String id; + + Instrument(final String id) { + this.id = id; + } + + public String id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Int2ObjectBiMap.java b/core/src/main/java/net/momirealms/craftengine/core/util/Int2ObjectBiMap.java new file mode 100644 index 000000000..297d49600 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Int2ObjectBiMap.java @@ -0,0 +1,188 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.base.Predicates; +import com.google.common.collect.Iterators; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.function.Function; + +public class Int2ObjectBiMap implements IndexedIterable { + private static final Object EMPTY = null; + private static final float LOAD_FACTOR = 0.8F; + private K[] values; + private int[] ids; + private K[] idToValues; + private int nextId; + private int size; + + @SuppressWarnings("unchecked") + private Int2ObjectBiMap(int size) { + this.values = (K[]) new Object[size]; + this.ids = new int[size]; + this.idToValues = (K[]) new Object[size]; + } + + private Int2ObjectBiMap(K[] values, int[] ids, K[] idToValues, int nextId, int size) { + this.values = values; + this.ids = ids; + this.idToValues = idToValues; + this.nextId = nextId; + this.size = size; + } + + public void remapValues(Function function) { + for (int i = 0; i < values.length; i++) { + if (values[i] == null) break; + values[i] = function.apply(values[i]); + } + for (int i = 0; i < idToValues.length; i++) { + if (idToValues[i] == null) break; + idToValues[i] = function.apply(idToValues[i]); + } + } + + public static Int2ObjectBiMap create(int expectedSize) { + return new Int2ObjectBiMap<>((int) ((float) expectedSize / LOAD_FACTOR)); + } + + public int getRawId(@Nullable K value) { + return this.getIdFromIndex(this.findIndex(value, this.getIdealIndex(value))); + } + + @Nullable + public K get(int index) { + return index >= 0 && index < this.idToValues.length ? this.idToValues[index] : null; + } + + private int getIdFromIndex(int index) { + return index == -1 ? -1 : this.ids[index]; + } + + public boolean contains(K value) { + return this.getRawId(value) != -1; + } + + public boolean containsKey(int index) { + return this.get(index) != null; + } + + public int add(K value) { + int i = this.nextId(); + this.put(value, i); + return i; + } + + private int nextId() { + while(this.nextId < this.idToValues.length && this.idToValues[this.nextId] != null) { + ++this.nextId; + } + + return this.nextId; + } + + private void resize(int newSize) { + K[] objects = this.values; + int[] is = this.ids; + Int2ObjectBiMap int2ObjectBiMap = new Int2ObjectBiMap<>(newSize); + + for(int i = 0; i < objects.length; ++i) { + if (objects[i] != null) { + int2ObjectBiMap.put(objects[i], is[i]); + } + } + + this.values = int2ObjectBiMap.values; + this.ids = int2ObjectBiMap.ids; + this.idToValues = int2ObjectBiMap.idToValues; + this.nextId = int2ObjectBiMap.nextId; + this.size = int2ObjectBiMap.size; + } + + public void put(K value, int id) { + int i = Math.max(id, this.size + 1); + int j; + if ((float) i >= (float) this.values.length * LOAD_FACTOR) { + for (j = this.values.length << 1; j < id; j <<= 1) { + } + this.resize(j); + } + + j = this.findFree(this.getIdealIndex(value)); + this.values[j] = value; + this.ids[j] = id; + this.idToValues[id] = value; + ++this.size; + if (id == this.nextId) { + ++this.nextId; + } + } + + private int getIdealIndex(@Nullable K value) { + return (MCUtils.idealHash(System.identityHashCode(value)) & Integer.MAX_VALUE) % this.values.length; + } + + private int findIndex(@Nullable K value, int id) { + int i; + for(i = id; i < this.values.length; ++i) { + if (this.values[i] == value) { + return i; + } + + if (this.values[i] == EMPTY) { + return -1; + } + } + + for(i = 0; i < id; ++i) { + if (this.values[i] == value) { + return i; + } + + if (this.values[i] == EMPTY) { + return -1; + } + } + + return -1; + } + + private int findFree(int size) { + int i; + for(i = size; i < this.values.length; ++i) { + if (this.values[i] == EMPTY) { + return i; + } + } + + for(i = 0; i < size; ++i) { + if (this.values[i] == EMPTY) { + return i; + } + } + + throw new RuntimeException("Overflowed :("); + } + + @Override + public @NotNull Iterator iterator() { + return Iterators.filter(Iterators.forArray(this.idToValues), Predicates.notNull()); + } + + public void clear() { + Arrays.fill(this.values, null); + Arrays.fill(this.idToValues, null); + this.nextId = 0; + this.size = 0; + } + + public int size() { + return this.size; + } + + public Int2ObjectBiMap copy() { + return new Int2ObjectBiMap<>(this.values.clone(), this.ids.clone(), this.idToValues.clone(), this.nextId, this.size); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/IntIdentityList.java b/core/src/main/java/net/momirealms/craftengine/core/util/IntIdentityList.java new file mode 100644 index 000000000..c6f539f05 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/IntIdentityList.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class IntIdentityList implements IndexedIterable { + private final int size; + private final List list; + + public IntIdentityList(int size) { + this.size = size; + list = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + list.add(i); + } + } + + @Override + public int getRawId(Integer value) { + return value; + } + + @Override + public @Nullable Integer get(int index) { + return index; + } + + @Override + public int size() { + return size; + } + + @Override + public @NotNull Iterator iterator() { + return list.iterator(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java new file mode 100644 index 000000000..63acc24e4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java @@ -0,0 +1,61 @@ +package net.momirealms.craftengine.core.util; + +public record Key(String namespace, String value) { + + public static final String DEFAULT_NAMESPACE = "craftengine"; + + public static Key withDefaultNamespace(String value) { + return new Key(DEFAULT_NAMESPACE, value); + } + + public static Key of(String namespace, String value) { + return new Key(namespace, value); + } + + public static Key withDefaultNamespace(String namespacedId, String defaultNamespace) { + return of(decompose(namespacedId, defaultNamespace)); + } + + public static Key of(String[] id) { + return new Key(id[0], id[1]); + } + + public static Key of(String namespacedId) { + return of(decompose(namespacedId, "minecraft")); + } + + public static Key from(String namespacedId) { + return of(decompose(namespacedId, "minecraft")); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (!(obj instanceof Key key)) return false; + return this.namespace.equals(key.namespace()) && this.value.equals(key.value()); + } + + @Override + public String toString() { + return namespace + ":" + value; + } + + private static String[] decompose(String id, String namespace) { + String[] strings = new String[]{namespace, id}; + int i = id.indexOf(':'); + if (i >= 0) { + strings[1] = id.substring(i + 1); + if (i >= 1) { + strings[0] = id.substring(0, i); + } + } + return strings; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ListMonitor.java b/core/src/main/java/net/momirealms/craftengine/core/util/ListMonitor.java new file mode 100644 index 000000000..bddcd6a34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ListMonitor.java @@ -0,0 +1,174 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.function.Consumer; + +public class ListMonitor implements List { + + private final List list; + private final Consumer addConsumer; + private final Consumer removeConsumer; + + public ListMonitor(List list, Consumer addConsumer, Consumer removeConsumer) { + for (T key : list) { + addConsumer.accept(key); + } + this.list = list; + this.addConsumer = addConsumer; + this.removeConsumer = removeConsumer; + } + + public List list() { + return list; + } + + public Consumer addConsumer() { + return addConsumer; + } + + public Consumer removeConsumer() { + return removeConsumer; + } + + @Override + public synchronized boolean add(T t) { + addConsumer.accept(t); + return list.add(t); + } + + @Override + public synchronized boolean addAll(@NotNull Collection c) { + for (T element : c) { + addConsumer.accept(element); + } + return list.addAll(c); + } + + @Override + public synchronized boolean addAll(int index, @NotNull Collection c) { + for (T element : c) { + addConsumer.accept(element); + } + return list.addAll(index, c); + } + + @Override + public synchronized void add(int index, T element) { + addConsumer.accept(element); + list.add(index, element); + } + + @Override + public synchronized boolean remove(Object o) { + removeConsumer.accept(o); + return list.remove(o); + } + + @Override + public synchronized boolean removeAll(@NotNull Collection collection) { + for (Object o : collection) { + removeConsumer.accept(o); + } + return list.removeAll(collection); + } + + @Override + public synchronized void clear() { + for (T element : list) { + removeConsumer.accept(element); + } + list.clear(); + } + + @Override + public synchronized int size() { + return list.size(); + } + + @Override + public synchronized boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public synchronized boolean contains(Object o) { + return list.contains(o); + } + + @NotNull + @Override + public synchronized Iterator iterator() { + return list.iterator(); + } + + @NotNull + @Override + public synchronized Object[] toArray() { + return list.toArray(); + } + + @NotNull + @Override + public synchronized E[] toArray(@NotNull E[] a) { + return list.toArray(a); + } + + @NotNull + @Override + public synchronized List subList(int fromIndex, int toIndex) { + return list.subList(fromIndex, toIndex); + } + + @SuppressWarnings("all") + @Override + public synchronized boolean containsAll(@NotNull Collection c) { + return list.containsAll(c); + } + + @Override + public synchronized boolean retainAll(@NotNull Collection c) { + return list.retainAll(c); + } + + @Override + public synchronized T get(int index) { + return list.get(index); + } + + @Override + public synchronized T set(int index, T element) { + return list.set(index, element); + } + + @Override + public synchronized T remove(int index) { + return list.remove(index); + } + + @Override + public synchronized int indexOf(Object o) { + return list.indexOf(o); + } + + @Override + public synchronized int lastIndexOf(Object o) { + return list.lastIndexOf(o); + } + + @NotNull + @Override + public synchronized ListIterator listIterator() { + return list.listIterator(); + } + + @NotNull + @Override + public synchronized ListIterator listIterator(int index) { + return list.listIterator(index); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java new file mode 100644 index 000000000..730f1b594 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java @@ -0,0 +1,177 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.collect.Iterators; + +import javax.annotation.Nullable; +import java.util.Iterator; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class MCUtils { + + private MCUtils() {} + + private static final int[] MULTIPLY_DE_BRUIJN_BIT_POSITION = new int[]{0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9}; + + public static int fastFloor(double x) { + int truncated = (int) x; + return x < (double) truncated ? truncated - 1 : truncated; + } + + public static int fastFloor(float x) { + int truncated = (int) x; + return x < (double) truncated ? truncated - 1 : truncated; + } + + public static int murmurHash3Mixer(int value) { + value ^= value >>> 16; + value *= -2048144789; + value ^= value >>> 13; + value *= -1028477387; + return value ^ value >>> 16; + } + + public static int ceil(double value) { + int i = (int)value; + return value > (double)i ? i + 1 : i; + } + + public static boolean isPowerOfTwo(int value) { + return value != 0 && (value & value - 1) == 0; + } + + public static int smallestEncompassingPowerOfTwo(int value) { + int i = value - 1; + i |= i >> 1; + i |= i >> 2; + i |= i >> 4; + i |= i >> 8; + i |= i >> 16; + return i + 1; + } + + public static int ceilLog2(int value) { + value = isPowerOfTwo(value) ? value : smallestEncompassingPowerOfTwo(value); + return MULTIPLY_DE_BRUIJN_BIT_POSITION[(int)((long)value * 125613361L >> 27) & 31]; + } + + public static int positiveCeilDiv(int a, int b) { + return -Math.floorDiv(-a, b); + } + + public static int idealHash(int value) { + value ^= value >>> 16; + value *= -2048144789; + value ^= value >>> 13; + value *= -1028477387; + value ^= value >>> 16; + return value; + } + + public static long getUnsignedDivisorMagic(final long divisor, final int bits) { + return ((1L << bits) - 1L) / divisor + 1L; + } + + public static T make(T object, Consumer initializer) { + initializer.accept(object); + return object; + } + + public static Predicate allOf() { + return o -> true; + } + + @SuppressWarnings("unchecked") + public static Predicate allOf(Predicate a) { + return (Predicate) a; + } + + public static Predicate allOf(Predicate a, Predicate b) { + return o -> a.test(o) && b.test(o); + } + + public static Predicate allOf(Predicate a, Predicate b, Predicate c) { + return o -> a.test(o) && b.test(o) && c.test(o); + } + + public static Predicate allOf(Predicate a, Predicate b, Predicate c, Predicate d) { + return o -> a.test(o) && b.test(o) && c.test(o) && d.test(o); + } + + public static Predicate allOf(Predicate a, Predicate b, Predicate c, Predicate d, Predicate e) { + return o -> a.test(o) && b.test(o) && c.test(o) && d.test(o) && e.test(o); + } + + @SafeVarargs + public static Predicate allOf(Predicate... predicates) { + return o -> { + for (Predicate predicate : predicates) { + if (!predicate.test(o)) { + return false; + } + } + + return true; + }; + } + + public static Predicate allOf(List> predicates) { + return switch (predicates.size()) { + case 0 -> allOf(); + case 1 -> allOf((Predicate) predicates.get(0)); + case 2 -> allOf((Predicate) predicates.get(0), (Predicate) predicates.get(1)); + case 3 -> allOf((Predicate) predicates.get(0), (Predicate) predicates.get(1), (Predicate) predicates.get(2)); + case 4 -> allOf( + (Predicate) predicates.get(0), + (Predicate) predicates.get(1), + (Predicate) predicates.get(2), + (Predicate) predicates.get(3) + ); + case 5 -> allOf( + (Predicate) predicates.get(0), + (Predicate) predicates.get(1), + (Predicate) predicates.get(2), + (Predicate) predicates.get(3), + (Predicate) predicates.get(4) + ); + default -> { + Predicate[] predicates2 = predicates.toArray(Predicate[]::new); + yield allOf(predicates2); + } + }; + } + + public static T findPreviousInIterable(Iterable iterable, @Nullable T object) { + Iterator iterator = iterable.iterator(); + T previous = null; + while (iterator.hasNext()) { + T current = iterator.next(); + if (current == object) { + if (previous == null) { + previous = iterator.hasNext() ? Iterators.getLast(iterator) : object; + } + break; + } + previous = current; + } + return previous; + } + + public static T findNextInIterable(Iterable iterable, @Nullable T object) { + Iterator iterator = iterable.iterator(); + T next = iterator.next(); + if (object != null) { + T current = next; + while (current != object) { + if (iterator.hasNext()) { + current = iterator.next(); + } + } + if (iterator.hasNext()) { + return iterator.next(); + } + } + return next; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MapColor.java b/core/src/main/java/net/momirealms/craftengine/core/util/MapColor.java new file mode 100644 index 000000000..6cd8211f3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MapColor.java @@ -0,0 +1,91 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.base.Preconditions; + +public class MapColor { + private static final MapColor[] COLORS = new MapColor[64]; + public static final MapColor CLEAR = new MapColor(0, 0); + public static final MapColor PALE_GREEN = new MapColor(1, 8368696); + public static final MapColor PALE_YELLOW = new MapColor(2, 16247203); + public static final MapColor WHITE_GRAY = new MapColor(3, 13092807); + public static final MapColor BRIGHT_RED = new MapColor(4, 16711680); + public static final MapColor PALE_PURPLE = new MapColor(5, 10526975); + public static final MapColor IRON_GRAY = new MapColor(6, 10987431); + public static final MapColor DARK_GREEN = new MapColor(7, 31744); + public static final MapColor WHITE = new MapColor(8, 16777215); + public static final MapColor LIGHT_BLUE_GRAY = new MapColor(9, 10791096); + public static final MapColor DIRT_BROWN = new MapColor(10, 9923917); + public static final MapColor STONE_GRAY = new MapColor(11, 7368816); + public static final MapColor WATER_BLUE = new MapColor(12, 4210943); + public static final MapColor OAK_TAN = new MapColor(13, 9402184); + public static final MapColor OFF_WHITE = new MapColor(14, 16776437); + public static final MapColor ORANGE = new MapColor(15, 14188339); + public static final MapColor MAGENTA = new MapColor(16, 11685080); + public static final MapColor LIGHT_BLUE = new MapColor(17, 6724056); + public static final MapColor YELLOW = new MapColor(18, 15066419); + public static final MapColor LIME = new MapColor(19, 8375321); + public static final MapColor PINK = new MapColor(20, 15892389); + public static final MapColor GRAY = new MapColor(21, 5000268); + public static final MapColor LIGHT_GRAY = new MapColor(22, 10066329); + public static final MapColor CYAN = new MapColor(23, 5013401); + public static final MapColor PURPLE = new MapColor(24, 8339378); + public static final MapColor BLUE = new MapColor(25, 3361970); + public static final MapColor BROWN = new MapColor(26, 6704179); + public static final MapColor GREEN = new MapColor(27, 6717235); + public static final MapColor RED = new MapColor(28, 10040115); + public static final MapColor BLACK = new MapColor(29, 1644825); + public static final MapColor GOLD = new MapColor(30, 16445005); + public static final MapColor DIAMOND_BLUE = new MapColor(31, 6085589); + public static final MapColor LAPIS_BLUE = new MapColor(32, 4882687); + public static final MapColor EMERALD_GREEN = new MapColor(33, 55610); + public static final MapColor SPRUCE_BROWN = new MapColor(34, 8476209); + public static final MapColor DARK_RED = new MapColor(35, 7340544); + public static final MapColor TERRACOTTA_WHITE = new MapColor(36, 13742497); + public static final MapColor TERRACOTTA_ORANGE = new MapColor(37, 10441252); + public static final MapColor TERRACOTTA_MAGENTA = new MapColor(38, 9787244); + public static final MapColor TERRACOTTA_LIGHT_BLUE = new MapColor(39, 7367818); + public static final MapColor TERRACOTTA_YELLOW = new MapColor(40, 12223780); + public static final MapColor TERRACOTTA_LIME = new MapColor(41, 6780213); + public static final MapColor TERRACOTTA_PINK = new MapColor(42, 10505550); + public static final MapColor TERRACOTTA_GRAY = new MapColor(43, 3746083); + public static final MapColor TERRACOTTA_LIGHT_GRAY = new MapColor(44, 8874850); + public static final MapColor TERRACOTTA_CYAN = new MapColor(45, 5725276); + public static final MapColor TERRACOTTA_PURPLE = new MapColor(46, 8014168); + public static final MapColor TERRACOTTA_BLUE = new MapColor(47, 4996700); + public static final MapColor TERRACOTTA_BROWN = new MapColor(48, 4993571); + public static final MapColor TERRACOTTA_GREEN = new MapColor(49, 5001770); + public static final MapColor TERRACOTTA_RED = new MapColor(50, 9321518); + public static final MapColor TERRACOTTA_BLACK = new MapColor(51, 2430480); + public static final MapColor DULL_RED = new MapColor(52, 12398641); + public static final MapColor DULL_PINK = new MapColor(53, 9715553); + public static final MapColor DARK_CRIMSON = new MapColor(54, 6035741); + public static final MapColor TEAL = new MapColor(55, 1474182); + public static final MapColor DARK_AQUA = new MapColor(56, 3837580); + public static final MapColor DARK_DULL_PINK = new MapColor(57, 5647422); + public static final MapColor BRIGHT_TEAL = new MapColor(58, 1356933); + public static final MapColor DEEPSLATE_GRAY = new MapColor(59, 6579300); + public static final MapColor RAW_IRON_PINK = new MapColor(60, 14200723); + public static final MapColor LICHEN_GREEN = new MapColor(61, 8365974); + public final int color; + public final int id; + + private MapColor(int id, int color) { + if (id >= 0 && id <= 63) { + this.id = id; + this.color = color; + COLORS[id] = this; + } else { + throw new IndexOutOfBoundsException("Map colour ID must be between 0 and 63 (inclusive)"); + } + } + + public static MapColor get(int id) { + Preconditions.checkPositionIndex(id, COLORS.length, "material id"); + return getUnchecked(id); + } + + private static MapColor getUnchecked(int id) { + MapColor mapColor = COLORS[id]; + return mapColor != null ? mapColor : CLEAR; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Mirror.java b/core/src/main/java/net/momirealms/craftengine/core/util/Mirror.java new file mode 100644 index 000000000..6fb82193b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Mirror.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.util; + +public enum Mirror { + NONE, + LEFT_RIGHT, + FRONT_BACK; + + public int mirror(int rotation, int fullTurn) { + int i = fullTurn / 2; + int j = rotation > i ? rotation - fullTurn : rotation; + return switch (this) { + case LEFT_RIGHT -> (i - j + fullTurn) % fullTurn; + case FRONT_BACK -> (fullTurn - j) % fullTurn; + default -> rotation; + }; + } + + public Rotation getRotation(Direction direction) { + Direction.Axis axis = direction.axis(); + return (this != LEFT_RIGHT || axis != Direction.Axis.Z) && (this != FRONT_BACK || axis != Direction.Axis.X) ? Rotation.NONE : Rotation.CLOCKWISE_180; + } + + public Direction mirror(Direction direction) { + if (this == FRONT_BACK && direction.axis() == Direction.Axis.X) { + return direction.opposite(); + } else { + return this == LEFT_RIGHT && direction.axis() == Direction.Axis.Z ? direction.opposite() : direction; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java new file mode 100644 index 000000000..28b8f4a42 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java @@ -0,0 +1,152 @@ +package net.momirealms.craftengine.core.util; + +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class MiscUtils { + + private MiscUtils() {} + + @SuppressWarnings("unchecked") + public static Map castToMap(Object obj, boolean allowNull) { + if (allowNull && obj == null) { + return null; + } + if (obj instanceof Map map) { + return (Map) map; + } + throw new IllegalArgumentException("Expected Map, got: " + obj.getClass().getSimpleName()); + } + + @SuppressWarnings("unchecked") + public static List castToList(Object obj, boolean allowNull) { + if (allowNull && obj == null) { + return null; + } + if (obj instanceof List list) { + return (List) list; + } + throw new IllegalArgumentException("Expected List, got: " + obj.getClass().getSimpleName()); + } + + public static List getAsStringList(Object o) { + List list = new ArrayList<>(); + if (o instanceof List) { + for (Object object : (List) o) { + list.add(object.toString()); + } + } else if (o instanceof String) { + list.add((String) o); + } else { + if (o != null) { + list.add(o.toString()); + } + } + return list; + } + + public static List getAsFloatList(Object o) { + List list = new ArrayList<>(); + if (o instanceof List) { + for (Object object : (List) o) { + if (object instanceof Number) { + list.add(((Number) object).floatValue()); + } else if (object instanceof String) { + try { + list.add(Float.parseFloat((String) object)); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + object + " to float"); + } + } else { + throw new RuntimeException("Cannot convert " + object + " to float"); + } + } + } else if (o instanceof Float) { + list.add((Float) o); + } else if (o instanceof String) { + try { + list.add(Float.parseFloat((String) o)); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to float"); + } + } else { + throw new RuntimeException("Cannot convert " + o + " to float"); + } + return list; + } + + public static int getAsInt(Object o) { + if (o instanceof Integer) { + return (Integer) o; + } else if (o instanceof String) { + try { + return Integer.parseInt((String) o); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to int"); + } + } else if (o instanceof Boolean) { + return (Boolean) o ? 1 : 0; + } else if (o instanceof Number) { + return ((Number) o).intValue(); + } + throw new RuntimeException("Cannot convert " + o + " to int"); + } + + public static double getAsDouble(Object o) { + if (o instanceof Double) { + return (Double) o; + } else if (o instanceof String) { + try { + return Double.parseDouble((String) o); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to double"); + } + } else if (o instanceof Number) { + return ((Number) o).doubleValue(); + } + throw new RuntimeException("Cannot convert " + o + " to double"); + } + + public static float getAsFloat(Object o) { + if (o instanceof Float) { + return (Float) o; + } else if (o instanceof String) { + try { + return Float.parseFloat((String) o); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to float"); + } + } else if (o instanceof Number) { + return ((Number) o).floatValue(); + } + throw new RuntimeException("Cannot convert " + o + " to float"); + } + + public static Vector3f getVector3f(Object o) { + String stringFormat = o.toString(); + String[] split = stringFormat.split(","); + if (split.length == 3) { + return new Vector3f(Float.parseFloat(split[0]), Float.parseFloat(split[1]), Float.parseFloat(split[2])); + } else if (split.length == 1) { + return new Vector3f(Float.parseFloat(split[0])); + } else { + throw new RuntimeException("Cannot convert " + o + " to Vector3f"); + } + } + + public static Quaternionf getQuaternionf(Object o) { + String stringFormat = o.toString(); + String[] split = stringFormat.split(","); + if (split.length == 4) { + return new Quaternionf(Float.parseFloat(split[0]), Float.parseFloat(split[1]), Float.parseFloat(split[2]), Float.parseFloat(split[3])); + } else if (split.length == 1) { + return QuaternionUtils.toQuaternionf(0, Math.toRadians(Float.parseFloat(split[0])), 0); + } else { + throw new RuntimeException("Cannot convert " + o + " to Quaternionf"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Pair.java b/core/src/main/java/net/momirealms/craftengine/core/util/Pair.java new file mode 100644 index 000000000..de9774f5c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Pair.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Objects; + +/** + * A generic class representing a pair of values. + * This class provides methods to create and access pairs of values. + * + * @param the type of the left value + * @param the type of the right value + */ +public record Pair(L left, R right) { + + /** + * Creates a new {@link Pair} with the specified left and right values. + * + * @param left the left value + * @param right the right value + * @param the type of the left value + * @param the type of the right value + * @return a new {@link Pair} with the specified values + */ + public static Pair of(final L left, final R right) { + return new Pair<>(left, right); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + Pair pair = (Pair) object; + return Objects.equals(left, pair.left) && Objects.equals(right, pair.right); + } + + @Override + public int hashCode() { + return Objects.hash(this.left, this.right); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/PreConditions.java b/core/src/main/java/net/momirealms/craftengine/core/util/PreConditions.java new file mode 100644 index 000000000..6ed7f921d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/PreConditions.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +public class PreConditions { + + private PreConditions() {} + + public static boolean runIfTrue(boolean value, @NotNull Runnable runnable) { + if (value) { + runnable.run(); + } + return value; + } + + public static boolean isNull(Object value, @NotNull Runnable runnable) { + if (value == null) { + runnable.run(); + } + return value == null; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/QuadFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/QuadFunction.java new file mode 100644 index 000000000..a758dd3e9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/QuadFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface QuadFunction { + R apply(T t, U u, V v, W w); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/QuaternionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/QuaternionUtils.java new file mode 100644 index 000000000..4b5a32d65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/QuaternionUtils.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.util; + +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class QuaternionUtils { + + private QuaternionUtils() {} + + public static Quaternionf toQuaternionf(double yaw, double pitch, double roll) { + double cy = Math.cos(yaw * 0.5); + double sy = Math.sin(yaw * 0.5); + double cp = Math.cos(pitch * 0.5); + double sp = Math.sin(pitch * 0.5); + double cr = Math.cos(roll * 0.5); + double sr = Math.sin(roll * 0.5); + double w = cy * cp * cr + sy * sp * sr; + double x = cy * cp * sr - sy * sp * cr; + double y = sy * cp * sr + cy * sp * cr; + double z = sy * cp * cr - cy * sp * sr; + return new Quaternionf(x, y, z, w); + } + + public static Vector3f toEulerAngle(Quaternionf quaternionf) { + float x = quaternionf.x; + float y = quaternionf.y; + float z = quaternionf.z; + float w = quaternionf.w; + float siny_cosp = 2 * (w * z + x * y); + float cosy_cosp = 1 - 2 * (y * y + z * z); + float yaw = (float) Math.atan2(siny_cosp, cosy_cosp); + float sinp = 2 * (w * y - z * x); + float pitch = (float) Math.asin(sinp); + float sinr_cosp = 2 * (w * x + y * z); + float cosr_cosp = 1 - 2 * (x * x + y * y); + float roll = (float) Math.atan2(sinr_cosp, cosr_cosp); + return new Vector3f(yaw, pitch, roll); + } + + public static double quaternionToPitch(Quaternionf quaternionf) { + return 2 * Math.atan2(quaternionf.y, quaternionf.w); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java new file mode 100644 index 000000000..38d5f78dd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class RandomUtils { + private final Random random; + + private RandomUtils() { + random = ThreadLocalRandom.current(); + } + + private static class SingletonHolder { + private static final RandomUtils INSTANCE = new RandomUtils(); + } + + private static RandomUtils getInstance() { + return SingletonHolder.INSTANCE; + } + + public static double generateRandomDouble(double min, double max) { + return min + (max - min) * getInstance().random.nextDouble(); + } + + public static float generateRandomFloat(float min, float max) { + return min + (max - min) * getInstance().random.nextFloat(); + } + + public static boolean generateRandomBoolean() { + return getInstance().random.nextBoolean(); + } + + public static double triangle(double mode, double deviation) { + return mode + deviation * (generateRandomDouble(0,1) - generateRandomDouble(0,1)); + } + + public static T getRandomElementFromArray(T[] array) { + int index = getInstance().random.nextInt(array.length); + return array[index]; + } + + public static T[] getRandomElementsFromArray(T[] array, int count) { + if (count > array.length) { + throw new IllegalArgumentException("Count cannot be greater than array length"); + } + @SuppressWarnings("unchecked") + T[] result = (T[]) new Object[count]; + for (int i = 0; i < count; i++) { + int index = getInstance().random.nextInt(array.length - i); + result[i] = array[index]; + array[index] = array[array.length - i - 1]; + } + return result; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java new file mode 100644 index 000000000..92403e9a4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java @@ -0,0 +1,433 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ReflectionUtils { + + private ReflectionUtils() {} + + public static Class getClazz(String... classes) { + for (String className : classes) { + Class clazz = getClazz(className); + if (clazz != null) { + return clazz; + } + } + return null; + } + + public static Class getClazz(String clazz) { + try { + return Class.forName(clazz); + } catch (Throwable e) { + return null; + } + } + + public static boolean classExists(@NotNull final String clazz) { + try { + Class.forName(clazz); + return true; + } catch (Throwable e) { + return false; + } + } + + public static boolean methodExists(@NotNull final Class clazz, @NotNull final String method, @NotNull final Class... parameterTypes) { + try { + clazz.getMethod(method, parameterTypes); + return true; + } catch (NoSuchMethodException e) { + return false; + } + } + + @Nullable + public static Field getDeclaredField(final Class clazz, final String field) { + try { + return setAccessible(clazz.getDeclaredField(field)); + } catch (NoSuchFieldException e) { + return null; + } + } + + @NotNull + public static Field getDeclaredField(@NotNull Class clazz, @NotNull String... possibleNames) { + List possibleNameList = Arrays.asList(possibleNames); + for (Field field : clazz.getDeclaredFields()) { + if (possibleNameList.contains(field.getName())) { + return field; + } + } + throw new RuntimeException("Class " + clazz.getName() + " does not contain a field with possible names " + Arrays.toString(possibleNames)); + } + + @Nullable + public static Field getDeclaredField(final Class clazz, final int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (index == i) { + return setAccessible(field); + } + i++; + } + return null; + } + + @Nullable + public static Field getInstanceDeclaredField(final Class clazz, final int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (!Modifier.isStatic(field.getModifiers())) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @Nullable + public static Field getDeclaredField(final Class clazz, final Class type, int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (field.getType() == type) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @Nullable + public static Field getInstanceDeclaredField(@NotNull Class clazz, final Class type, int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (field.getType() == type && !Modifier.isStatic(field.getModifiers())) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @NotNull + public static List getDeclaredFields(final Class clazz) { + List fields = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + fields.add(setAccessible(field)); + } + return fields; + } + + @NotNull + public static List getInstanceDeclaredFields(@NotNull Class clazz) { + List list = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + if (!Modifier.isStatic(field.getModifiers())) { + list.add(setAccessible(field)); + } + } + return list; + } + + @NotNull + public static List getDeclaredFields(@NotNull final Class clazz, @NotNull final Class type) { + List fields = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + if (field.getType() == type) { + fields.add(setAccessible(field)); + } + } + return fields; + } + + @NotNull + public static List getInstanceDeclaredFields(@NotNull Class clazz, @NotNull Class type) { + List list = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + if (field.getType() == type && !Modifier.isStatic(field.getModifiers())) { + list.add(setAccessible(field)); + } + } + return list; + } + + @Nullable + public static Method getMethod(final Class clazz, Class returnType, final String[] possibleMethodNames, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + for (String name : possibleMethodNames) { + if (name.equals(method.getName())) { + if (returnType.isAssignableFrom(method.getReturnType())) { + return method; + } + } + } + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, final String[] possibleMethodNames, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + for (String name : possibleMethodNames) { + if (name.equals(method.getName())) return method; + } + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) return method; + } + return null; + } + + @Nullable + public static Method getDeclaredMethod(final Class clazz, Class returnType, final String[] possibleMethodNames, final Class... parameterTypes) { + outer: + for (Method method : clazz.getDeclaredMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + for (String name : possibleMethodNames) { + if (name.equals(method.getName())) { + if (returnType.isAssignableFrom(method.getReturnType())) { + return setAccessible(method); + } + } + } + } + return null; + } + + @Nullable + public static Method getDeclaredMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getDeclaredMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) return setAccessible(method); + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, Class returnType, int index) { + int i = 0; + for (Method method : clazz.getMethods()) { + if (returnType.isAssignableFrom(method.getReturnType())) { + if (i == index) { + return setAccessible(method); + } + i++; + } + } + return null; + } + + @Nullable + public static Method getStaticMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + if (!Modifier.isStatic(method.getModifiers())) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) + return setAccessible(method); + } + return null; + } + + @Nullable + public static Method getStaticMethod(final Class clazz, String[] possibleNames, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + if (!Modifier.isStatic(method.getModifiers())) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) { + for (String name : possibleNames) { + if (name.equals(method.getName())) { + return setAccessible(method); + } + } + } + } + return null; + } + + public static Method getStaticMethod(final Class clazz, int index) { + int i = 0; + for (Method method : clazz.getMethods()) { + if (Modifier.isStatic(method.getModifiers())) { + if (i == index) { + return setAccessible(method); + } + i++; + } + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, int index) { + int i = 0; + for (Method method : clazz.getMethods()) { + if (i == index) { + return setAccessible(method); + } + i++; + } + return null; + } + + public static Method getMethodOrElseThrow(final Class clazz, final String[] possibleMethodNames, final Class[] parameterTypes) throws NoSuchMethodException { + Method method = getMethod(clazz, possibleMethodNames, parameterTypes); + if (method == null) { + throw new NoSuchMethodException("No method found with possible names " + Arrays.toString(possibleMethodNames) + " with parameters " + + Arrays.toString(parameterTypes) + " in class " + clazz.getName()); + } + return method; + } + + @NotNull + public static List getMethods(@NotNull Class clazz, @NotNull Class returnType, @NotNull Class... parameterTypes) { + List list = new ArrayList<>(); + for (Method method : clazz.getMethods()) { + if (!returnType.isAssignableFrom(method.getReturnType()) // check type + || method.getParameterCount() != parameterTypes.length // check length + ) continue; + Class[] types = method.getParameterTypes(); + outer: { + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + break outer; + } + } + list.add(method); + } + } + return list; + } + + @NotNull + public static T setAccessible(@NotNull final T o) { + o.setAccessible(true); + return o; + } + + @Nullable + public static Constructor getConstructor(Class clazz, Class... parameterTypes) { + try { + return clazz.getConstructor(parameterTypes); + } catch (NoSuchMethodException | SecurityException ignore) { + return null; + } + } + + @Nullable + public static Constructor getDeclaredConstructor(Class clazz, Class... parameterTypes) { + try { + return setAccessible(clazz.getDeclaredConstructor(parameterTypes)); + } catch (NoSuchMethodException | SecurityException ignore) { + return null; + } + } + + @Nullable + public static Constructor getConstructor(Class clazz, int index) { + try { + Constructor[] constructors = clazz.getDeclaredConstructors(); + if (index < 0 || index >= constructors.length) { + throw new IndexOutOfBoundsException("Invalid constructor index: " + index); + } + return setAccessible(constructors[index]); + } catch (SecurityException e) { + return null; + } + } + + @NotNull + public static Constructor getTheOnlyConstructor(Class clazz) { + Constructor[] constructors = clazz.getConstructors(); + if (constructors.length != 1) { + throw new RuntimeException("This class is expected to have only one constructor but it has " + constructors.length); + } + return constructors[0]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java new file mode 100644 index 000000000..b8b65ed97 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.util; + +public class ResourceKey { + private final Key registry; + private final Key location; + + public ResourceKey(Key registry, Key location) { + this.registry = registry; + this.location = location; + } + + public static ResourceKey create(Key registry, Key location) { + return new ResourceKey<>(registry, location); + } + + public Key registry() { + return registry; + } + + public Key location() { + return location; + } + + @Override + public String toString() { + return "ResourceKey[" + this.registry + " / " + this.location + "]"; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Rotation.java b/core/src/main/java/net/momirealms/craftengine/core/util/Rotation.java new file mode 100644 index 000000000..45ad256df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Rotation.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Random; + +public enum Rotation { + NONE, + CLOCKWISE_90, + CLOCKWISE_180, + COUNTERCLOCKWISE_90; + + private static final Rotation[][] rotationMap = { + {Rotation.NONE, Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90}, + {Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90, Rotation.NONE}, + {Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90, Rotation.NONE, Rotation.CLOCKWISE_90}, + {Rotation.COUNTERCLOCKWISE_90, Rotation.NONE, Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180} + }; + + public Rotation getRotated(Rotation rotation) { + int thisIndex = this.ordinal(); + int rotationIndex = rotation.ordinal(); + return rotationMap[thisIndex][rotationIndex]; + } + + public Direction rotate(Direction direction) { + if (direction.axis() == Direction.Axis.Y) { + return direction; + } else { + return switch (this) { + case CLOCKWISE_90 -> direction.clockWise(); + case CLOCKWISE_180 -> direction.opposite(); + case COUNTERCLOCKWISE_90 -> direction.counterClockWise(); + default -> direction; + }; + } + } + + public int rotate(int rotation, int fullTurn) { + return switch (this) { + case CLOCKWISE_90 -> (rotation + fullTurn / 4) % fullTurn; + case CLOCKWISE_180 -> (rotation + fullTurn / 2) % fullTurn; + case COUNTERCLOCKWISE_90 -> (rotation + fullTurn * 3 / 4) % fullTurn; + default -> rotation; + }; + } + + public static Rotation random(Random random) { + return values()[random.nextInt(values().length)]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SectionPosUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/SectionPosUtils.java new file mode 100644 index 000000000..230a0419e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SectionPosUtils.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.core.util; + +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.SectionPos; + +import java.util.BitSet; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class SectionPosUtils { + + private SectionPosUtils() {} + + public static Map nearbySectionsMap(Set sections, int minLightSection, int maxLightSection) { + Map nearby = new Long2ObjectOpenHashMap<>(); + for (SectionPos section : sections) { + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + long chunkPos = ChunkPos.asLong(section.x() + i, section.z() + j); + BitSet posSet = nearby.computeIfAbsent(chunkPos, k -> new BitSet(maxLightSection - minLightSection)); + for (int k = -1; k <= 1; k++) { + int y = section.y() + k; + if (y >= minLightSection && y <= maxLightSection) { + posSet.set(y - minLightSection); + } + } + } + } + } + return nearby; + } + + public static Map toMap(Set sections, int minLightSection, int maxLightSection) { + int nBits = maxLightSection - minLightSection; + Map nearby = new Long2ObjectOpenHashMap<>(Math.max(8, sections.size() / 2), 0.5f); + for (SectionPos section : sections) { + long chunkPos = ChunkPos.asLong(section.x(), section.z()); + BitSet posSet = nearby.computeIfAbsent(chunkPos, k -> new BitSet(nBits)); + int y = section.y(); + if (y >= minLightSection && y <= maxLightSection) { + posSet.set(y - minLightSection); + } + } + return nearby; + } + + public static Set calculateAffectedRegions(int sx, int sy, int sz, int x) { + Set regions = new HashSet<>(); + int rxStart = (sx - x) >> 4; + int rxEnd = (sx + x) >> 4; + int ryStart = (sy - x) >> 4; + int ryEnd = (sy + x) >> 4; + int rzStart = (sz - x) >> 4; + int rzEnd = (sz + x) >> 4; + for (int rx = rxStart; rx <= rxEnd; rx++) { + for (int ry = ryStart; ry <= ryEnd; ry++) { + for (int rz = rzStart; rz <= rzEnd; rz++) { + int xMin = rx << 4; + int xMax = xMin + 15; + int dxMin = calculateMinDistance(sx, xMin, xMax); + int yMin = ry << 4; + int yMax = yMin + 15; + int dyMin = calculateMinDistance(sy, yMin, yMax); + int zMin = rz << 4; + int zMax = zMin + 15; + int dzMin = calculateMinDistance(sz, zMin, zMax); + if (dxMin + dyMin + dzMin <= x) { + regions.add(new SectionPos(rx, ry, rz)); + } + } + } + } + return regions; + } + + private static int calculateMinDistance(int coord, int min, int max) { + if (coord < min) { + return min - coord; + } else if (coord > max) { + return coord - max; + } else { + return 0; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SerializationUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/SerializationUtils.java new file mode 100644 index 000000000..557000f40 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SerializationUtils.java @@ -0,0 +1,88 @@ +package net.momirealms.craftengine.core.util; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class SerializationUtils { + + private SerializationUtils() {} + + static class ClassLoaderAwareObjectInputStream extends ObjectInputStream { + private static final Map> PRIMITIVE_TYPES = new HashMap<>(); + + static { + PRIMITIVE_TYPES.put("byte", byte.class); + PRIMITIVE_TYPES.put("short", short.class); + PRIMITIVE_TYPES.put("int", int.class); + PRIMITIVE_TYPES.put("long", long.class); + PRIMITIVE_TYPES.put("float", float.class); + PRIMITIVE_TYPES.put("double", double.class); + PRIMITIVE_TYPES.put("boolean", boolean.class); + PRIMITIVE_TYPES.put("char", char.class); + PRIMITIVE_TYPES.put("void", void.class); + } + + private final ClassLoader classLoader; + + ClassLoaderAwareObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException { + super(in); + this.classLoader = classLoader; + } + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + String className = desc.getName(); + try { + return Class.forName(className, false, classLoader); + } catch (ClassNotFoundException e) { + Class primitiveClass = PRIMITIVE_TYPES.get(className); + if (primitiveClass != null) { + return primitiveClass; + } + return super.resolveClass(desc); + } + } + } + + public static T clone(T object) { + if (object == null) { + return null; + } + byte[] objectData = serialize(object); + try (ByteArrayInputStream bais = new ByteArrayInputStream(objectData); + ClassLoaderAwareObjectInputStream ois = new ClassLoaderAwareObjectInputStream(bais, object.getClass().getClassLoader())) { + @SuppressWarnings("unchecked") + T clonedObject = (T) ois.readObject(); + return clonedObject; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Exception occurred while cloning object", e); + } + } + + public static T deserialize(byte[] objectData) { + Objects.requireNonNull(objectData); + return deserialize(new ByteArrayInputStream(objectData)); + } + + public static T deserialize(InputStream inputStream) { + Objects.requireNonNull(inputStream); + try (ObjectInputStream ois = new ObjectInputStream(inputStream)) { + @SuppressWarnings("unchecked") + T obj = (T) ois.readObject(); + return obj; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Exception occurred while deserializing object", e); + } + } + + public static byte[] serialize(Serializable obj) { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(obj); + return baos.toByteArray(); + } catch (IOException e) { + throw new RuntimeException("Exception occurred while serializing object", e); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SkullUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/SkullUtils.java new file mode 100644 index 000000000..291ee50da --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SkullUtils.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Base64; + +public class SkullUtils { + + private SkullUtils() {} + + public static String identifierFromBase64(String base64) { + byte[] decodedBytes = Base64.getDecoder().decode(base64); + String decodedString = new String(decodedBytes); + int urlStartIndex = decodedString.indexOf("\"url\":\"") + 7; + int urlEndIndex = decodedString.indexOf("\"", urlStartIndex); + String textureUrl = decodedString.substring(urlStartIndex, urlEndIndex); + return textureUrl.substring(textureUrl.lastIndexOf('/') + 1); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/StringReader.java b/core/src/main/java/net/momirealms/craftengine/core/util/StringReader.java new file mode 100644 index 000000000..4fd76995f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/StringReader.java @@ -0,0 +1,238 @@ +package net.momirealms.craftengine.core.util; + +public class StringReader { + private static final char SYNTAX_ESCAPE = '\\'; + private static final char SYNTAX_DOUBLE_QUOTE = '"'; + private static final char SYNTAX_SINGLE_QUOTE = '\''; + private final String string; + private int cursor; + + public StringReader(StringReader other) { + this.string = other.string; + this.cursor = other.cursor; + } + + public StringReader(String string) { + this.string = string; + } + + public String getString() { + return this.string; + } + + public void setCursor(int cursor) { + this.cursor = cursor; + } + + public int getRemainingLength() { + return this.string.length() - this.cursor; + } + + public int getTotalLength() { + return this.string.length(); + } + + public int getCursor() { + return this.cursor; + } + + public String getRead() { + return this.string.substring(0, this.cursor); + } + + public String getRemaining() { + return this.string.substring(this.cursor); + } + + public boolean canRead(int length) { + return this.cursor + length <= this.string.length(); + } + + public boolean canRead() { + return this.canRead(1); + } + + public char peek() { + return this.string.charAt(this.cursor); + } + + public char peek(int offset) { + return this.string.charAt(this.cursor + offset); + } + + public char read() { + if (!canRead()) { + throw new RuntimeException("No more characters to read."); + } + return this.string.charAt(this.cursor++); + } + + public void skip() { + if (!canRead()) { + throw new RuntimeException("No more characters to skip."); + } + ++this.cursor; + } + + public static boolean isAllowedNumber(char c) { + return c >= '0' && c <= '9' || c == '.' || c == '-'; + } + + public static boolean isQuotedStringStart(char c) { + return c == SYNTAX_DOUBLE_QUOTE || c == SYNTAX_SINGLE_QUOTE; + } + + public void skipWhitespace() { + while (this.canRead() && Character.isWhitespace(this.peek())) { + this.skip(); + } + } + + public int readInt() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected integer, but found empty string."); + } + try { + return Integer.parseInt(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse integer: " + number); + } + } + + public long readLong() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected long, but found empty string."); + } + try { + return Long.parseLong(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse long: " + number); + } + } + + public double readDouble() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected double, but found empty string."); + } + try { + return Double.parseDouble(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse double: " + number); + } + } + + public float readFloat() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected float, but found empty string."); + } + try { + return Float.parseFloat(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse float: " + number); + } + } + + public static boolean isAllowedInUnquotedString(char c) { + return c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c == '_' || c == '-' || c == '.' || c == '+'; + } + + public String readUnquotedString() { + int start = this.cursor; + while (this.canRead() && isAllowedInUnquotedString(this.peek())) { + this.skip(); + } + return this.string.substring(start, this.cursor); + } + + public String readQuotedString() { + if (!this.canRead()) { + return ""; + } else { + char next = this.peek(); + if (!isQuotedStringStart(next)) { + throw new RuntimeException("Expected quoted string, but found: " + next); + } else { + this.skip(); + return this.readStringUntil(next); + } + } + } + + public String readStringUntil(char terminator) { + StringBuilder result = new StringBuilder(); + boolean escaped = false; + + while (this.canRead()) { + char c = this.read(); + if (escaped) { + if (c != terminator && c != SYNTAX_ESCAPE) { + this.setCursor(this.getCursor() - 1); + throw new RuntimeException("Invalid escape sequence."); + } + result.append(c); + escaped = false; + } else if (c == SYNTAX_ESCAPE) { + escaped = true; + } else { + if (c == terminator) { + return result.toString(); + } + result.append(c); + } + } + throw new RuntimeException("Unexpected end of input while reading string."); + } + + public String readString() { + if (!this.canRead()) { + return ""; + } else { + char next = this.peek(); + if (isQuotedStringStart(next)) { + this.skip(); + return this.readStringUntil(next); + } else { + return this.readUnquotedString(); + } + } + } + + public boolean readBoolean() { + int start = this.cursor; + String value = this.readString(); + if (value.isEmpty()) { + throw new RuntimeException("Expected boolean, but found empty string."); + } else if (value.equals("true")) { + return true; + } else if (value.equals("false")) { + return false; + } else { + this.cursor = start; + throw new RuntimeException("Failed to parse boolean: " + value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/TriConsumer.java b/core/src/main/java/net/momirealms/craftengine/core/util/TriConsumer.java new file mode 100644 index 000000000..3191f725f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/TriConsumer.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface TriConsumer { + void accept(K k, V v, S s); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/TriFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/TriFunction.java new file mode 100644 index 000000000..61e3b9d48 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/TriFunction.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Objects; +import java.util.function.Function; + +@FunctionalInterface +public interface TriFunction { + R apply(T var1, U var2, V var3); + + default TriFunction andThen(Function after) { + Objects.requireNonNull(after); + return (t, u, v) -> { + return after.apply(this.apply(t, u, v)); + }; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Tristate.java b/core/src/main/java/net/momirealms/craftengine/core/util/Tristate.java new file mode 100644 index 000000000..1e3487202 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Tristate.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +public enum Tristate { + TRUE(true), + FALSE(false), + UNDEFINED(false); + + public static @NotNull Tristate of(boolean val) { + return val ? TRUE : FALSE; + } + + public static @NotNull Tristate of(Boolean val) { + return val == null ? UNDEFINED : val ? TRUE : FALSE; + } + + private final boolean booleanValue; + + Tristate(boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public boolean asBoolean() { + return this.booleanValue; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Tuple.java b/core/src/main/java/net/momirealms/craftengine/core/util/Tuple.java new file mode 100644 index 000000000..e4cf6baf5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Tuple.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Objects; + +/** + * A generic class representing a tuple with three values. + * This class provides methods for creating and accessing tuples with three values. + * + * @param the type of the left value + * @param the type of the middle value + * @param the type of the right value + */ +public record Tuple(L left, M mid, R right) { + + /** + * Creates a new {@link Tuple} with the specified left, middle, and right values. + * + * @param left the left value + * @param mid the middle value + * @param right the right value + * @param the type of the left value + * @param the type of the middle value + * @param the type of the right value + * @return a new {@link Tuple} with the specified values + */ + public static Tuple of(final L left, final M mid, final R right) { + return new Tuple<>(left, mid, right); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + Tuple tuple = (Tuple) object; + return Objects.equals(mid, tuple.mid) && Objects.equals(left, tuple.left) && Objects.equals(right, tuple.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, mid, right); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/TypeUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/TypeUtils.java new file mode 100644 index 000000000..8e3b3dc1a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/TypeUtils.java @@ -0,0 +1,60 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Arrays; +import java.util.Locale; + +public class TypeUtils { + + private TypeUtils() {} + + /** + * Checks if the provided object is of the specified type. + * If not, throws an IllegalArgumentException with a detailed message. + * + * @param object The object to check. + * @param expectedType The expected class type. + * @param The type parameter for expectedType. + * @return The object cast to the expected type if it matches. + * @throws IllegalArgumentException if the object's type does not match the expected type. + */ + public static T checkType(Object object, Class expectedType) { + if (!expectedType.isInstance(object)) { + throw new IllegalArgumentException("Expected type: " + expectedType.getName() + + ", but got: " + (object == null ? "null" : object.getClass().getName())); + } + return expectedType.cast(object); + } + + public static Object castBasicTypes(String value, String type) { + return switch (type.toLowerCase(Locale.ENGLISH)) { + case "boolean" -> Boolean.parseBoolean(value); + case "byte" -> Byte.parseByte(value); + case "short" -> Short.parseShort(value); + case "int", "integer" -> Integer.parseInt(value); + case "long" -> Long.parseLong(value); + case "float" -> Float.parseFloat(value); + case "double" -> Double.parseDouble(value); + case "char" -> value.charAt(0); + case "string" -> value; + case "intarray" -> { + String[] split = splitArrayValue(value); + yield Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); + } + case "bytearray" -> { + String[] split = splitArrayValue(value); + byte[] bytes = new byte[split.length]; + for (int i = 0; i < split.length; i++){ + bytes[i] = Byte.parseByte(split[i]); + } + yield bytes; + } + default -> throw new IllegalStateException("Unsupported type: " + type.toLowerCase(Locale.ENGLISH)); + }; + } + + private static String[] splitArrayValue(String value) { + return value.substring(value.indexOf('[') + 1, value.lastIndexOf(']')) + .replaceAll("\\s", "") + .split(","); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java new file mode 100644 index 000000000..1f4e3c481 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -0,0 +1,83 @@ +package net.momirealms.craftengine.core.util; + +public class VersionHelper { + private static float version; + private static boolean mojmap; + private static boolean folia; + + public static void init(String serverVersion) { + String[] split = serverVersion.split("\\."); + version = Float.parseFloat(split[1] + "." + (split.length == 3 ? split[2] : "0")); + checkMojMap(); + checkFolia(); + } + + public static float version() { + return version; + } + + private static void checkMojMap() { + // Check if the server is Mojmap + try { + Class.forName("net.minecraft.network.protocol.game.ClientboundBossEventPacket"); + mojmap = true; + } catch (ClassNotFoundException ignored) { + } + } + + private static void checkFolia() { + try { + Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); + folia = true; + } catch (ClassNotFoundException ignored) { + } + } + + public static boolean isFolia() { + return folia; + } + + public static boolean isMojmap() { + return mojmap; + } + + public static boolean isVersionNewerThan1_20_5() { + return version >= 20.49f; + } + + public static boolean isVersionNewerThan1_20_4() { + return version >= 20.39f; + } + + public static boolean isVersionNewerThan1_19_4() { + return version >= 19.39f; + } + + public static boolean isVersionNewerThan1_20_2() { + return version >= 20.19f; + } + + public static boolean isVersionNewerThan1_20() { + return version >= 20f; + } + + public static boolean isVersionNewerThan1_21_4() { + return version >= 21.39f; + } + + public static boolean isVersionNewerThan1_21_3() { + return version >= 21.29f; + } + + public static boolean isVersionNewerThan1_21_2() { + return version >= 21.19f; + } + + public static boolean isVersionNewerThan1_21() { + return version >= 21f; + } + + public static boolean isVersionNewerThan1_20_3() { + return version >= 20.29f; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/YamlUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/YamlUtils.java new file mode 100644 index 000000000..0f60750c6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/YamlUtils.java @@ -0,0 +1,106 @@ +package net.momirealms.craftengine.core.util; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import dev.dejvokep.boostedyaml.block.implementation.Section; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class YamlUtils { + + private YamlUtils() {} + + public static Map sectionToMap(final Section section) { + Map map = new LinkedHashMap<>(); + sectionToMap(section, map); + return map; + } + + private static void sectionToMap(final Section section, final Map map) { + for (Map.Entry entry : section.getStringRouteMappedValues(false).entrySet()) { + Object value = entry.getValue(); + if (value instanceof Section inner) { + HashMap newMap = new LinkedHashMap<>(); + map.put(entry.getKey(), newMap); + sectionToMap(inner, newMap); + } else { + if (value instanceof String str && !str.isEmpty()) { + char first = str.charAt(0); + if (first == '(') { + int second = str.indexOf(')', 1); + if (second != -1 && second + 1 + 1 < str.length()) { + char space = str.charAt(second + 1); + if (space == ' ') { + String castType = str.substring(1, second); + String castValue = str.substring(second + 2); + map.put(entry.getKey(), TypeUtils.castBasicTypes(castValue, castType)); + continue; + } + } + } + } + map.put(entry.getKey(), value); + } + } + } + + public static JsonObject sectionToJson(final Section section) { + JsonObject json = new JsonObject(); + sectionToJson(section, json); + return json; + } + + private static void sectionToJson(final Section section, final JsonObject json) { + for (Map.Entry entry : section.getStringRouteMappedValues(false).entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (value instanceof Section inner) { + JsonObject innerObject = new JsonObject(); + json.add(key, innerObject); + sectionToJson(inner, innerObject); + } else if (value instanceof List list) { + JsonArray array = new JsonArray(); + json.add(key, array); + for (Object o : list) { + setJsonArray(array, o); + } + } else { + setJsonProperty(json, key, value); + } + } + } + + public static JsonObject mapToJson(final Map map) { + return GsonHelper.get().toJsonTree(map).getAsJsonObject(); + } + + private static void setJsonArray(final JsonArray array, final Object value) { + if (value instanceof Map map) { + JsonObject jsonObject = GsonHelper.get().toJsonTree(map).getAsJsonObject(); + array.add(jsonObject); + } else if (value instanceof Number number) { + array.add(number); + } else if (value instanceof Boolean bool) { + array.add(bool); + } else if (value instanceof Character character) { + array.add(character); + } else { + array.add(value.toString()); + } + } + + private static void setJsonProperty(final JsonObject json, final String key, final Object value) { + if (value instanceof Number number) { + json.addProperty(key, number); + } else if (value instanceof Boolean bool) { + json.addProperty(key, bool); + } else if (value instanceof Character character) { + json.addProperty(key, character); + } else { + json.addProperty(key, value.toString()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ZipUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ZipUtils.java new file mode 100644 index 000000000..82ed56c37 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ZipUtils.java @@ -0,0 +1,182 @@ +package net.momirealms.craftengine.core.util; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.FileTime; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class ZipUtils { + + private ZipUtils() {} + + /* + * Local file header + * Offset Bytes Description + * 0 4 Local file header signature = 0x04034b50 (PK♥♦ or "PK\3\4") + * 4 2 Version needed to extract (minimum) + * 6 2 General purpose bit flag + * 8 2 Compression method; e.g. none = 0, DEFLATE = 8 (or "\0x08\0x00") + * 10 2 File last modification time + * 12 2 File last modification date + * 14 4 CRC-32 of uncompressed data + * 18 4 Compressed size (or 0xffffffff for ZIP64) + * 22 4 Uncompressed size (or 0xffffffff for ZIP64) + * 26 2 File name length (n) + * 28 2 Extra field length (m) + * 30 n File name + * 30+n m Extra field + */ + + /* + * Central directory file header (CDFH) + * Offset Bytes Description + * 0 4 Central directory file header signature = 0x02014b50 + * 4 2 Version made by + * 6 2 Version needed to extract (minimum) + * 8 2 General purpose bit flag + * 10 2 Compression method + * 12 2 File last modification time + * 14 2 File last modification date + * 16 4 CRC-32 of uncompressed data + * 20 4 Compressed size (or 0xffffffff for ZIP64) + * 24 4 Uncompressed size (or 0xffffffff for ZIP64) + * 28 2 File name length (n) + * 30 2 Extra field length (m) + * 32 2 File comment length (k) + * 34 2 Disk number where file starts (or 0xffff for ZIP64) + * 36 2 Internal file attributes + * 38 4 External file attributes + * 42 4 Relative offset of local file header (or 0xffffffff for ZIP64). This is the number of bytes between the start of the first disk on which the file occurs, and the start of the local file header. This allows software reading the central directory to locate the position of the file inside the ZIP file. + * 46 n File name + * 46+n m Extra field + * 46+n+m k File comment + */ + + /** + * End of central directory record (EOCD) + * Offset Bytes Description[33] + * 0 4 End of central directory signature = 0x06054b50 + * 4 2 Number of this disk (or 0xffff for ZIP64) + * 6 2 Disk where central directory starts (or 0xffff for ZIP64) + * 8 2 Number of central directory records on this disk (or 0xffff for ZIP64) + * 10 2 Total number of central directory records (or 0xffff for ZIP64) + * 12 4 Size of central directory (bytes) (or 0xffffffff for ZIP64) + * 16 4 Offset of start of central directory, relative to start of archive (or 0xffffffff for ZIP64) + * 20 2 Comment length (n) + * 22 n Comment + */ + private static final FileTime ZERO = FileTime.fromMillis(0); + private static final byte[] FILE_HEADER = { (byte) 0x50, (byte) 0x4B, (byte) 0x03, (byte) 0x04 }; + private static final byte[] CDF_HEADER = { (byte) 0x50, (byte) 0x4B, (byte) 0x01, (byte) 0x02 }; + private static final byte[] EOCD = { (byte) 0x50, (byte) 0x4B, (byte) 0x05, (byte) 0x06 }; + private static final int EOCD_SIGNATURE = 0x504b0506; + + public static void zipDirectory(Path folderPath, Path zipFilePath) throws IOException { + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath.toFile()))) { + try (Stream paths = Files.walk(folderPath)) { + for (Path path : (Iterable) paths::iterator) { + if (Files.isDirectory(path)) { + continue; + } + String zipEntryName = folderPath.relativize(path).toString().replace("\\", "/"); + ZipEntry zipEntry = new ZipEntry(zipEntryName); + try (InputStream is = Files.newInputStream(path)) { + addToZip(zipEntry, is, zos); + } + } + } + } + } + + public static void protect(Path path) { + try (RandomAccessFile raf = new RandomAccessFile(path.toFile(), "rw")) { + long eocdOffset = findEndOfCentralDirectory(raf); + if (eocdOffset == -1) { + throw new IllegalArgumentException("Central Directory End Record not found!"); + } + } catch (IOException e) { + throw new RuntimeException("Error modify the zip file", e); + } + } + + private static long findEndOfCentralDirectory(RandomAccessFile raf) throws IOException { + long fileLength = raf.length(); + for (long i = fileLength - 22; i >= 0; i--) { + raf.seek(i); + if (raf.readInt() == EOCD_SIGNATURE) { + return i; + } + } + return -1; + } + + public static void breakHeader(Path file) { + try (RandomAccessFile randomAccessFile = new RandomAccessFile(file.toFile(), "rw")) { + long position = findZipEntryHeader(randomAccessFile); + if (position == -1) { + throw new RuntimeException("ZIP header signature not found."); + } + randomAccessFile.seek(position); + randomAccessFile.write(new byte[] { (byte) 0x99, (byte) 0x99, (byte) 0x99, (byte) 0x99 }); + randomAccessFile.seek(position + 4); + randomAccessFile.write(new byte[] { (byte) 0xFF, (byte) 0xFF }); + } catch (IOException e) { + throw new RuntimeException("Error break file header", e); + } + } + + public static void modifyEOCD(RandomAccessFile raf, long location) throws IOException { + raf.seek(location); + byte[] eocdRecord = new byte[]{ + (byte) 0x50, (byte) 0x4B, (byte) 0x05, (byte) 0x06, // EOCD Signature (0x06054b50) + (byte) 0xff, (byte) 0xff, // Disk number = 0xFFFF + 0x04, 0x00, // Disk with start of central directory + 0x00, 0x00, // Number of entries on this disk + 0x00, 0x00, // Total number of entries in the central directory = 0 + 0x0f, 0x00, 0x00, 0x00, // Size of the central directory + 0x04, 0x00, 0x00, 0x00 // Offset to the central directory + }; + raf.write(eocdRecord); + } + + private static long findZipEntryHeader(RandomAccessFile randomAccessFile) throws IOException { + long fileLength = randomAccessFile.length(); + for (long i = 0; i < fileLength - FILE_HEADER.length; i++) { + randomAccessFile.seek(i); + byte[] buffer = new byte[FILE_HEADER.length]; + randomAccessFile.read(buffer); + if (compareArrays(buffer, FILE_HEADER)) { + return i; + } + } + return -1; + } + + private static boolean compareArrays(byte[] array1, byte[] array2) { + if (array1.length != array2.length) { + return false; + } + for (int i = 0; i < array1.length; i++) { + if (array1[i] != array2[i]) { + return false; + } + } + return true; + } + + public static void addToZip(ZipEntry zipEntry, InputStream is, ZipOutputStream zos) throws IOException { + zos.putNextEntry(zipEntry); + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = is.read(buffer)) != -1) { + zos.write(buffer, 0, bytesRead); + } + zos.closeEntry(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java new file mode 100644 index 000000000..3a70fd0e4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java @@ -0,0 +1,88 @@ +package net.momirealms.craftengine.core.util.context; + +import org.jetbrains.annotations.Contract; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; + +public class ContextHolder { + private final Map, Object> params; + + public ContextHolder(Map, Object> params) { + this.params = params; + } + + public boolean has(ContextKey key) { + return params.containsKey(key); + } + + @SuppressWarnings("unchecked") + public T getOrThrow(ContextKey parameter) { + T object = (T) this.params.get(parameter); + if (object == null) { + throw new NoSuchElementException(parameter.id().toString()); + } else { + return object; + } + } + + @SuppressWarnings("unchecked") + @Nullable + public Optional getOptional(ContextKey parameter) { + return Optional.ofNullable((T) this.params.get(parameter)); + } + + @SuppressWarnings("unchecked") + @Nullable + @Contract("_,!null->!null; _,_->_") + public T getOrDefault(ContextKey parameter, @Nullable T defaultValue) { + return (T) this.params.getOrDefault(parameter, defaultValue); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private final Map, Object> params = new HashMap<>(); + + public Builder() {} + + public Builder withParameter(ContextKey parameter, T value) { + this.params.put(parameter, value); + return this; + } + + public Builder withOptionalParameter(ContextKey parameter, @Nullable T value) { + if (value == null) { + this.params.remove(parameter); + } else { + this.params.put(parameter, value); + } + return this; + } + + @SuppressWarnings("unchecked") + public T getParameterOrThrow(ContextKey parameter) { + T object = (T) this.params.get(parameter); + if (object == null) { + throw new NoSuchElementException(parameter.id().toString()); + } else { + return object; + } + } + + @SuppressWarnings("unchecked") + public Optional getOptionalParameter(ContextKey parameter) { + return Optional.ofNullable((T) this.params.get(parameter)); + } + + public ContextHolder build() { + return new ContextHolder(this.params); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java new file mode 100644 index 000000000..04f7d264e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.util.context; + +import net.momirealms.craftengine.core.util.Key; + +public class ContextKey { + private final Key id; + + public ContextKey(Key id) { + this.id = id; + } + + public Key id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java b/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java new file mode 100644 index 000000000..ab97a1da9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.util.os; + +import java.util.Locale; + +public enum Architecture { + X64(true), + X86(false), + ARM64(true), + ARM32(false), + PPC64LE(true), + RISCV64(true); + + static final Architecture current; + final boolean is64Bit; + + Architecture(boolean is64Bit) { + this.is64Bit = is64Bit; + } + + public String getNativePath() { + return name().toLowerCase(Locale.ENGLISH); + } + + public static Architecture get() { + return current; + } + + static { + String osArch = System.getProperty("os.arch"); + boolean is64Bit = osArch.contains("64") || osArch.startsWith("armv8"); + if (!osArch.startsWith("arm") && !osArch.startsWith("aarch")) { + if (osArch.startsWith("ppc")) { + if (!"ppc64le".equals(osArch)) { + throw new UnsupportedOperationException("Only PowerPC 64 LE is supported."); + } + current = PPC64LE; + } else if (osArch.startsWith("riscv")) { + if (!"riscv64".equals(osArch)) { + throw new UnsupportedOperationException("Only RISC-V 64 is supported."); + } + current = RISCV64; + } else { + current = is64Bit ? X64 : X86; + } + } else { + current = is64Bit ? ARM64 : ARM32; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java new file mode 100644 index 000000000..fd864193d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.util.os; + +public enum Platform { + FREEBSD("FreeBSD", "freebsd"), + LINUX("Linux", "linux"), + MACOS("macOS", "macos"), + WINDOWS("Windows", "windows"); + + private static final Platform current; + private final String name; + private final String nativePath; + + Platform(String name, String nativePath) { + this.name = name; + this.nativePath = nativePath; + } + + public String getName() { + return this.name; + } + + public String getNativePath() { + return nativePath; + } + + public static Platform get() { + return current; + } + + static { + String osName = System.getProperty("os.name"); + if (osName.startsWith("Windows")) { + current = WINDOWS; + } else if (osName.startsWith("FreeBSD")) { + current = FREEBSD; + } else if (!osName.startsWith("Linux") && !osName.startsWith("SunOS") && !osName.startsWith("Unix")) { + if (!osName.startsWith("Mac OS X") && !osName.startsWith("Darwin")) { + throw new LinkageError("Unknown platform: " + osName); + } + current = MACOS; + } else { + current = LINUX; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockHitResult.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockHitResult.java new file mode 100644 index 000000000..d20cffe34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockHitResult.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.Direction; + +public class BlockHitResult extends HitResult { + private final Direction direction; + private final BlockPos blockPos; + private final boolean miss; + private final boolean inside; + private final boolean worldBorderHit; + + public static BlockHitResult miss(Vec3d pos, Direction side, BlockPos blockPos) { + return new BlockHitResult(true, pos, side, blockPos, false, false); + } + + public BlockHitResult(Vec3d pos, Direction side, BlockPos blockPos, boolean insideBlock) { + this(false, pos, side, blockPos, insideBlock, false); + } + + public BlockHitResult(Vec3d pos, Direction side, BlockPos blockPos, boolean insideBlock, boolean againstWorldBorder) { + this(false, pos, side, blockPos, insideBlock, againstWorldBorder); + } + + private BlockHitResult(boolean missed, Vec3d pos, Direction side, BlockPos blockPos, boolean insideBlock, boolean againstWorldBorder) { + super(pos); + this.miss = missed; + this.direction = side; + this.blockPos = blockPos; + this.inside = insideBlock; + this.worldBorderHit = againstWorldBorder; + } + + public BlockHitResult withDirection(Direction side) { + return new BlockHitResult(this.miss, this.location, side, this.blockPos, this.inside, this.worldBorderHit); + } + + public BlockHitResult withPosition(BlockPos blockPos) { + return new BlockHitResult(this.miss, this.location, this.direction, blockPos, this.inside, this.worldBorderHit); + } + + public BlockHitResult hitBorder() { + return new BlockHitResult(this.miss, this.location, this.direction, this.blockPos, this.inside, true); + } + + public BlockPos getBlockPos() { + return this.blockPos; + } + + public Direction getDirection() { + return this.direction; + } + + @Override + public HitResult.Type getType() { + return this.miss ? HitResult.Type.MISS : HitResult.Type.BLOCK; + } + + public boolean isInside() { + return this.inside; + } + + public boolean isWorldBorderHit() { + return this.worldBorderHit; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockPos.java new file mode 100644 index 000000000..d5d7a7eb7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockPos.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.Direction; + +public class BlockPos extends Vec3i { + + public BlockPos(int x, int y, int z) { + super(x, y, z); + } + + @Override + public BlockPos relative(Direction direction) { + return switch (direction) { + case UP -> new BlockPos(this.x(), this.y() + 1, this.z()); + case DOWN -> new BlockPos(this.x(), this.y() - 1, this.z()); + case NORTH -> new BlockPos(this.x(), this.y(), this.z() - 1); + case SOUTH -> new BlockPos(this.x(), this.y(), this.z() + 1); + case WEST -> new BlockPos(this.x() - 1, this.y(), this.z()); + case EAST -> new BlockPos(this.x() + 1, this.y(), this.z()); + }; + } + + public static BlockPos of(long packedPos) { + return new BlockPos((int) (packedPos >> 38), (int) ((packedPos << 52) >> 52), (int) ((packedPos << 26) >> 38)); + } + + public BlockPos relative(Direction direction, int i) { + return i == 0 + ? this + : new BlockPos(this.x() + direction.stepX() * i, this.y() + direction.stepY() * i, this.z() + direction.stepZ() * i); + } + + public int toSectionBlockIndex() { + return (y & 15) << 8 | (z & 15) << 4 | x & 15; + } + + public long asLong() { + return asLong(this.x(), this.y(), this.z()); + } + + public static long asLong(int x, int y, int z) { + return (((long) x & (long) 67108863) << 38) | (((long) y & (long) 4095)) | (((long) z & (long) 67108863) << 12); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java new file mode 100644 index 000000000..762c45824 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java @@ -0,0 +1,160 @@ +package net.momirealms.craftengine.core.world; + +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.storage.DefaultRegionFileStorage; +import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public abstract class CEWorld { + public static final String REGION_DIRECTORY = "craftengine"; + protected final World world; + protected final Map loadedChunkMap; + protected final WorldDataStorage worldDataStorage; + protected final ReentrantReadWriteLock loadedChunkMapLock = new ReentrantReadWriteLock(); + protected final WorldExecutor executor; + protected final WorldHeight worldHeightAccessor; + protected final Set updatedSectionPositions = Collections.synchronizedSet(new HashSet<>()); + + private CEChunk lastChunk; + private long lastChunkPos; + + public CEWorld(World world) { + this.world = world; + this.loadedChunkMap = new Long2ObjectOpenHashMap<>(1024, 0.5f); + this.worldDataStorage = new DefaultRegionFileStorage(world.directory().resolve(REGION_DIRECTORY)); + this.executor = new WorldExecutor(this); + this.worldHeightAccessor = world.worldHeight(); + this.lastChunkPos = ChunkPos.INVALID_CHUNK_POS; + } + + public World world() { + return world; + } + + public boolean isChunkLoaded(final long chunkPos) { + this.loadedChunkMapLock.readLock().lock(); + try { + return loadedChunkMap.containsKey(chunkPos); + } finally { + this.loadedChunkMapLock.readLock().unlock(); + } + } + + public void addLoadedChunk(CEChunk chunk) { + this.loadedChunkMapLock.writeLock().lock(); + try { + this.loadedChunkMap.put(chunk.chunkPos().longKey(), chunk); + } finally { + this.loadedChunkMapLock.writeLock().unlock(); + } + } + + public void removeLoadedChunk(CEChunk chunk) { + this.loadedChunkMapLock.writeLock().lock(); + try { + this.loadedChunkMap.remove(chunk.chunkPos().longKey()); + if (this.lastChunk == chunk) { + this.lastChunk = null; + this.lastChunkPos = ChunkPos.INVALID_CHUNK_POS; + } + } finally { + this.loadedChunkMapLock.writeLock().unlock(); + } + } + + @Nullable + public CEChunk getLoadedChunkImmediately(int x, int z) { + if (WorldThread.isWorldThreadFor(this)) { + return this.getChunkAtIfLoadedWorldThread(x, z); + } + long longKey = ChunkPos.asLong(x, z); + this.loadedChunkMapLock.readLock().lock(); + try { + return this.loadedChunkMap.get(longKey); + } finally { + this.loadedChunkMapLock.readLock().unlock(); + } + } + + @Nullable + public CEChunk getChunkAtIfLoadedWorldThread(long chunkPos) { + if (chunkPos == this.lastChunkPos) { + return this.lastChunk; + } + CEChunk chunk = this.loadedChunkMap.get(chunkPos); + if (chunk != null) { + this.lastChunk = chunk; + this.lastChunkPos = chunkPos; + } + return chunk; + } + + @Nullable + public CEChunk getChunkAtIfLoadedWorldThread(int x, int z) { + return getChunkAtIfLoadedWorldThread(ChunkPos.asLong(x, z)); + } + + @Nullable + public CEChunk getChunkAtIfLoaded(int x, int z) { + if (!WorldThread.isWorldThreadFor(this)) { + return CompletableFuture.supplyAsync(() -> this.getChunkAtIfLoaded(x, z), this.executor).join(); + } + long chunkPos = ChunkPos.asLong(x, z); + return this.getChunkAtIfLoadedWorldThread(chunkPos); + } + + public WorldHeight worldHeight() { + return worldHeightAccessor; + } + + public ImmutableBlockState getBlockStateAtIfLoaded(int x, int y, int z) { + CEChunk chunk = getChunkAtIfLoaded(x >> 4, z >> 4); + if (chunk == null) { + return null; + } + return chunk.getBlockState(x, y, z); + } + + public ImmutableBlockState getBlockStateAtIfLoaded(BlockPos blockPos) { + CEChunk chunk = getChunkAtIfLoaded(blockPos.x() >> 4, blockPos.z() >> 4); + if (chunk == null) { + return null; + } + return chunk.getBlockState(blockPos); + } + + public boolean setBlockStateAtIfLoaded(BlockPos blockPos, ImmutableBlockState blockState) { + if (worldHeightAccessor.isOutsideBuildHeight(blockPos)) { + return false; + } + CEChunk chunk = getChunkAtIfLoaded(blockPos.x() >> 4, blockPos.z() >> 4); + if (chunk == null) { + return false; + } + chunk.setBlockState(blockPos, blockState); + return true; + } + + public WorldDataStorage worldDataStorage() { + return worldDataStorage; + } + + public void sectionLightUpdated(SectionPos pos) { + this.updatedSectionPositions.add(pos); + } + + public void sectionLightUpdated(Set pos) { + this.updatedSectionPositions.addAll(pos); + } + + public abstract void tick(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java new file mode 100644 index 000000000..f90eaaad4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.world; + +public class ChunkPos { + public static final long INVALID_CHUNK_POS = asLong(1875066, 1875066); + public final int x; + public final int z; + public final long longKey; + + public ChunkPos(int x, int z) { + this.x = x; + this.z = z; + this.longKey = asLong(this.x, this.z); + } + + public ChunkPos(BlockPos pos) { + this.x = SectionPos.blockToSectionCoord(pos.x()); + this.z = SectionPos.blockToSectionCoord(pos.z()); + this.longKey = asLong(this.x, this.z); + } + + public ChunkPos(long pos) { + this.x = (int) pos; + this.z = (int) (pos >> 32); + this.longKey = asLong(this.x, this.z); + } + + public int x() { + return x; + } + + public int z() { + return z; + } + + public int regionX() { + return this.x >> 5; + } + + public int regionLocalX() { + return this.x & 31; + } + + public int regionZ() { + return this.z >> 5; + } + + public int regionLocalZ() { + return this.z & 31; + } + + public long longKey() { + return longKey; + } + + public static long asLong(int chunkX, int chunkZ) { + return (long) chunkX & 4294967295L | ((long) chunkZ & 4294967295L) << 32; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java b/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java new file mode 100644 index 000000000..4c1d08e71 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.entity.Entity; + +public abstract class HitResult { + protected final Vec3d location; + + protected HitResult(Vec3d pos) { + this.location = pos; + } + + public double distanceTo(Entity entity) { + double d = this.location.x() - entity.x(); + double e = this.location.y() - entity.y(); + double f = this.location.z() - entity.z(); + return d * d + e * e + f * f; + } + + public abstract HitResult.Type getType(); + + public Vec3d getLocation() { + return this.location; + } + + public static enum Type { + MISS, + BLOCK, + ENTITY; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/Position.java b/core/src/main/java/net/momirealms/craftengine/core/world/Position.java new file mode 100644 index 000000000..41a638cad --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/Position.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.world; + +public interface Position { + + double x(); + + double y(); + + double z(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/SectionPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/SectionPos.java new file mode 100644 index 000000000..3897374da --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/SectionPos.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.world; + +public class SectionPos extends Vec3i { + + public SectionPos(int x, int y, int z) { + super(x, y, z); + } + + public static int blockToSectionCoord(int coord) { + return coord >> 4; + } + + public static SectionPos of(BlockPos pos) { + return new SectionPos(pos.x() >> 4, pos.y() >> 4, pos.z() >> 4); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/Vec3d.java b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3d.java new file mode 100644 index 000000000..329c79950 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3d.java @@ -0,0 +1,72 @@ +package net.momirealms.craftengine.core.world; + +public class Vec3d implements Position { + private final double x; + private final double y; + private final double z; + + public Vec3d(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public static Vec3d atLowerCornerOf(Vec3i vec) { + return new Vec3d(vec.x(), vec.y(), vec.z()); + } + + public static Vec3d atLowerCornerWithOffset(Vec3i vec, double deltaX, double deltaY, double deltaZ) { + return new Vec3d((double) vec.x() + deltaX, (double) vec.y() + deltaY, (double) vec.z() + deltaZ); + } + + public static Vec3d atCenterOf(Vec3i vec) { + return atLowerCornerWithOffset(vec, 0.5, 0.5, 0.5); + } + + public static Vec3d atBottomCenterOf(Vec3i vec) { + return atLowerCornerWithOffset(vec, 0.5, 0.0, 0.5); + } + + public static Vec3d upFromBottomCenterOf(Vec3i vec, double deltaY) { + return atLowerCornerWithOffset(vec, 0.5, deltaY, 0.5); + } + + @Override + public double x() { + return x; + } + + @Override + public double y() { + return y; + } + + @Override + public double z() { + return z; + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Vec3d vec3d)) return false; + return Double.compare(x, vec3d.x) == 0 && Double.compare(y, vec3d.y) == 0 && Double.compare(z, vec3d.z) == 0; + } + + @Override + public int hashCode() { + int result = Double.hashCode(x); + result = 31 * result + Double.hashCode(y); + result = 31 * result + Double.hashCode(z); + return result; + } + + @Override + public String toString() { + return "Vec3d{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/Vec3i.java b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3i.java new file mode 100644 index 000000000..7d49c6aaa --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3i.java @@ -0,0 +1,95 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.Direction; + +public class Vec3i implements Comparable { + public static final Vec3i ZERO = new Vec3i(0, 0, 0); + protected int x; + protected int y; + protected int z; + + public Vec3i(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public int x() { + return this.x; + } + + public int y() { + return this.y; + } + + public int z() { + return this.z; + } + + public Vec3i offset(int x, int y, int z) { + return x == 0 && y == 0 && z == 0 ? this : new Vec3i(this.x() + x, this.y() + y, this.z() + z); + } + + protected Vec3i setX(int x) { + this.x = x; + return this; + } + + protected Vec3i setY(int y) { + this.y = y; + return this; + } + + protected Vec3i setZ(int z) { + this.z = z; + return this; + } + + @Override + public boolean equals(Object object) { + return this == object || object instanceof Vec3i vec3i && this.x() == vec3i.x() && this.y() == vec3i.y() && this.z() == vec3i.z(); + } + + @Override + public int hashCode() { + return (this.y() + this.z() * 31) * 31 + this.x(); + } + + @Override + public String toString() { + return "Vec3i{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } + + public Vec3i relative(Direction direction) { + return this.relative(direction, 1); + } + + public Vec3i relative(Direction direction, int distance) { + return distance == 0 + ? this + : new Vec3i( + this.x() + direction.stepX() * distance, this.y() + direction.stepY() * distance, this.z() + direction.stepZ() * distance + ); + } + + public Vec3i multiply(int scale) { + if (scale == 1) { + return this; + } else { + return scale == 0 ? ZERO : new Vec3i(this.x() * scale, this.y() * scale, this.z() * scale); + } + } + + @Override + public int compareTo(Vec3i vec3i) { + if (this.y() == vec3i.y()) { + return this.z() == vec3i.z() ? this.x() - vec3i.x() : this.z() - vec3i.z(); + } else { + return this.y() - vec3i.y(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/World.java b/core/src/main/java/net/momirealms/craftengine/core/world/World.java new file mode 100644 index 000000000..08fa8fff5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/World.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.UUID; + +public interface World { + + Object getHandle(); + + WorldHeight worldHeight(); + + WorldBlock getBlockAt(int x, int y, int z); + + default WorldBlock getBlockAt(final BlockPos pos) { + return getBlockAt(pos.x(), pos.y(), pos.z()); + } + + String name(); + + Path directory(); + + UUID uuid(); + + void dropItemNaturally(Vec3d location, Item item); + + void playBlockSound(Vec3d location, Key sound, float volume, float pitch); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java new file mode 100644 index 000000000..4da8df826 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; + +public interface WorldBlock { + + default boolean canBeReplaced(BlockPlaceContext blockPlaceContext) { + return false; + } + + default boolean isWaterSource(BlockPlaceContext blockPlaceContext) { + return false; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldExecutor.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldExecutor.java new file mode 100644 index 000000000..896a6fc9f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldExecutor.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.world; + +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class WorldExecutor implements Executor { + + private final ExecutorService threadPool; + + public WorldExecutor(CEWorld world) { + this.threadPool = Executors.newSingleThreadExecutor(r -> new WorldThread(r, "CEWorld-Thread-" + world.world().name(), world)); + } + + @Override + public void execute(@NotNull Runnable command) { + this.threadPool.execute(command); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldHeight.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldHeight.java new file mode 100644 index 000000000..c5486a74f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldHeight.java @@ -0,0 +1,74 @@ +package net.momirealms.craftengine.core.world; + +public interface WorldHeight { + + int getHeight(); + + int getMinBuildHeight(); + + default int getMaxBuildHeight() { + return this.getMinBuildHeight() + this.getHeight(); + } + + default int getSectionsCount() { + return this.getMaxSection() - this.getMinSection(); + } + + default int getMinSection() { + return SectionPos.blockToSectionCoord(this.getMinBuildHeight()); + } + + default int getMaxSection() { + return SectionPos.blockToSectionCoord(this.getMaxBuildHeight() - 1) + 1; + } + + default boolean isOutsideBuildHeight(BlockPos pos) { + return this.isOutsideBuildHeight(pos.y()); + } + + default boolean isOutsideBuildHeight(int y) { + return y < this.getMinBuildHeight() || y >= this.getMaxBuildHeight(); + } + + default int getSectionIndex(int y) { + return this.getSectionIndexFromSectionY(SectionPos.blockToSectionCoord(y)); + } + + default int getSectionIndexFromSectionY(int coord) { + return coord - this.getMinSection(); + } + + default int getSectionYFromSectionIndex(int index) { + return index + this.getMinSection(); + } + + static WorldHeight create(final int bottomY, final int height) { + return new WorldHeightImpl(bottomY, height); + } + + class WorldHeightImpl implements WorldHeight { + private final int bottomY; + private final int height; + private final int minSection; + public WorldHeightImpl(final int bottomY, final int height) { + this.bottomY = bottomY; + this.height = height; + this.minSection = SectionPos.blockToSectionCoord(this.getMinBuildHeight()); + } + + @Override + public int getHeight() { + return height; + } + + @Override + public int getMinBuildHeight() { + return bottomY; + } + + @Override + public int getMinSection() { + return this.minSection; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java new file mode 100644 index 000000000..90a9ec7fc --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.plugin.Reloadable; + +import java.util.UUID; + +public interface WorldManager extends Reloadable { + + CEWorld getWorld(UUID uuid); + + void delayedLoad(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldThread.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldThread.java new file mode 100644 index 000000000..3cab31d16 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldThread.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.world; + +public class WorldThread extends Thread { + + private final CEWorld world; + + public WorldThread(Runnable target, String name, CEWorld world) { + super(target, name); + this.world = world; + } + + public static boolean isWorldThreadFor(CEWorld world) { + if (Thread.currentThread() instanceof WorldThread worldThread) { + return worldThread.world == world; + } + return false; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ArrayPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ArrayPalette.java new file mode 100644 index 000000000..94b254c65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ArrayPalette.java @@ -0,0 +1,120 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class ArrayPalette implements Palette { + private final IndexedIterable idList; + private final T[] array; + private final PaletteResizeListener listener; + private final int indexBits; + private int size; + + @SuppressWarnings("unchecked") + private ArrayPalette(IndexedIterable idList, int bits, PaletteResizeListener listener, List list) { + this.idList = idList; + this.array = (T[]) new Object[1 << bits]; + this.indexBits = bits; + this.listener = listener; + + for (int i = 0; i < list.size(); ++i) { + this.array[i] = list.get(i); + } + + this.size = list.size(); + } + + private ArrayPalette(IndexedIterable idList, T[] array, PaletteResizeListener listener, int indexBits, int size) { + this.idList = idList; + this.array = array; + this.listener = listener; + this.indexBits = indexBits; + this.size = size; + } + + public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list) { + return new ArrayPalette<>(idList, bits, listener, list); + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + this.size = buf.readVarInt(); + for(int i = 0; i < this.size; ++i) { + this.array[i] = this.idList.getOrThrow(buf.readVarInt()); + } + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + buf.writeVarInt(this.size); + for(int i = 0; i < this.size; ++i) { + buf.writeVarInt(this.idList.getRawId(this.array[i])); + } + } + + @Override + public int index(T object) { + int i; + for(i = 0; i < this.size; ++i) { + if (this.array[i] == object) { + return i; + } + } + + i = this.size; + if (i < this.array.length) { + this.array[i] = object; + ++this.size; + return i; + } else { + return this.listener.onResize(this.indexBits + 1, object); + } + } + + @Override + public boolean hasAny(Predicate predicate) { + for(int i = 0; i < this.size; ++i) { + if (predicate.test(this.array[i])) { + return true; + } + } + + return false; + } + + @Override + public T get(int id) { + if (id >= 0 && id < this.size) { + return this.array[id]; + } else { + throw new RuntimeException("Missing Palette entry for index " + id + "."); + } + } + + @Override + public int getSize() { + return this.size; + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + return new ArrayPalette<>(this.idList, this.array.clone(), resizeListener, this.indexBits, this.size); + } + + @Override + public void remap(Function function) { + for (int i = 0; i < this.array.length; i++) { + if (this.array[i] == null) return; + this.array[i] = function.apply(this.array[i]); + } + } + + @Override + public boolean canRemap() { + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/BiMapPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/BiMapPalette.java new file mode 100644 index 000000000..a9d27c98b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/BiMapPalette.java @@ -0,0 +1,113 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import net.momirealms.craftengine.core.util.Int2ObjectBiMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class BiMapPalette implements Palette { + private final IndexedIterable idList; + private final Int2ObjectBiMap map; + private final PaletteResizeListener listener; + private final int indexBits; + + public BiMapPalette(IndexedIterable idList, int bits, PaletteResizeListener listener, List entries) { + this(idList, bits, listener); + entries.forEach(this.map::add); + } + + public BiMapPalette(IndexedIterable idList, int indexBits, PaletteResizeListener listener) { + this(idList, indexBits, listener, Int2ObjectBiMap.create(1 << indexBits)); + } + + private BiMapPalette(IndexedIterable idList, int indexBits, PaletteResizeListener listener, Int2ObjectBiMap map) { + this.idList = idList; + this.indexBits = indexBits; + this.listener = listener; + this.map = map; + } + + public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List entries) { + return new BiMapPalette<>(idList, bits, listener, entries); + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + this.map.clear(); + int i = buf.readVarInt(); + for (int j = 0; j < i; ++j) { + this.map.add(this.idList.getOrThrow(buf.readVarInt())); + } + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + int i = this.getSize(); + buf.writeVarInt(i); + for (int j = 0; j < i; ++j) { + buf.writeVarInt(this.idList.getRawId(this.map.get(j))); + } + } + + @Override + public int index(T object) { + int i = this.map.getRawId(object); + if (i == -1) { + i = this.map.add(object); + if (i >= 1 << this.indexBits) { + i = this.listener.onResize(this.indexBits + 1, object); + } + } + return i; + } + + @Override + public boolean hasAny(Predicate predicate) { + for(int i = 0; i < this.getSize(); ++i) { + if (predicate.test(this.map.get(i))) { + return true; + } + } + return false; + } + + @Override + public T get(int id) { + T object = this.map.get(id); + if (object == null) { + throw new RuntimeException("Missing Palette entry for index " + id + "."); + } else { + return object; + } + } + + public List getElements() { + ArrayList arrayList = new ArrayList<>(); + this.map.iterator().forEachRemaining(arrayList::add); + return arrayList; + } + + @Override + public int getSize() { + return this.map.size(); + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + return new BiMapPalette<>(this.idList, this.indexBits, resizeListener, this.map.copy()); + } + + @Override + public void remap(Function function) { + this.map.remapValues(function); + } + + @Override + public boolean canRemap() { + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java new file mode 100644 index 000000000..5423ff1b1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java @@ -0,0 +1,132 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.world.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class CEChunk { + private boolean loaded; + private final CEWorld world; + private final ChunkPos chunkPos; + private final CESection[] sections; + private final WorldHeight worldHeightAccessor; + private final List entities; + + public CEChunk(CEWorld world, ChunkPos chunkPos) { + this.world = world; + this.chunkPos = chunkPos; + this.worldHeightAccessor = world.worldHeight(); + this.sections = new CESection[this.worldHeightAccessor.getSectionsCount()]; + this.entities = new ArrayList<>(); + this.fillEmptySection(); + } + + public CEChunk(CEWorld world, ChunkPos chunkPos, CESection[] sections, List entities) { + this.world = world; + this.chunkPos = chunkPos; + this.entities = entities; + this.worldHeightAccessor = world.worldHeight(); + int sectionCount = this.worldHeightAccessor.getSectionsCount(); + this.sections = new CESection[sectionCount]; + if (sections != null) { + for (CESection section : sections) { + if (section != null) { + int index = sectionIndex(section.sectionY()); + this.sections[index] = section; + } + } + } + this.fillEmptySection(); + } + + private void fillEmptySection() { + for (int i = 0; i < sections.length; ++i) { + if (sections[i] == null) { + sections[i] = new CESection(world.worldHeight().getSectionYFromSectionIndex(i), + new PalettedContainer<>(null, EmptyBlock.INSTANCE.getDefaultState(), PalettedContainer.PaletteProvider.CUSTOM_BLOCK_STATE)); + } + } + } + + public void setBlockState(BlockPos pos, ImmutableBlockState state) { + this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + public void setBlockState(int x, int y, int z, ImmutableBlockState state) { + int index = sectionIndex(SectionPos.blockToSectionCoord(y)); + CESection section = this.sections[index]; + if (section == null) { + return; + } + section.setBlockState((y & 15) << 8 | (z & 15) << 4 | x & 15, state); + } + + @Nullable + public ImmutableBlockState getBlockState(BlockPos pos) { + return getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Nullable + public ImmutableBlockState getBlockState(int x, int y, int z) { + int index = sectionIndex(SectionPos.blockToSectionCoord(y)); + CESection section = this.sections[index]; + if (section == null) { + return null; + } + return section.getBlockState((y & 15) << 8 | (z & 15) << 4 | x & 15); + } + + @Nullable + public CESection sectionByIndex(int index) { + return this.sections[index]; + } + + @Nullable + public CESection sectionById(int sectionId) { + return this.sections[sectionIndex(sectionId)]; + } + + public int sectionIndex(int sectionId) { + return sectionId - this.worldHeightAccessor.getMinSection(); + } + + public int sectionY(int sectionIndex) { + return sectionIndex + this.worldHeightAccessor.getMinSection(); + } + + @NotNull + public CEWorld world() { + return world; + } + + @NotNull + public ChunkPos chunkPos() { + return chunkPos; + } + + @NotNull + public CESection[] sections() { + return sections; + } + + public boolean isLoaded() { + return loaded; + } + + public void load() { + if (this.loaded) return; + this.world.addLoadedChunk(this); + this.loaded = true; + } + + public void unload() { + if (!this.loaded) return; + this.world.removeLoadedChunk(this); + this.loaded = false; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CESection.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CESection.java new file mode 100644 index 000000000..676968ed2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CESection.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.world.BlockPos; + +public class CESection { + public static final int SECTION_WIDTH = 16; + public static final int SECTION_HEIGHT = 16; + public static final int SECTION_SIZE = SECTION_WIDTH * SECTION_WIDTH * SECTION_HEIGHT; + + private final int sectionY; + private final PalettedContainer statesContainer; + + public CESection(int sectionY, PalettedContainer statesContainer) { + this.sectionY = sectionY; + this.statesContainer = statesContainer; + } + + public void setBlockState(BlockPos pos, ImmutableBlockState state) { + setBlockState(pos.x() & 15, pos.y() & 15, pos.z() & 15, state); + } + + public void setBlockState(int x, int y, int z, ImmutableBlockState state) { + statesContainer.set((y << 4 | z) << 4 | x, state); + } + + public void setBlockState(int index, ImmutableBlockState state) { + statesContainer.set(index, state); + } + + public ImmutableBlockState getBlockState(BlockPos pos) { + return getBlockState(pos.x() & 15, pos.y() & 15, pos.z() & 15); + } + + public ImmutableBlockState getBlockState(int x, int y, int z) { + return statesContainer.get((y << 4 | z) << 4 | x); + } + + public ImmutableBlockState getBlockState(int index) { + return statesContainer.get(index); + } + + public PalettedContainer statesContainer() { + return statesContainer; + } + + public int sectionY() { + return sectionY; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/EmptyPaletteStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/EmptyPaletteStorage.java new file mode 100644 index 000000000..262e5dc1d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/EmptyPaletteStorage.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.world.chunk; + +import java.util.Arrays; +import java.util.function.IntConsumer; + +public record EmptyPaletteStorage(int size) implements PaletteStorage { + public static final long[] EMPTY_DATA = new long[0]; + + public int swap(int index, int value) { + return 0; + } + + public void set(int index, int value) { + } + + public int get(int index) { + return 0; + } + + public long[] getData() { + return EMPTY_DATA; + } + + public int getElementBits() { + return 0; + } + + public void forEach(IntConsumer action) { + for (int i = 0; i < this.size; ++i) { + action.accept(0); + } + } + + public void writePaletteIndices(int[] out) { + Arrays.fill(out, 0, this.size, 0); + } + + public PaletteStorage copy() { + return this; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/IdListPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/IdListPalette.java new file mode 100644 index 000000000..362948919 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/IdListPalette.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class IdListPalette implements Palette { + private final IndexedIterable idList; + + public IdListPalette(IndexedIterable idList) { + this.idList = idList; + } + + public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list) { + return new IdListPalette<>(idList); + } + + @Override + public int index(T object) { + int i = this.idList.getRawId(object); + return i == -1 ? 0 : i; + } + + @Override + public boolean hasAny(Predicate predicate) { + return true; + } + + @Override + public T get(int id) { + T object = this.idList.get(id); + if (object == null) { + throw new RuntimeException("Missing Palette entry for index " + id + "."); + } else { + return object; + } + } + + @Override + public int getSize() { + return this.idList.size(); + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + return this; + } + + @Override + public void remap(Function function) { + throw new UnsupportedOperationException("This palette does not support remap."); + } + + @Override + public boolean canRemap() { + return false; + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PackedIntegerArray.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PackedIntegerArray.java new file mode 100644 index 000000000..80aabd580 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PackedIntegerArray.java @@ -0,0 +1,172 @@ +package net.momirealms.craftengine.core.world.chunk; + +import java.util.function.IntConsumer; + +public class PackedIntegerArray implements PaletteStorage { + private static final int[] INDEX_PARAMETERS = new int[]{-1, -1, 0, Integer.MIN_VALUE, 0, 0, 1431655765, 1431655765, 0, Integer.MIN_VALUE, 0, 1, 858993459, 858993459, 0, 715827882, 715827882, 0, 613566756, 613566756, 0, Integer.MIN_VALUE, 0, 2, 477218588, 477218588, 0, 429496729, 429496729, 0, 390451572, 390451572, 0, 357913941, 357913941, 0, 330382099, 330382099, 0, 306783378, 306783378, 0, 286331153, 286331153, 0, Integer.MIN_VALUE, 0, 3, 252645135, 252645135, 0, 238609294, 238609294, 0, 226050910, 226050910, 0, 214748364, 214748364, 0, 204522252, 204522252, 0, 195225786, 195225786, 0, 186737708, 186737708, 0, 178956970, 178956970, 0, 171798691, 171798691, 0, 165191049, 165191049, 0, 159072862, 159072862, 0, 153391689, 153391689, 0, 148102320, 148102320, 0, 143165576, 143165576, 0, 138547332, 138547332, 0, Integer.MIN_VALUE, 0, 4, 130150524, 130150524, 0, 126322567, 126322567, 0, 122713351, 122713351, 0, 119304647, 119304647, 0, 116080197, 116080197, 0, 113025455, 113025455, 0, 110127366, 110127366, 0, 107374182, 107374182, 0, 104755299, 104755299, 0, 102261126, 102261126, 0, 99882960, 99882960, 0, 97612893, 97612893, 0, 95443717, 95443717, 0, 93368854, 93368854, 0, 91382282, 91382282, 0, 89478485, 89478485, 0, 87652393, 87652393, 0, 85899345, 85899345, 0, 84215045, 84215045, 0, 82595524, 82595524, 0, 81037118, 81037118, 0, 79536431, 79536431, 0, 78090314, 78090314, 0, 76695844, 76695844, 0, 75350303, 75350303, 0, 74051160, 74051160, 0, 72796055, 72796055, 0, 71582788, 71582788, 0, 70409299, 70409299, 0, 69273666, 69273666, 0, 68174084, 68174084, 0, Integer.MIN_VALUE, 0, 5}; + private final long[] data; + private final int elementBits; + private final long maxValue; + private final int size; + private final int elementsPerLong; + private final int indexScale; + private final int indexOffset; + private final int indexShift; + + public PackedIntegerArray(int elementBits, int size, int[] data) { + this(elementBits, size); + int i = 0; + int j; + for (j = 0; j <= size - this.elementsPerLong; j += this.elementsPerLong) { + long l = 0L; + for(int k = this.elementsPerLong - 1; k >= 0; --k) { + l <<= elementBits; + l |= (long)data[j + k] & this.maxValue; + } + this.data[i++] = l; + } + int m = size - j; + if (m > 0) { + long n = 0L; + for (int o = m - 1; o >= 0; --o) { + n <<= elementBits; + n |= (long)data[j + o] & this.maxValue; + } + this.data[i] = n; + } + } + + public PackedIntegerArray(int elementBits, int size) { + this(elementBits, size, (long[]) null); + } + + public PackedIntegerArray(int elementBits, int size, long[] data) { + this.size = size; + this.elementBits = elementBits; + this.maxValue = (1L << elementBits) - 1L; + this.elementsPerLong = (char)(64 / elementBits); + int i = 3 * (this.elementsPerLong - 1); + this.indexScale = INDEX_PARAMETERS[i + 0]; + this.indexOffset = INDEX_PARAMETERS[i + 1]; + this.indexShift = INDEX_PARAMETERS[i + 2]; + int j = (size + this.elementsPerLong - 1) / this.elementsPerLong; + if (data != null) { + if (data.length != j) { + throw new RuntimeException("Invalid length given for storage, got: " + data.length + " but expected: " + j); + } + this.data = data; + } else { + this.data = new long[j]; + } + } + + private int getStorageIndex(int index) { + long l = Integer.toUnsignedLong(this.indexScale); + long m = Integer.toUnsignedLong(this.indexOffset); + return (int)((long)index * l + m >> 32 >> this.indexShift); + } + + @Override + public int swap(int index, int value) { + int i = this.getStorageIndex(index); + long l = this.data[i]; + int j = (index - i * this.elementsPerLong) * this.elementBits; + int k = (int)(l >> j & this.maxValue); + this.data[i] = l & ~(this.maxValue << j) | ((long)value & this.maxValue) << j; + return k; + } + + @Override + public void set(int index, int value) { + int i = this.getStorageIndex(index); + long l = this.data[i]; + int j = (index - i * this.elementsPerLong) * this.elementBits; + this.data[i] = l & ~(this.maxValue << j) | ((long)value & this.maxValue) << j; + } + + @Override + public int get(int index) { + int i = this.getStorageIndex(index); + long l = this.data[i]; + int j = (index - i * this.elementsPerLong) * this.elementBits; + return (int)(l >> j & this.maxValue); + } + + @Override + public long[] getData() { + return this.data; + } + + @Override + public int size() { + return this.size; + } + + @Override + public int getElementBits() { + return this.elementBits; + } + + @Override + public void forEach(IntConsumer action) { + int i = 0; + long[] var3 = this.data; + int var4 = var3.length; + + for (int var5 = 0; var5 < var4; ++var5) { + long l = var3[var5]; + + for(int j = 0; j < this.elementsPerLong; ++j) { + action.accept((int)(l & this.maxValue)); + l >>= this.elementBits; + ++i; + if (i >= this.size) { + return; + } + } + } + + } + + @Override + public void writePaletteIndices(int[] out) { + int i = this.data.length; + int j = 0; + + int k; + long l; + int m; + for(k = 0; k < i - 1; ++k) { + l = this.data[k]; + + for(m = 0; m < this.elementsPerLong; ++m) { + out[j + m] = (int)(l & this.maxValue); + l >>= this.elementBits; + } + + j += this.elementsPerLong; + } + + k = this.size - j; + if (k > 0) { + l = this.data[i - 1]; + + for(m = 0; m < k; ++m) { + out[j + m] = (int)(l & this.maxValue); + l >>= this.elementBits; + } + } + + } + + @Override + public PaletteStorage copy() { + return new PackedIntegerArray(this.elementBits, this.size, this.data.clone()); + } + + public static class InvalidLengthException extends RuntimeException { + InvalidLengthException(String message) { + super(message); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/Palette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/Palette.java new file mode 100644 index 000000000..c15620008 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/Palette.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public interface Palette { + + int index(T object); + + boolean hasAny(Predicate predicate); + + T get(int id); + + int getSize(); + + void readPacket(FriendlyByteBuf buf); + + void writePacket(FriendlyByteBuf buf); + + Palette copy(PaletteResizeListener resizeListener); + + void remap(Function function); + + boolean canRemap(); + + interface Factory { + Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteResizeListener.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteResizeListener.java new file mode 100644 index 000000000..38b961f1c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteResizeListener.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.world.chunk; + +public interface PaletteResizeListener { + + int onResize(int newBits, T object); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteStorage.java new file mode 100644 index 000000000..3ef4e4dba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteStorage.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.world.chunk; + +import java.util.function.IntConsumer; + +public interface PaletteStorage { + + int swap(int index, int value); + + void set(int index, int value); + + int get(int index); + + long[] getData(); + + int size(); + + int getElementBits(); + + void forEach(IntConsumer action); + + void writePaletteIndices(int[] out); + + PaletteStorage copy(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PalettedContainer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PalettedContainer.java new file mode 100644 index 000000000..bc41daeec --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PalettedContainer.java @@ -0,0 +1,347 @@ +package net.momirealms.craftengine.core.world.chunk; + +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArraySet; +import it.unimi.dsi.fastutil.ints.IntSet; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import net.momirealms.craftengine.core.util.MCUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; +import java.util.function.IntUnaryOperator; +import java.util.function.Predicate; +import java.util.stream.LongStream; + +public class PalettedContainer implements PaletteResizeListener, ReadableContainer { + private final PaletteResizeListener dummyListener = (newSize, added) -> 0; + private final IndexedIterable idList; + private Data data; + private final PaletteProvider paletteProvider; + private final Lock lock = new ReentrantLock(); + + public void lock() { + this.lock.lock(); + } + + public void unlock() { + this.lock.unlock(); + } + + public PalettedContainer(IndexedIterable idList, PaletteProvider paletteProvider, DataProvider dataProvider, PaletteStorage storage, List paletteEntries) { + this.idList = idList; + this.paletteProvider = paletteProvider; + this.data = new Data<>(dataProvider, storage, dataProvider.factory().create(dataProvider.bits(), idList, this, paletteEntries)); + } + + private PalettedContainer(IndexedIterable idList, PaletteProvider paletteProvider, Data data) { + this.idList = idList; + this.paletteProvider = paletteProvider; + this.data = data; + } + + private PalettedContainer(PalettedContainer container) { + this.idList = container.idList; + this.paletteProvider = container.paletteProvider; + this.data = container.data.copy(this); + } + + public PalettedContainer(IndexedIterable idList, T object, PaletteProvider paletteProvider) { + this.paletteProvider = paletteProvider; + this.idList = idList; + this.data = this.getCompatibleData(null, 0); + this.data.palette.index(object); + } + + public boolean isEmpty() { + Data data = this.data; + if (data.palette instanceof SingularPalette singularPalette) { + return singularPalette.get(0) == EmptyBlock.INSTANCE; + } + return false; + } + + public Data data() { + return data; + } + + public void readPacket(FriendlyByteBuf buf) { + this.lock(); + try { + int i = buf.readByte(); + Data data = this.getCompatibleData(this.data, i); + data.palette.readPacket(buf); + buf.readLongArray(data.storage.getData()); + this.data = data; + } finally { + this.unlock(); + } + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + this.lock(); + try { + this.data.writePacket(buf); + } finally { + this.unlock(); + } + } + + private Data getCompatibleData(@Nullable Data previousData, int bits) { + DataProvider dataProvider = this.paletteProvider.createDataProvider(this.idList, bits); + return previousData != null && dataProvider.equals(previousData.configuration()) ? previousData : dataProvider.createData(this.idList, this, this.paletteProvider.getContainerSize()); + } + + @Override + public int onResize(int i, T object) { + Data oldData = this.data; + Data newData = this.getCompatibleData(oldData, i); + newData.importFrom(oldData.palette, oldData.storage); + this.data = newData; + return newData.palette.index(object); + } + + @Override + public T get(int x, int y, int z) { + return this.get(this.paletteProvider.computeIndex(x, y, z)); + } + + public T get(int index) { + Data data = this.data; + return data.palette.get(data.storage.get(index)); + } + + public void set(int x, int y, int z, T value) { + this.lock(); + try { + this.set(this.paletteProvider.computeIndex(x, y, z), value); + } finally { + this.unlock(); + } + } + + public void set(int index, T value) { + int i = this.data.palette.index(value); + this.data.storage.set(index, i); + } + + public T swapUnsafe(int x, int y, int z, T value) { + return this.swap(this.paletteProvider.computeIndex(x, y, z), value); + } + + public T swap(int x, int y, int z, T value) { + this.lock(); + T previous; + try { + previous = this.swap(this.paletteProvider.computeIndex(x, y, z), value); + } finally { + this.unlock(); + } + return previous; + } + + private T swap(int index, T value) { + int i = this.data.palette.index(value); + int j = this.data.storage.swap(index, i); + return this.data.palette.get(j); + } + + @Override + public void forEachValue(Consumer action) { + Palette palette = this.data.palette(); + IntSet intSet = new IntArraySet(); + this.data.storage.forEach(intSet::add); + intSet.forEach((id) -> action.accept(palette.get(id))); + } + + @Override + public boolean hasAny(Predicate predicate) { + return this.data.palette.hasAny(predicate); + } + + @Override + public void count(Counter counter) { + int paletteSize = this.data.palette.getSize(); + if (paletteSize == 1) { + counter.accept(this.data.palette.get(0), this.data.storage.size()); + } else { + Int2IntOpenHashMap frequencyMap = new Int2IntOpenHashMap(); + this.data.storage.forEach(key -> frequencyMap.addTo(key, 1)); + frequencyMap.int2IntEntrySet().forEach(entry -> + counter.accept(this.data.palette.get(entry.getIntKey()), entry.getIntValue()) + ); + } + } + + @Override + public PalettedContainer copy() { + return new PalettedContainer<>(this); + } + + @Override + public PalettedContainer slice() { + return new PalettedContainer<>(this.idList, this.data.palette.get(0), this.paletteProvider); + } + + @Override + public Serialized serialize(IndexedIterable idList, PaletteProvider paletteProvider) { + this.lock(); + try { + BiMapPalette biMapPalette = new BiMapPalette<>(idList, this.data.storage.getElementBits(), this.dummyListener); + int containerSize = paletteProvider.getContainerSize(); + int[] paletteIndices = new int[containerSize]; + this.data.storage.writePaletteIndices(paletteIndices); + applyEach(paletteIndices, (id) -> biMapPalette.index(this.data.palette.get(id))); + int bitsRequired = paletteProvider.getBits(idList, biMapPalette.getSize()); + Optional packedData = (bitsRequired != 0) + ? Optional.of(Arrays.stream(new PackedIntegerArray(bitsRequired, containerSize, paletteIndices).getData())) + : Optional.empty(); + return new Serialized<>(biMapPalette.getElements(), packedData); + } finally { + this.unlock(); + } + } + + private static void applyEach(int[] values, IntUnaryOperator applier) { + int previousValue = -1; + int transformedValue = -1; + for (int index = 0; index < values.length; ++index) { + int currentValue = values[index]; + if (currentValue != previousValue) { + previousValue = currentValue; + transformedValue = applier.applyAsInt(currentValue); + } + values[index] = transformedValue; + } + } + + public abstract static class PaletteProvider { + public static final Palette.Factory SINGULAR = SingularPalette::create; + public static final Palette.Factory ARRAY = ArrayPalette::create; + public static final Palette.Factory BI_MAP = BiMapPalette::create; + public static final Palette.Factory ID_LIST = IdListPalette::create; + public static final PaletteProvider CUSTOM_BLOCK_STATE = new PaletteProvider(4) { + public DataProvider createDataProvider(IndexedIterable idList, int bits) { + return switch (bits) { + case 0 -> new DataProvider<>(SINGULAR, bits); + case 1, 2, 3, 4 -> new DataProvider<>(ARRAY, 4); + default -> new DataProvider<>(BI_MAP, bits); + }; + } + }; + public static final PaletteProvider BLOCK_STATE = new PaletteProvider(4) { + public DataProvider createDataProvider(IndexedIterable idList, int bits) { + return switch (bits) { + case 0 -> new DataProvider<>(SINGULAR, bits); + case 1, 2, 3, 4 -> new DataProvider<>(ARRAY, 4); + case 5, 6, 7, 8 -> new DataProvider<>(BI_MAP, bits); + default -> new DataProvider<>(PaletteProvider.ID_LIST, MCUtils.ceilLog2(idList.size())); + }; + } + }; + public static final PaletteProvider BIOME = new PaletteProvider(2) { + public DataProvider createDataProvider(IndexedIterable idList, int bits) { + return switch (bits) { + case 0 -> new DataProvider<>(SINGULAR, bits); + case 1, 2, 3 -> new DataProvider<>(ARRAY, bits); + default -> new DataProvider<>(PaletteProvider.ID_LIST, MCUtils.ceilLog2(idList.size())); + }; + } + }; + + private final int edgeBits; + + private PaletteProvider(int edgeBits) { + this.edgeBits = edgeBits; + } + + public int getContainerSize() { + return 1 << this.edgeBits * 3; + } + + public int computeIndex(int x, int y, int z) { + return (y << this.edgeBits | z) << this.edgeBits | x; + } + + public abstract DataProvider createDataProvider(IndexedIterable idList, int bits); + + int getBits(IndexedIterable idList, int size) { + int i = MCUtils.ceilLog2(size); + DataProvider dataProvider = this.createDataProvider(idList, i); + return dataProvider.factory() == ID_LIST ? i : dataProvider.bits(); + } + } + + public record DataProvider(Palette.Factory factory, int bits) { + public Data createData(IndexedIterable idList, PaletteResizeListener listener, int size) { + PaletteStorage paletteStorage = this.bits == 0 ? new EmptyPaletteStorage(size) : new PackedIntegerArray(this.bits, size); + Palette palette = this.factory.create(this.bits, idList, listener, List.of()); + return new Data<>(this, paletteStorage, palette); + } + } + + public record Data(DataProvider configuration, PaletteStorage storage, Palette palette) { + public void importFrom(Palette palette, PaletteStorage storage) { + for (int i = 0; i < storage.size(); ++i) { + T object = palette.get(storage.get(i)); + this.storage.set(i, this.palette.index(object)); + } + } + + public Data copy(PaletteResizeListener resizeListener) { + return new Data<>(this.configuration, this.storage.copy(), this.palette.copy(resizeListener)); + } + + public void writePacket(FriendlyByteBuf buf) { + buf.writeByte(this.storage.getElementBits()); + this.palette.writePacket(buf); + buf.writeLongArray(this.storage.getData()); + } + } + + @FunctionalInterface + public interface Counter { + void accept(T object, int count); + } + + public static PalettedContainer read(IndexedIterable idList, PaletteProvider paletteProvider, ReadableContainer.Serialized serialized) { + List list = serialized.paletteEntries(); + int containerSize = paletteProvider.getContainerSize(); + int bits = paletteProvider.getBits(idList, list.size()); + DataProvider dataProvider = paletteProvider.createDataProvider(idList, bits); + PaletteStorage paletteStorage; + if (bits == 0) { + paletteStorage = new EmptyPaletteStorage(containerSize); + } else { + Optional optional = serialized.storage(); + if (optional.isEmpty()) { + return null; + } + long[] ls = optional.get().toArray(); + try { + if (dataProvider.factory() == PalettedContainer.PaletteProvider.ID_LIST) { + Palette palette = new BiMapPalette<>(idList, bits, (id, value) -> 0, list); + PackedIntegerArray packedIntegerArray = new PackedIntegerArray(bits, containerSize, ls); + int[] is = new int[containerSize]; + packedIntegerArray.writePaletteIndices(is); + applyEach(is, (id) -> idList.getRawId(palette.get(id))); + paletteStorage = new PackedIntegerArray(dataProvider.bits(), containerSize, is); + } else { + paletteStorage = new PackedIntegerArray(dataProvider.bits(), containerSize, ls); + } + } catch (PackedIntegerArray.InvalidLengthException e) { + CraftEngine.instance().logger().warn("Failed to read PalettedContainer", e); + return null; + } + } + return new PalettedContainer<>(idList, paletteProvider, dataProvider, paletteStorage, list); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ReadableContainer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ReadableContainer.java new file mode 100644 index 000000000..cc5363987 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ReadableContainer.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.LongStream; + +public interface ReadableContainer { + + T get(int x, int y, int z); + + void forEachValue(Consumer action); + + boolean hasAny(Predicate predicate); + + void count(PalettedContainer.Counter counter); + + void writePacket(FriendlyByteBuf buf); + + PalettedContainer copy(); + + PalettedContainer slice(); + + Serialized serialize(IndexedIterable idList, PalettedContainer.PaletteProvider paletteProvider); + + record Serialized(List paletteEntries, Optional storage) {} +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SectionDataContainer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SectionDataContainer.java new file mode 100644 index 000000000..1d72f980e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SectionDataContainer.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import org.jetbrains.annotations.Nullable; + +public class SectionDataContainer { + + private final ImmutableBlockState[] states; + + public SectionDataContainer() { + this.states = new ImmutableBlockState[4096]; + } + + public SectionDataContainer(ImmutableBlockState[] states) { + this.states = states; + } + + public @Nullable ImmutableBlockState get(int index) { + return states[index]; + } + + public void set(int index, ImmutableBlockState value) { + states[index] = value; + } + + public ImmutableBlockState[] states() { + return states; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SingularPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SingularPalette.java new file mode 100644 index 000000000..4930529c9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SingularPalette.java @@ -0,0 +1,94 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class SingularPalette implements Palette { + private final IndexedIterable idList; + @Nullable + private T entry; + private final PaletteResizeListener listener; + + public SingularPalette(IndexedIterable idList, PaletteResizeListener listener, List entries) { + this.idList = idList; + this.listener = listener; + if (!entries.isEmpty()) { + this.entry = entries.get(0); + } + } + + public static Palette create(int bitSize, IndexedIterable idList, PaletteResizeListener listener, List entries) { + return new SingularPalette<>(idList, listener, entries); + } + + @Override + public int index(T object) { + if (this.entry != null && this.entry != object) { + return this.listener.onResize(1, object); + } else { + this.entry = object; + return 0; + } + } + + @Override + public boolean hasAny(Predicate predicate) { + if (this.entry == null) { + throw new IllegalStateException("Use of an uninitialized palette"); + } else { + return predicate.test(this.entry); + } + } + + @Override + public T get(int id) { + if (this.entry != null && id == 0) { + return this.entry; + } else { + throw new IllegalStateException("Missing Palette entry for id " + id + "."); + } + } + + @Override + public int getSize() { + return 1; + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + if (this.entry == null) { + throw new IllegalStateException("Use of an uninitialized palette"); + } else { + return this; + } + } + + @Override + public void remap(Function function) { + this.entry = function.apply(this.entry); + } + + @Override + public boolean canRemap() { + return true; + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + this.entry = this.idList.getOrThrow(buf.readVarInt()); + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + if (this.entry == null) { + throw new IllegalStateException("Use of an uninitialized palette"); + } else { + buf.writeVarInt(this.idList.getRawId(this.entry)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/packet/MCSection.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/packet/MCSection.java new file mode 100644 index 000000000..8c9f37387 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/packet/MCSection.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.world.chunk.packet; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import net.momirealms.craftengine.core.world.chunk.PalettedContainer; +import net.momirealms.craftengine.core.world.chunk.ReadableContainer; + +public class MCSection { + private short nonEmptyBlockCount; + private final PalettedContainer blockStateContainer; + private ReadableContainer biomeContainer; + + public MCSection(IndexedIterable blockStateList, IndexedIterable biomeList) { + this.blockStateContainer = new PalettedContainer<>(blockStateList, 0, PalettedContainer.PaletteProvider.BLOCK_STATE); + this.biomeContainer = new PalettedContainer<>(biomeList, 0, PalettedContainer.PaletteProvider.BIOME); + } + + public void readPacket(FriendlyByteBuf buf) { + this.nonEmptyBlockCount = buf.readShort(); + this.blockStateContainer.readPacket(buf); + PalettedContainer palettedContainer = this.biomeContainer.slice(); + palettedContainer.readPacket(buf); + this.biomeContainer = palettedContainer; + } + + public void writePacket(FriendlyByteBuf buf) { + buf.writeShort(this.nonEmptyBlockCount); + this.blockStateContainer.writePacket(buf); + this.biomeContainer.writePacket(buf); + } + + public void setBlockState(int x, int y, int z, int state) { + this.blockStateContainer.set(x, y, z, state); + } + + public int getBlockState(int x, int y, int z) { + return this.blockStateContainer.get(x, y, z); + } + + public PalettedContainer blockStateContainer() { + return blockStateContainer; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/ChunkSerializer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/ChunkSerializer.java new file mode 100644 index 000000000..878c2ccaf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/ChunkSerializer.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.world.chunk.serialization; + +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.ListTag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ChunkSerializer { + + @Nullable + public static CompoundTag serialize(@NotNull CEChunk chunk) { + ListTag sections = new ListTag(); + CESection[] ceSections = chunk.sections(); + for (CESection ceSection : ceSections) { + if (ceSection != null) { + CompoundTag sectionNbt = SectionSerializer.serialize(ceSection); + if (sectionNbt != null) { + sections.add(sectionNbt); + } + } + } + if (sections.isEmpty()) return null; + CompoundTag chunkNbt = new CompoundTag(); + chunkNbt.put("sections", sections); + chunkNbt.put("entities", new ListTag()); + return chunkNbt; + } + + @NotNull + public static CEChunk deserialize(@NotNull CEWorld world, @NotNull ChunkPos pos, @NotNull CompoundTag chunkNbt) { + ListTag sections = chunkNbt.getList("sections"); + CESection[] sectionArray = new CESection[world.worldHeight().getSectionsCount()]; + for (int i = 0, size = sections.size(); i < size; ++i) { + CompoundTag sectionTag = sections.getCompound(i); + CESection ceSection = SectionSerializer.deserialize(sectionTag); + if (ceSection != null) { + int sectionIndex = world.worldHeight().getSectionIndexFromSectionY(ceSection.sectionY()); + if (sectionIndex >= 0 && sectionIndex < sectionArray.length) { + sectionArray[sectionIndex] = ceSection; + } + } + } + ListTag entities = chunkNbt.getList("entities"); + return new CEChunk(world, pos, sectionArray, List.of()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/SectionSerializer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/SectionSerializer.java new file mode 100644 index 000000000..fbd332f32 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/SectionSerializer.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.world.chunk.serialization; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.InactiveCustomBlock; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.craftengine.core.world.chunk.PalettedContainer; +import net.momirealms.craftengine.core.world.chunk.ReadableContainer; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.ListTag; +import net.momirealms.sparrow.nbt.LongArrayTag; +import net.momirealms.sparrow.nbt.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.LongStream; + +public class SectionSerializer { + + @Nullable + public static CompoundTag serialize(@NotNull CESection section) { + ReadableContainer.Serialized serialized = section.statesContainer().serialize(null, PalettedContainer.PaletteProvider.CUSTOM_BLOCK_STATE); + ListTag palettes = new ListTag(); + List states = serialized.paletteEntries(); + if (states.size() == 1 && states.get(0) == EmptyBlock.INSTANCE.getDefaultState()) { + return null; + } + CompoundTag sectionNbt = new CompoundTag(); + sectionNbt.putByte("y", (byte) section.sectionY()); + CompoundTag blockStates = new CompoundTag(); + sectionNbt.put("block_states", blockStates); + for (ImmutableBlockState state : states) { + palettes.add(state.getNbtToSave()); + } + blockStates.put("palette", palettes); + serialized.storage().ifPresent(data -> blockStates.put("data", new LongArrayTag(data.toArray()))); + return sectionNbt; + } + + @Nullable + public static CESection deserialize(@NotNull CompoundTag sectionNbt) { + CompoundTag blockStates = sectionNbt.getCompound("block_states"); + if (blockStates == null) { + return null; + } + ListTag palettes = blockStates.getList("palette"); + List paletteEntries = new ArrayList<>(palettes.size()); + for (Tag tag : palettes) { + CompoundTag palette = (CompoundTag) tag; + String id = palette.getString("id"); + CompoundTag data = palette.getCompound("properties"); + Key key = Key.of(id); + Holder owner = BuiltInRegistries.BLOCK.get(key).orElseGet(() -> { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder( + new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), key)); + InactiveCustomBlock inactiveBlock = new InactiveCustomBlock(key, holder); + holder.bindValue(inactiveBlock); + return holder; + }); + ImmutableBlockState state = owner.value().getBlockState(data); + paletteEntries.add(state); + } + long[] data = blockStates.getLongArray("data"); + ReadableContainer.Serialized serialized = new ReadableContainer.Serialized<>(paletteEntries, + data == null ? Optional.empty() : Optional.of(LongStream.of(data))); + PalettedContainer palettedContainer = PalettedContainer.read(null, PalettedContainer.PaletteProvider.CUSTOM_BLOCK_STATE, serialized); + return new CESection(sectionNbt.getByte("y"), palettedContainer); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java new file mode 100644 index 000000000..2715f6172 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import it.unimi.dsi.fastutil.io.FastBufferedInputStream; + +import javax.annotation.Nullable; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import java.util.zip.InflaterInputStream; + +public class CompressionMethod { + private static final int METHOD_COUNT = 3; + public static final CompressionMethod[] METHODS = new CompressionMethod[METHOD_COUNT +1]; + public static final CompressionMethod NONE = register(new CompressionMethod(1, (stream) -> stream, (stream) -> stream)); + public static final CompressionMethod DEFLATE = register(new CompressionMethod(2, (stream) -> new FastBufferedInputStream(new InflaterInputStream(stream)), (stream) -> new BufferedOutputStream(new DeflaterOutputStream(stream)))); + public static final CompressionMethod GZIP = register(new CompressionMethod(3, (stream) -> new FastBufferedInputStream(new GZIPInputStream(stream)), (stream) -> new BufferedOutputStream(new GZIPOutputStream(stream)))); +// public static final CompressionMethod LZ4 = register(new CompressionMethod(4, LZ4BlockInputStream::new, LZ4BlockOutputStream::new)); + + private final int id; + private final StreamWrapper inputWrapper; + private final StreamWrapper outputWrapper; + + private CompressionMethod(int id, StreamWrapper inputStreamWrapper, StreamWrapper outputStreamWrapper) { + this.id = id; + this.inputWrapper = inputStreamWrapper; + this.outputWrapper = outputStreamWrapper; + } + + private static CompressionMethod register(CompressionMethod version) { + METHODS[version.id] = version; + return version; + } + + @Nullable + public static CompressionMethod fromId(int id) { + if (!isValid(id)) return null; + return METHODS[id]; + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public static boolean isValid(int id) { + return id > 0 && id <= METHOD_COUNT; + } + + public int getId() { + return this.id; + } + + public OutputStream wrap(OutputStream outputStream) throws IOException { + return this.outputWrapper.wrap(outputStream); + } + + public InputStream wrap(InputStream inputStream) throws IOException { + return this.inputWrapper.wrap(inputStream); + } + + @FunctionalInterface + interface StreamWrapper { + O wrap(O object) throws IOException; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java new file mode 100644 index 000000000..bf78eb1dd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java @@ -0,0 +1,192 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet; +import net.momirealms.craftengine.core.util.ExceptionCollector; +import net.momirealms.craftengine.core.util.FileUtils; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; +import org.jetbrains.annotations.Nullable; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class DefaultRegionFileStorage implements WorldDataStorage { + + private final Path folder; + + public static final String REGION_FILE_SUFFIX = ".mca"; + public static final String REGION_FILE_PREFIX = "r."; + + public final Long2ObjectLinkedOpenHashMap regionCache = new Long2ObjectLinkedOpenHashMap<>(); + private final LongLinkedOpenHashSet nonExistingRegionFiles = new LongLinkedOpenHashSet(); + static final int MAX_NON_EXISTING_CACHE = 1024 * 64; + + public DefaultRegionFileStorage(Path directory) { + this.folder = directory; + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private synchronized boolean doesRegionFilePossiblyExist(long position) { + if (this.nonExistingRegionFiles.contains(position)) { + this.nonExistingRegionFiles.addAndMoveToFirst(position); + return false; + } + return true; + } + + private synchronized void createRegionFile(long position) { + this.nonExistingRegionFiles.remove(position); + } + + private synchronized void markNonExisting(long position) { + if (this.nonExistingRegionFiles.addAndMoveToFirst(position)) { + while (this.nonExistingRegionFiles.size() >= MAX_NON_EXISTING_CACHE) { + this.nonExistingRegionFiles.removeLastLong(); + } + } + } + + public synchronized boolean doesRegionFileNotExistNoIO(ChunkPos pos) { + long key = ChunkPos.asLong(pos.regionX(), pos.regionZ()); + return !this.doesRegionFilePossiblyExist(key); + } + + public synchronized RegionFile getRegionFileIfLoaded(ChunkPos pos) { + return this.regionCache.getAndMoveToFirst(ChunkPos.asLong(pos.regionX(), pos.regionZ())); + } + + public synchronized boolean chunkExists(ChunkPos pos) throws IOException { + RegionFile regionfile = getRegionFile(pos, true, false); + return regionfile != null && regionfile.hasChunk(pos); + } + + public synchronized RegionFile getRegionFile(ChunkPos pos, boolean existingOnly, boolean lock) throws IOException { + long chunkPosLongKey = ChunkPos.asLong(pos.regionX(), pos.regionZ()); + RegionFile regionfile = this.regionCache.getAndMoveToFirst(chunkPosLongKey); + if (regionfile != null) { + if (lock) { + regionfile.fileLock.lock(); + } + return regionfile; + } else { + if (existingOnly && !this.doesRegionFilePossiblyExist(chunkPosLongKey)) { + return null; + } + if (this.regionCache.size() >= 256) { + this.regionCache.removeLast().close(); + } + Path path = this.folder.resolve(REGION_FILE_PREFIX + pos.regionX() + "." + pos.regionZ() + REGION_FILE_SUFFIX); + if (existingOnly && !Files.exists(path)) { + this.markNonExisting(chunkPosLongKey); + return null; + } else { + this.createRegionFile(chunkPosLongKey); + } + FileUtils.createDirectoriesSafe(this.folder); + RegionFile newRegionFile = new RegionFile(path, this.folder); + + this.regionCache.putAndMoveToFirst(chunkPosLongKey, newRegionFile); + if (lock) { + newRegionFile.fileLock.lock(); + } + return newRegionFile; + } + } + + public static ChunkPos getRegionFileCoordinates(Path file) { + String fileName = file.getFileName().toString(); + if (!fileName.startsWith(REGION_FILE_PREFIX) || !fileName.endsWith(REGION_FILE_SUFFIX)) { + return null; + } + String[] split = fileName.split("\\."); + if (split.length != 4) { + return null; + } + try { + int x = Integer.parseInt(split[1]); + int z = Integer.parseInt(split[2]); + return new ChunkPos(x << 5, z << 5); + } catch (NumberFormatException ex) { + return null; + } + } + + @Override + @Nullable + public CompoundTag readChunkTagAt(ChunkPos pos) throws IOException { + RegionFile regionFile = this.getRegionFile(pos, false, true); + try { + DataInputStream dataInputStream = regionFile.getChunkDataInputStream(pos); + CompoundTag tag; + try { + if (dataInputStream == null) { + return null; + } + tag = NBT.readCompound(dataInputStream); + } catch (Throwable t1) { + try { + dataInputStream.close(); + } catch (Throwable t2) { + t1.addSuppressed(t2); + } + throw t1; + } + dataInputStream.close(); + return tag; + } finally { + regionFile.fileLock.unlock(); + } + } + + @Override + public void writeChunkTagAt(ChunkPos pos, @Nullable CompoundTag nbt) throws IOException { + RegionFile regionFile = this.getRegionFile(pos, nbt == null, true); + try { + if (nbt == null) { + regionFile.clear(pos); + } else { + DataOutputStream dataOutputStream = regionFile.getChunkDataOutputStream(pos); + try { + NBT.writeCompound(nbt, dataOutputStream); + } catch (Throwable t1) { + if (dataOutputStream != null) { + try { + dataOutputStream.close(); + } catch (Throwable t2) { + t1.addSuppressed(t2); + } + } + throw t1; + } + dataOutputStream.close(); + } + } finally { + regionFile.fileLock.unlock(); + } + } + + @Override + public synchronized void flush() throws IOException { + for (RegionFile regionFile : this.regionCache.values()) { + regionFile.flush(); + } + } + + @Override + public synchronized void close() throws IOException { + ExceptionCollector collector = new ExceptionCollector<>(); + for (RegionFile regionfile : this.regionCache.values()) { + try { + regionfile.close(); + } catch (IOException ioexception) { + collector.add(ioexception); + } + } + collector.throwIfPresent(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionBitmap.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionBitmap.java new file mode 100644 index 000000000..063c7df50 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionBitmap.java @@ -0,0 +1,96 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import it.unimi.dsi.fastutil.ints.IntArraySet; +import it.unimi.dsi.fastutil.ints.IntCollection; +import it.unimi.dsi.fastutil.ints.IntSet; + +import java.util.BitSet; + +/** + * A class that manages a bitmap for tracking used and free regions of memory or storage. + * This class provides methods to allocate, free, and query regions in the bitmap. + */ +public class RegionBitmap { + private final BitSet used = new BitSet(); + + /** + * Copies the state of another RegionBitmap into this one. + * The bits from the other RegionBitmap are copied into this one. + * @param other The other RegionBitmap to copy from + */ + public void copyFrom(RegionBitmap other) { + BitSet thisBitset = this.used; + BitSet otherBitset = other.used; + for (int i = 0; i < Math.max(thisBitset.size(), otherBitset.size()); ++i) { + thisBitset.set(i, otherBitset.get(i)); + } + } + + /** + * Attempts to allocate a region starting from a given position with a specified length. + * The allocation succeeds if the region is free; otherwise, it returns false. + * @param from The starting position of the allocation + * @param length The length of the region to allocate + * @return true if the allocation was successful, false otherwise + */ + public boolean tryAllocate(int from, int length) { + BitSet bitset = this.used; + // Find the next set bit from the specified position + int firstSet = bitset.nextSetBit(from); + // If there is an overlap with an already allocated region, return false + if (firstSet > 0 && firstSet < (from + length)) { + return false; + } + // Mark the region as used + bitset.set(from, from + length); + return true; + } + + /** + * Forces a region to be marked as used starting from a specified position and with a given size. + * @param start The starting position of the forced allocation + * @param size The size of the region to force allocate + */ + public void allocate(int start, int size) { + this.used.set(start, start + size); + } + + /** + * Frees a region by clearing the bits corresponding to the given range. + * @param start The starting position of the region to free + * @param size The size of the region to free + */ + public void free(int start, int size) { + this.used.clear(start, start + size); + } + + /** + * Allocates a region of the specified size by finding the next available free region + * and marking it as used. + * @param size The size of the region to allocate + * @return The starting position of the allocated region + */ + public int allocate(int size) { + int i = 0; + while(true) { + // Find the next free region after the current position + int start = this.used.nextClearBit(i); + // Find the next set bit after the free region + int end = this.used.nextSetBit(start); + // If there's enough space, allocate and return the starting position + if (end == -1 || end - start >= size) { + this.allocate(start, size); + return start; + } + i = end; + } + } + + /** + * Returns a set of integers representing the used regions in the bitmap. + * @return An IntSet containing the positions of used bits + */ + public IntSet getUsed() { + return this.used.stream().collect(IntArraySet::new, IntCollection::add, IntCollection::addAll); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java new file mode 100644 index 000000000..fc909f985 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java @@ -0,0 +1,445 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.logger.PluginLogger; +import net.momirealms.craftengine.core.world.ChunkPos; + +import javax.annotation.Nullable; +import java.io.*; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.time.Instant; +import java.util.concurrent.locks.ReentrantLock; + +public class RegionFile implements AutoCloseable { + private static final PluginLogger LOGGER = CraftEngine.instance().logger(); + + public static final int SECTOR_BYTES = 4096; + public static final int CHUNK_HEADER_SIZE = 5; + public static final int EXTERNAL_STREAM_FLAG = 128; + public static final int EXTERNAL_CHUNK_THRESHOLD = 256; + public static final int MAX_CHUNK_SIZE = 500 * 1024 * 1024; + public static final int INFO_NOT_PRESENT = 0; + + public static final String EXTERNAL_FILE_SUFFIX = ".mcc"; + public static final String EXTERNAL_FILE_PREFIX = "c."; + + private static final ByteBuffer PADDING_BUFFER = ByteBuffer.allocateDirect(1); + + private final FileChannel fileChannel; + private final Path directory; + private final CompressionMethod compression; + private final ByteBuffer header; + private final IntBuffer sectorInfo; + private final IntBuffer timestamps; + private final RegionBitmap usedSectors; + public final ReentrantLock fileLock = new ReentrantLock(true); + public final Path regionFile; + + public RegionFile(Path fileChannel, Path directory) throws IOException { + this(fileChannel, directory, CompressionMethod.GZIP); + } + + public RegionFile(Path path, Path directory, CompressionMethod compressionMethod) throws IOException { + this.header = ByteBuffer.allocateDirect(8192); + this.regionFile = path; + this.usedSectors = new RegionBitmap(); + this.compression = compressionMethod; + if (!Files.isDirectory(directory)) { + throw new IllegalArgumentException("Expected directory, got " + directory.toAbsolutePath()); + } + this.directory = directory; + this.sectorInfo = this.header.asIntBuffer(); + this.sectorInfo.limit(1024); + this.header.position(4096); + this.timestamps = this.header.asIntBuffer(); + this.fileChannel = FileChannel.open(path, StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE); + this.usedSectors.allocate(0, 2); + this.header.position(0); + int byteAmount = this.fileChannel.read(this.header, 0L); + if (byteAmount == -1) { + return; + } + if (byteAmount != 8192) { + LOGGER.warn(String.format("Region file %s has truncated header: %s", path, byteAmount)); + } + long regionSize = Files.size(path); + for (int chunkLocation = 0; chunkLocation < 32 * 32; ++chunkLocation) { + int sectorInfo = this.sectorInfo.get(chunkLocation); + if (sectorInfo != 0) { + int offset = unpackSectorOffset(sectorInfo); + int size = unpackSectorSize(sectorInfo); + if (offset < 2) { + LOGGER.warn(String.format("Region file %s has invalid sector at index: %s; sector %s overlaps with header", path, chunkLocation, offset)); + this.sectorInfo.put(chunkLocation, 0); + } else if (size == 0) { + LOGGER.warn(String.format("Region file %s has an invalid sector at index: %s; size has to be > 0", path, chunkLocation)); + this.sectorInfo.put(chunkLocation, 0); + } else if ((long) offset * 4096L > regionSize) { + LOGGER.warn(String.format("Region file %s has an invalid sector at index: %s; sector %s is out of bounds", path, chunkLocation, offset)); + this.sectorInfo.put(chunkLocation, 0); + } else { + this.usedSectors.allocate(offset, size); + } + } + } + } + + /** + * Retrieves the data input stream for a given chunk. The method reads and processes the + * chunk's header, checks for potential errors, and returns a valid input stream for the chunk data. + * + * @param pos The position of the chunk within the region file. + * @return A DataInputStream for the chunk's data if it exists and is valid, or null if there is an error. + * @throws IOException If an I/O error occurs while reading from the file. + */ + @Nullable + public synchronized DataInputStream getChunkDataInputStream(ChunkPos pos) throws IOException { + int sectorInfo = this.getSectorInfo(pos); + // If no sector information is found (sectorInfo == 0), return null (indicating chunk doesn't exist). + if (sectorInfo == INFO_NOT_PRESENT) { + return null; + } + + int sectorOffset = RegionFile.unpackSectorOffset(sectorInfo); + int sectorSize = RegionFile.unpackSectorSize(sectorInfo); + + // Calculate the total size of the chunk data in bytes (sectorSize * 4096 bytes per sector). + int totalSize = sectorSize * SECTOR_BYTES; + ByteBuffer bytebuffer = ByteBuffer.allocate(totalSize); + this.fileChannel.read(bytebuffer, (long) sectorOffset * SECTOR_BYTES); + ((Buffer) bytebuffer).flip(); + + // If the buffer has less than 5 bytes, the chunk's header is corrupted (or truncated). + if (bytebuffer.remaining() < 5) { + LOGGER.severe(String.format("Chunk %s header is truncated: expected %s but read %s", pos, totalSize, bytebuffer.remaining())); + return null; + } + + // Read the chunk's stub information + int size = bytebuffer.getInt(); + byte type = bytebuffer.get(); + if (size == 0) { + LOGGER.warn(String.format("Chunk %s is allocated, but stream is missing", pos)); + return null; + } + + // Calculate the actual data size + int actualSize = size - 1; + if (RegionFile.isExternalStreamChunk(type)) { + // If the chunk has both internal and external streams, log a warning. + if (actualSize != 0) { + LOGGER.warn("Chunk has both internal and external streams"); + } + // Create and return an input stream for the external chunk. + return this.createExternalChunkInputStream(pos, RegionFile.getExternalChunkVersion(type)); + } else if (actualSize > bytebuffer.remaining()) { + // If the declared size of the chunk is greater than the remaining bytes in the buffer, the stream is truncated. + LOGGER.severe(String.format("Chunk %s stream is truncated: expected %s but read %s", pos, actualSize, bytebuffer.remaining())); + return null; + } else if (actualSize < 0) { + // If the declared chunk size is negative, log an error. + LOGGER.severe(String.format("Declared size %s of chunk %s is negative", size, pos)); + return null; + } else { + // Otherwise, create and return a standard input stream for the chunk data. + return this.createChunkInputStream(pos, type, RegionFile.createInputStream(bytebuffer, actualSize)); + } + } + + private static int getTimestamp() { + return (int) (Instant.now().toEpochMilli() / 1000L); + } + + private static boolean isExternalStreamChunk(byte flags) { + return (flags & EXTERNAL_STREAM_FLAG) != 0; + } + + private static byte getExternalChunkVersion(byte flags) { + return (byte) (flags & -129); + } + + @Nullable + private DataInputStream createChunkInputStream(ChunkPos pos, byte flags, InputStream stream) throws IOException { + CompressionMethod compressionMethod = CompressionMethod.fromId(flags); + if (compressionMethod == null) { + LOGGER.severe(String.format("Chunk %s has invalid chunk stream version %s", pos, flags)); + return null; + } else { + return new DataInputStream(compressionMethod.wrap(stream)); + } + } + + @Nullable + private DataInputStream createExternalChunkInputStream(ChunkPos pos, byte flags) throws IOException { + Path path = this.getExternalChunkPath(pos); + if (!Files.isRegularFile(path)) { + LOGGER.severe(String.format("External chunk path %s is not file", path)); + return null; + } else { + return this.createChunkInputStream(pos, flags, Files.newInputStream(path)); + } + } + + private static ByteArrayInputStream createInputStream(ByteBuffer buffer, int length) { + return new ByteArrayInputStream(buffer.array(), buffer.position(), length); + } + + private int packSectorOffset(int offset, int size) { + return offset << 8 | size; + } + + private static int unpackSectorSize(int sectorData) { + return sectorData & 0xFF; + } + + private static int unpackSectorOffset(int sectorData) { + return (sectorData >> 8) & 0xFFFFFF; + } + + private static int sizeToSectors(int byteCount) { + return (byteCount + SECTOR_BYTES - 1) / SECTOR_BYTES; + } + + /** + * Checks whether a chunk exists at the specified position. + * The method verifies if the chunk's data is valid and can be accessed. + * + * @param pos The position of the chunk within the region file. + * @return True if the chunk exists and is valid, false otherwise. + */ + public synchronized boolean doesChunkExist(ChunkPos pos) { + int sectorInfo = this.getSectorInfo(pos); + if (sectorInfo == INFO_NOT_PRESENT) { + return false; + } + int sectorOffset = unpackSectorOffset(sectorInfo); + int sectorSize = unpackSectorSize(sectorInfo); + ByteBuffer bytebuffer = ByteBuffer.allocate(CHUNK_HEADER_SIZE); + try { + this.fileChannel.read(bytebuffer, (long) sectorOffset * SECTOR_BYTES); + ((Buffer) bytebuffer).flip(); + if (bytebuffer.remaining() != CHUNK_HEADER_SIZE) { + return false; + } + int size = bytebuffer.getInt(); + byte type = bytebuffer.get(); + if (isExternalStreamChunk(type)) { + if (!CompressionMethod.isValid(getExternalChunkVersion(type))) + return false; + return Files.isRegularFile(this.getExternalChunkPath(pos)); + } else { + if (!CompressionMethod.isValid(type)) + return false; + if (size == 0) + return false; + int actualSize = size - 1; + return actualSize >= 0 && actualSize <= SECTOR_BYTES * sectorSize; + } + } catch (IOException ioexception) { + return false; + } + } + + public DataOutputStream getChunkDataOutputStream(ChunkPos pos) throws IOException { + return new DataOutputStream(this.compression.wrap(new ChunkBuffer(pos))); + } + + public void flush() throws IOException { + this.fileChannel.force(true); + } + + public void clear(ChunkPos pos) throws IOException { + int chunkLocation = RegionFile.getChunkLocation(pos); + int sectorInfo = this.sectorInfo.get(chunkLocation); + if (sectorInfo != INFO_NOT_PRESENT) { + this.sectorInfo.put(chunkLocation, 0); + this.timestamps.put(chunkLocation, RegionFile.getTimestamp()); + this.writeHeader(); + Files.deleteIfExists(this.getExternalChunkPath(pos)); + this.usedSectors.free(RegionFile.unpackSectorOffset(sectorInfo), RegionFile.unpackSectorSize(sectorInfo)); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + protected synchronized void write(ChunkPos pos, ByteBuffer buf) throws IOException { + // get old offset info + int offsetIndex = RegionFile.getChunkLocation(pos); + int previousSectorInfo = this.sectorInfo.get(offsetIndex); + int previousSectorOffset = RegionFile.unpackSectorOffset(previousSectorInfo); + int previousSectorSize = RegionFile.unpackSectorSize(previousSectorInfo); + // count the sectors to write + int sizeToWrite = buf.remaining(); + int sectorsToWrite = RegionFile.sizeToSectors(sizeToWrite); + int sectorStartPosition; + CommitOp regionFileOperation; + // If the chunk file is too large, store it as an additional file + if (sectorsToWrite >= EXTERNAL_CHUNK_THRESHOLD) { + Path path = this.getExternalChunkPath(pos); + LOGGER.warn(String.format("Saving oversized chunk %s (%s bytes) to external file %s", pos, sizeToWrite, path)); + sectorsToWrite = 1; + sectorStartPosition = this.usedSectors.allocate(sectorsToWrite); + regionFileOperation = this.writeToExternalFileSafely(path, buf); + ByteBuffer externalBuf = this.createExternalHeader(); + this.fileChannel.write(externalBuf, (long) sectorStartPosition * SECTOR_BYTES); + } else { + sectorStartPosition = this.usedSectors.allocate(sectorsToWrite); + // delete external chunk + regionFileOperation = () -> Files.deleteIfExists(this.getExternalChunkPath(pos)); + this.fileChannel.write(buf, (long) sectorStartPosition * SECTOR_BYTES); + } + this.sectorInfo.put(offsetIndex, this.packSectorOffset(sectorStartPosition, sectorsToWrite)); + this.timestamps.put(offsetIndex, RegionFile.getTimestamp()); + this.writeHeader(); + regionFileOperation.run(); + // clear old data + if (previousSectorOffset != 0) { + this.usedSectors.free(previousSectorOffset, previousSectorSize); + } + } + + private ByteBuffer createExternalHeader() { + return this.createExternalHeader(this.compression); + } + + private ByteBuffer createExternalHeader(CompressionMethod compression) { + ByteBuffer bytebuffer = ByteBuffer.allocate(CHUNK_HEADER_SIZE); + bytebuffer.putInt(1); + bytebuffer.put((byte) (compression.getId() | EXTERNAL_STREAM_FLAG)); + ((Buffer) bytebuffer).flip(); + return bytebuffer; + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private RegionFile.CommitOp writeToExternalFileSafely(Path destination, ByteBuffer buf) throws IOException { + Path tempFile = Files.createTempFile(this.directory, "tmp", null); + FileChannel filechannel = FileChannel.open(tempFile, StandardOpenOption.CREATE, StandardOpenOption.WRITE); + try { + ((Buffer) buf).position(CHUNK_HEADER_SIZE); + filechannel.write(buf); + } catch (Throwable t1) { + if (filechannel != null) { + try { + filechannel.close(); + } catch (Throwable t2) { + t1.addSuppressed(t2); + } + } + throw t1; + } + filechannel.close(); + return () -> Files.move(tempFile, destination, StandardCopyOption.REPLACE_EXISTING); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private void writeHeader() throws IOException { + this.header.position(0); + this.fileChannel.write(this.header, 0L); + } + + private int getSectorInfo(ChunkPos pos) { + return this.sectorInfo.get(RegionFile.getChunkLocation(pos)); + } + + public boolean hasChunk(ChunkPos pos) { + return this.getSectorInfo(pos) != INFO_NOT_PRESENT; + } + + private static int getChunkLocation(ChunkPos pos) { + return pos.regionLocalX() + pos.regionLocalZ() * 32; + } + + public void close() throws IOException { + this.fileLock.lock(); + synchronized (this) { + try { + try { + this.padToFullSector(); + } finally { + try { + this.fileChannel.force(true); + } finally { + this.fileChannel.close(); + } + } + } finally { + this.fileLock.unlock(); + } + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private void padToFullSector() throws IOException { + int currentSize = (int) this.fileChannel.size(); + int expectedSize = RegionFile.sizeToSectors(currentSize) * SECTOR_BYTES; + if (currentSize != expectedSize) { + ByteBuffer bytebuffer = RegionFile.PADDING_BUFFER.duplicate(); + ((Buffer) bytebuffer).position(0); + this.fileChannel.write(bytebuffer, expectedSize - 1); + } + } + + private static int getChunkIndex(int x, int z) { + return (x & 31) + (z & 31) * 32; + } + + private Path getExternalChunkPath(ChunkPos chunkPos) { + String s = EXTERNAL_FILE_PREFIX + chunkPos.x + "." + chunkPos.z + EXTERNAL_FILE_SUFFIX; + return this.directory.resolve(s); + } + + private class ChunkBuffer extends ByteArrayOutputStream { + + private final ChunkPos pos; + + public ChunkBuffer(ChunkPos pos) { + super(8096); + super.write(0); + super.write(0); + super.write(0); + super.write(0); + super.write(RegionFile.this.compression.getId()); + this.pos = pos; + } + + @Override + public void write(final int b) { + if (this.count > MAX_CHUNK_SIZE) { + throw new RegionFileSizeException("Region file too large: " + this.count); + } + super.write(b); + } + + @Override + public void write(final byte[] b, final int off, final int len) { + if (this.count + len > MAX_CHUNK_SIZE) { + throw new RegionFileSizeException("Region file too large: " + (this.count + len)); + } + super.write(b, off, len); + } + + public void close() throws IOException { + ByteBuffer bytebuffer = ByteBuffer.wrap(this.buf, 0, this.count); + bytebuffer.putInt(0, this.count - CHUNK_HEADER_SIZE + 1); + RegionFile.this.write(this.pos, bytebuffer); + } + } + + private interface CommitOp { + + void run() throws IOException; + } + + public static final class RegionFileSizeException extends RuntimeException { + + public RegionFileSizeException(String message) { + super(message); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java new file mode 100644 index 000000000..a9e76effd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public interface WorldDataStorage { + + @Nullable + CompoundTag readChunkTagAt(ChunkPos pos) throws IOException; + + void writeChunkTagAt(ChunkPos pos, @Nullable CompoundTag nbt) throws IOException; + + void flush() throws IOException; + + void close() throws IOException; +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..d83cecf44 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,56 @@ +# Project settings +# Rule: [major update].[feature update].[bug fix] +project_version=0.0.10 +config_version=1 +project_group=net.momirealms +legacy_model_templates_version=1.21.3 +latest_model_templates_version=1.21.4 +latest_minecraft_version=1.21.4 + +# Supported languages +lang=en,zh_cn + +# Dependency settings +paper_version=1.21.4 +jetbrains_annotations_version=24.0.0 +slf4j_version=2.0.16 +log4j_version=2.24.1 +gson_version=2.11.0 +asm_version=9.7.1 +asm_commons_version=9.7.1 +jar_relocator_version=1.7 +adventure_bundle_version=4.17.0 +adventure_platform_version=4.3.4 +cloud_core_version=2.0.0 +cloud_services_version=2.0.0 +cloud_brigadier_version=2.0.0-beta.10 +cloud_bukkit_version=2.0.0-beta.10 +cloud_paper_version=2.0.0-beta.10 +cloud_minecraft_extras_version=2.0.0-beta.10 +boosted_yaml_version=1.3.7 +bstats_version=3.0.2 +caffeine_version=3.1.8 +rtag_version=1.5.9 +placeholder_api_version=2.11.6 +vault_version=1.7 +guava_version=33.3.1-jre +lz4_version=1.8.0 +geantyref_version=1.3.16 +zstd_version=1.5.6-9 +commons_io_version=2.17.0 +sparrow_nbt_version=0.3 +fastutil_version=8.5.15 +netty_version=4.1.115 +joml_version=1.10.8 +datafixerupper_version=1.0.20 +mojang_brigadier_version=1.0.18 +byte_buddy_version=1.15.11 +snake_yaml_version=2.3 + +# Proxy settings +systemProp.socks.proxyHost=127.0.0.1 +systemProp.socks.proxyPort=7890 +systemProp.http.proxyHost=127.0.0.1 +systemProp.http.proxyPort=7890 +systemProp.https.proxyHost=127.0.0.1 +systemProp.https.proxyPort=7890 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..171d8761b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 000000000..1b6c78733 --- /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 000000000..107acd32c --- /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/jitpack.yml b/jitpack.yml new file mode 100644 index 000000000..1e41e00b7 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,2 @@ +jdk: + - openjdk17 \ No newline at end of file diff --git a/server-mod/build.gradle.kts b/server-mod/build.gradle.kts new file mode 100644 index 000000000..a87adea28 --- /dev/null +++ b/server-mod/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + id("java-library") + id("io.github.goooler.shadow") version "8.1.8" + id("io.papermc.paperweight.userdev") version "2.0.0-beta.14" +} + +repositories { + mavenCentral() + maven("https://maven.fabricmc.net/") + maven("https://oss.sonatype.org/content/groups/public/") + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.spongepowered.org/maven/") +} + +dependencies { + implementation(project(":shared")) + remapper("net.fabricmc:tiny-remapper:0.10.4:fat") + paperweightDevelopmentBundle("io.papermc.paper:dev-bundle:1.21.4-R0.1-SNAPSHOT") + compileOnly("space.vectrix.ignite:ignite-api:1.1.0") + compileOnly("net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7") + compileOnly("io.github.llamalad7:mixinextras-common:0.4.1") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION + +artifacts { + archives(tasks.shadowJar) +} + +tasks { + shadowJar { + archiveClassifier = "" + archiveFileName = "${rootProject.name}-bukkit-mod-${rootProject.properties["project_version"]}.jar" + destinationDirectory.set(file("$rootDir/target")) + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java new file mode 100644 index 000000000..817096753 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java @@ -0,0 +1,181 @@ +package net.momirealms.craftengine.mod; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ScheduledTickAccess; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Fallable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.momirealms.craftengine.shared.ObjectHolder; +import net.momirealms.craftengine.shared.block.*; +import org.jetbrains.annotations.NotNull; + +public class CraftEngineBlock extends Block implements BehaviorHolder, ShapeHolder, NoteBlockIndicator, Fallable { + private static final MixinStoneBlockShape STONE = new MixinStoneBlockShape(Blocks.STONE.defaultBlockState()); + private boolean isNoteBlock; + public ObjectHolder behaviorHolder; + public ObjectHolder shapeHolder; + public boolean isClientSideNoteBlock; + + public CraftEngineBlock(Properties properties) { + super(properties); + this.behaviorHolder = new ObjectHolder<>(EmptyBlockBehavior.INSTANCE); + this.shapeHolder = new ObjectHolder<>(STONE); + } + + public void setNoteBlock(boolean noteBlock) { + isNoteBlock = noteBlock; + } + + @Override + public ObjectHolder getBehaviorHolder() { + return behaviorHolder; + } + + @Override + public ObjectHolder getShapeHolder() { + return shapeHolder; + } + + @Override + public boolean isNoteBlock() { + return isClientSideNoteBlock; + } + + @Override + protected @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter level, @NotNull BlockPos pos, @NotNull CollisionContext context) { + try { + return (VoxelShape) shapeHolder.value().getShape(this, new Object[]{state, level, pos, context}); + } catch (Exception e) { + e.printStackTrace(); + return super.getShape(state, level, pos, context); + } + } + + @Override + protected void tick(@NotNull BlockState state, @NotNull ServerLevel level, @NotNull BlockPos pos, @NotNull RandomSource random) { + try { + behaviorHolder.value().tick(this, new Object[]{state, level, pos, random}, () -> { + super.tick(state, level, pos, random); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + super.tick(state, level, pos, random); + } + } + + @Override + protected void randomTick(@NotNull BlockState state, @NotNull ServerLevel level, @NotNull BlockPos pos, @NotNull RandomSource random) { + try { + behaviorHolder.value().randomTick(this, new Object[]{state, level, pos, random}, () -> { + super.randomTick(state, level, pos, random); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + super.randomTick(state, level, pos, random); + } + } + + @Override + protected void onPlace(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState oldState, boolean movedByPiston) { + try { + behaviorHolder.value().onPlace(this, new Object[]{state, level, pos, oldState, movedByPiston}, () -> { + super.onPlace(state, level, pos, oldState, movedByPiston); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + super.onPlace(state, level, pos, oldState, movedByPiston); + } + } + + @Override + public void onBrokenAfterFall(@NotNull Level level, @NotNull BlockPos pos, @NotNull FallingBlockEntity fallingBlock) { + try { + behaviorHolder.value().onBrokenAfterFall(this, new Object[]{level, pos, fallingBlock}, () -> { + Fallable.super.onBrokenAfterFall(level, pos, fallingBlock); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + Fallable.super.onBrokenAfterFall(level, pos, fallingBlock); + } + } + + @Override + protected boolean canSurvive(@NotNull BlockState state, @NotNull LevelReader level, @NotNull BlockPos pos) { + try { + return behaviorHolder.value().canSurvive(this, new Object[]{state, level, pos}, () -> super.canSurvive(state, level, pos)); + } catch (Exception e) { + e.printStackTrace(); + return super.canSurvive(state, level, pos); + } + } + + @Override + protected BlockState updateShape(@NotNull BlockState state, + @NotNull LevelReader level, + @NotNull ScheduledTickAccess scheduledTickAccess, + @NotNull BlockPos pos, + @NotNull Direction direction, + @NotNull BlockPos neighborPos, + @NotNull BlockState neighborState, + @NotNull RandomSource random) { + try { + if (isNoteBlock && level instanceof ServerLevel serverLevel) { + startNoteBlockChain(direction, serverLevel, pos); + } + return (BlockState) behaviorHolder.value().updateShape(this, new Object[]{state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random}, () -> super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random)); + } catch (Exception e) { + e.printStackTrace(); + return super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random); + } + } + + private static void startNoteBlockChain(Direction direction, ServerLevel serverLevel, BlockPos blockPos) { + int id = direction.get3DDataValue(); + // Y axis + if (id == 0 || id == 1) { + ServerChunkCache chunkSource = serverLevel.chunkSource; + chunkSource.blockChanged(blockPos); + if (id == 1) { + noteBlockChainUpdate(serverLevel, chunkSource, Direction.DOWN, blockPos, 0); + } else { + noteBlockChainUpdate(serverLevel, chunkSource, Direction.UP, blockPos, 0); + } + } + } + + public static void noteBlockChainUpdate(ServerLevel level, ServerChunkCache chunkSource, Direction direction, BlockPos blockPos, int times) { + if (times >= CraftEnginePlugin.maxChainUpdate()) return; + BlockPos relativePos = blockPos.relative(direction); + BlockState state = level.getBlockState(relativePos); + if (NoteBlockUtils.CLIENT_SIDE_NOTE_BLOCKS.contains(state)) { + chunkSource.blockChanged(relativePos); + noteBlockChainUpdate(level, chunkSource, direction, relativePos, times+1); + } + } + + @Override + protected @NotNull FluidState getFluidState(@NotNull BlockState state) { + try { + return (FluidState) behaviorHolder.value().getFluidState(this, new Object[]{state}, () -> super.getFluidState(state)); + } catch (Exception e) { + e.printStackTrace(); + return super.getFluidState(state); + } + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java new file mode 100644 index 000000000..6cb356a90 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java @@ -0,0 +1,103 @@ +package net.momirealms.craftengine.mod; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.CodeSource; +import java.security.ProtectionDomain; +import java.util.List; +import java.util.Set; +import java.util.logging.Logger; + +public final class CraftEnginePlugin implements IMixinConfigPlugin { + public static final Logger LOGGER = Logger.getLogger(CraftEnginePlugin.class.getName()); + private static int vanillaRegistrySize; + private static boolean isSuccessfullyRegistered = false; + private static int maxChainUpdate = 32; + + public static void setVanillaRegistrySize(int vanillaRegistrySize) { + CraftEnginePlugin.vanillaRegistrySize = vanillaRegistrySize; + } + + public static void setIsSuccessfullyRegistered(boolean isSuccessfullyRegistered) { + CraftEnginePlugin.isSuccessfullyRegistered = isSuccessfullyRegistered; + } + + public static int maxChainUpdate() { + return maxChainUpdate; + } + + public static void setMaxChainUpdate(int maxChainUpdate) { + CraftEnginePlugin.maxChainUpdate = maxChainUpdate; + } + + @Override + public void onLoad(final @NotNull String mixinPackage) { + } + + @Override + public @Nullable String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(@NotNull String targetClassName, + @NotNull String mixinClassName) { + return true; + } + + @Override + public void acceptTargets(@NotNull Set myTargets, + @NotNull Set otherTargets) { + } + + @Override + public @Nullable List getMixins() { + return null; + } + + @Override + public void preApply(@NotNull String targetClassName, + @NotNull ClassNode targetClass, + @NotNull String mixinClassName, + @NotNull IMixinInfo mixinInfo) { + } + + @Override + public void postApply(@NotNull String targetClassName, + @NotNull ClassNode targetClass, + @NotNull String mixinClassName, + @NotNull IMixinInfo mixinInfo) { + } + + public static Path getPluginFolderPath() { + ProtectionDomain protectionDomain = CraftEnginePlugin.class.getProtectionDomain(); + CodeSource codeSource = protectionDomain.getCodeSource(); + URL jarUrl = codeSource.getLocation(); + try { + return Paths.get(jarUrl.toURI()).getParent().getParent().resolve("plugins"); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + return null; + } + + public static Path getCraftEngineMappingsPath() { + return getPluginFolderPath() + .resolve("CraftEngine") + .resolve("mappings.yml"); + } + + public static Path getCraftEngineAdditionalBlocksPath() { + return getPluginFolderPath() + .resolve("CraftEngine") + .resolve("additional-real-blocks.yml"); + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/MixinStoneBlockShape.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/MixinStoneBlockShape.java new file mode 100644 index 000000000..2f163d3dc --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/MixinStoneBlockShape.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.mod; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.momirealms.craftengine.shared.block.BlockShape; + +public class MixinStoneBlockShape implements BlockShape { + private final BlockState rawBlockState; + + public MixinStoneBlockShape(BlockState rawBlockState) { + this.rawBlockState = rawBlockState; + } + + @Override + public Object getShape(Object thisObj, Object[] args) { + return rawBlockState.getShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/NoteBlockUtils.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/NoteBlockUtils.java new file mode 100644 index 000000000..aa3618ece --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/NoteBlockUtils.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.mod; + +import net.minecraft.world.level.block.state.BlockState; + +import java.util.HashSet; +import java.util.Set; + +public class NoteBlockUtils { + + public static final Set CLIENT_SIDE_NOTE_BLOCKS = new HashSet<>(); +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/mixin/MixinBlocks.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/mixin/MixinBlocks.java new file mode 100644 index 000000000..750e3a527 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/mixin/MixinBlocks.java @@ -0,0 +1,131 @@ +package net.momirealms.craftengine.mod.mixin; + +import com.mojang.brigadier.StringReader; +import net.minecraft.commands.arguments.blocks.BlockStateParser; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.momirealms.craftengine.mod.CraftEngineBlock; +import net.momirealms.craftengine.mod.CraftEnginePlugin; +import net.momirealms.craftengine.mod.NoteBlockUtils; +import org.bukkit.configuration.file.YamlConfiguration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +@Mixin(value = Blocks.class) +public abstract class MixinBlocks { + + @Inject(method = "", at = @At("RETURN")) + private static void onBlocksInit(CallbackInfo ci) { + CraftEnginePlugin.setVanillaRegistrySize(Block.BLOCK_STATE_REGISTRY.size()); + ResourceLocation noteBlock = ResourceLocation.fromNamespaceAndPath("minecraft", "note_block"); + Map map = loadMappingsAndAdditionalBlocks(); + for (Map.Entry entry : map.entrySet()) { + ResourceLocation replacedBlockId = entry.getKey(); + boolean isNoteBlock = replacedBlockId.equals(noteBlock); + Block replacedBlock = BuiltInRegistries.BLOCK.getValue(replacedBlockId); + for (int i = 0; i < entry.getValue(); i++) { + ResourceLocation location = ResourceLocation.fromNamespaceAndPath("craftengine", replacedBlockId.getPath() + "_" + i); + ResourceKey resourceKey = ResourceKey.create(Registries.BLOCK, location); + BlockBehaviour.Properties properties = BlockBehaviour.Properties.of() + .setId(resourceKey); + if (!replacedBlock.hasCollision) { + properties.noCollission(); + } + CraftEngineBlock block = new CraftEngineBlock(properties); + if (isNoteBlock) { + block.setNoteBlock(true); + NoteBlockUtils.CLIENT_SIDE_NOTE_BLOCKS.add(block.defaultBlockState()); + } + Registry.register(BuiltInRegistries.BLOCK, location, block); + Block.BLOCK_STATE_REGISTRY.add(block.defaultBlockState()); + } + } + NoteBlockUtils.CLIENT_SIDE_NOTE_BLOCKS.addAll(Blocks.NOTE_BLOCK.getStateDefinition().getPossibleStates()); + if (!map.isEmpty()) { + CraftEnginePlugin.setIsSuccessfullyRegistered(true); + } + } + + private static Map loadMappingsAndAdditionalBlocks() { + Path mappingPath = CraftEnginePlugin.getCraftEngineMappingsPath(); + if (!Files.exists(mappingPath)) return Map.of(); + YamlConfiguration mappings = YamlConfiguration.loadConfiguration(mappingPath.toFile()); + Map blockStateMappings = loadBlockStateMappings(mappings); + validateBlockStateMappings(blockStateMappings); + Map blockTypeCounter = new LinkedHashMap<>(); + Map appearanceMapper = new HashMap<>(); + for (Map.Entry entry : blockStateMappings.entrySet()) { + processBlockStateMapping(entry, appearanceMapper, blockTypeCounter); + } + YamlConfiguration additionalYaml = YamlConfiguration.loadConfiguration(CraftEnginePlugin.getCraftEngineAdditionalBlocksPath().toFile()); + return buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); + } + + private static Map loadBlockStateMappings(YamlConfiguration mappings) { + Map blockStateMappings = new LinkedHashMap<>(); + for (Map.Entry entry : mappings.getValues(false).entrySet()) { + if (entry.getValue() instanceof String afterValue) { + blockStateMappings.put(entry.getKey(), afterValue); + } + } + return blockStateMappings; + } + + private static void validateBlockStateMappings(Map blockStateMappings) { + Map temp = new HashMap<>(blockStateMappings); + for (Map.Entry entry : temp.entrySet()) { + String state = entry.getValue(); + blockStateMappings.remove(state); + } + } + + private static LinkedHashMap buildRegisteredRealBlockSlots(Map counter, YamlConfiguration additionalYaml) { + LinkedHashMap map = new LinkedHashMap<>(); + for (Map.Entry entry : counter.entrySet()) { + String id = entry.getKey().toString(); + int additionalStates = additionalYaml.getInt(id, 0); + int internalIds = entry.getValue() + additionalStates; + map.put(entry.getKey(), internalIds); + } + return map; + } + + private static void processBlockStateMapping(Map.Entry entry, Map mapper, Map counter) { + BlockState before = createBlockData(entry.getKey()); + BlockState after = createBlockData(entry.getValue()); + if (before == null || after == null) return; + + int beforeId = Block.BLOCK_STATE_REGISTRY.getId(before); + int afterId = Block.BLOCK_STATE_REGISTRY.getId(after); + + Integer previous = mapper.put(beforeId, afterId); + if (previous == null) { + counter.compute(BuiltInRegistries.BLOCK.getKey(before.getBlock()), (k, count) -> count == null ? 1 : count + 1); + } + } + + private static BlockState createBlockData(String blockState) { + try { + StringReader reader = new StringReader(blockState); + BlockStateParser.BlockResult arg = BlockStateParser.parseForBlock(BuiltInRegistries.BLOCK, reader, false); + return arg.blockState(); + } catch (Exception e) { + return null; + } + } +} diff --git a/server-mod/src/main/resources/ignite.mod.json b/server-mod/src/main/resources/ignite.mod.json new file mode 100644 index 000000000..a353e9e4d --- /dev/null +++ b/server-mod/src/main/resources/ignite.mod.json @@ -0,0 +1,7 @@ +{ + "id": "craftengine", + "version": "${project_version}", + "mixins": [ + "mixins.craftengine.json" + ] +} diff --git a/server-mod/src/main/resources/mixins.craftengine.json b/server-mod/src/main/resources/mixins.craftengine.json new file mode 100644 index 000000000..2e9a8087a --- /dev/null +++ b/server-mod/src/main/resources/mixins.craftengine.json @@ -0,0 +1,11 @@ +{ + "required": true, + "minVersion": "0.8.7", + "package": "net.momirealms.craftengine.mod.mixin", + "plugin": "net.momirealms.craftengine.mod.CraftEnginePlugin", + "target": "@env(DEFAULT)", + "compatibilityLevel": "JAVA_21", + "server": [ + "MixinBlocks" + ] +} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..26b036286 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,13 @@ +rootProject.name = "craft-engine" +include(":shared") +include(":core") +include(":bukkit") +include(":bukkit:legacy") +include(":bukkit-loader") +include(":server-mod") +pluginManagement { + plugins { + kotlin("jvm") version "2.0.20" + } +} + diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts new file mode 100644 index 000000000..da6df7714 --- /dev/null +++ b/shared/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("java-library") +} + +repositories { + mavenCentral() +} + +dependencies { +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/ObjectHolder.java b/shared/src/main/java/net/momirealms/craftengine/shared/ObjectHolder.java new file mode 100644 index 000000000..cd3f1bb87 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/ObjectHolder.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.shared; + +public class ObjectHolder { + private T value; + + public ObjectHolder(T value) { + this.value = value; + } + + public ObjectHolder() { + } + + public T value() { + return value; + } + + public void bindValue(T value) { + this.value = value; + } +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BehaviorHolder.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BehaviorHolder.java new file mode 100644 index 000000000..097b5bbde --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BehaviorHolder.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.shared.block; + +import net.momirealms.craftengine.shared.ObjectHolder; + +public interface BehaviorHolder { + + ObjectHolder getBehaviorHolder(); +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java new file mode 100644 index 000000000..f49ecf8db --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.shared.block; + +import java.util.concurrent.Callable; + +public abstract class BlockBehavior { + + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return superMethod.call(); + } + + public Object getFluidState(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return superMethod.call(); + } + + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public boolean canSurvive(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return (boolean) superMethod.call(); + } + + public void onBrokenAfterFall(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public void onLand(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java new file mode 100644 index 000000000..636e09ace --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.shared.block; + +public interface BlockShape { + + Object getShape(Object thisObj, Object[] args) throws Exception; +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/EmptyBlockBehavior.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/EmptyBlockBehavior.java new file mode 100644 index 000000000..5a0c6bde0 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/EmptyBlockBehavior.java @@ -0,0 +1,5 @@ +package net.momirealms.craftengine.shared.block; + +public class EmptyBlockBehavior extends BlockBehavior { + public static final EmptyBlockBehavior INSTANCE = new EmptyBlockBehavior(); +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/NoteBlockIndicator.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/NoteBlockIndicator.java new file mode 100644 index 000000000..8b52adfa1 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/NoteBlockIndicator.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.shared.block; + +public interface NoteBlockIndicator { + + boolean isNoteBlock(); +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/ShapeHolder.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/ShapeHolder.java new file mode 100644 index 000000000..3a3b12b5b --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/ShapeHolder.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.shared.block; + +import net.momirealms.craftengine.shared.ObjectHolder; + +public interface ShapeHolder { + + ObjectHolder getShapeHolder(); +}

, I> { + protected final P plugin; + + protected ItemFactory(P plugin) { + this.plugin = plugin; + } + + public Item wrap(I item) { + Objects.requireNonNull(item, "item"); + return new AbstractItem<>(this, wrapInternal(item)); + } + + protected abstract ItemWrapper wrapInternal(I item); + + protected abstract Object getTag(ItemWrapper item, Object... path); + + protected abstract void setTag(ItemWrapper item, Object value, Object... path); + + protected abstract boolean hasTag(ItemWrapper item, Object... path); + + protected abstract boolean removeTag(ItemWrapper item, Object... path); + + protected abstract void setComponent(ItemWrapper item, String type, Object value); + + protected abstract Object getComponent(ItemWrapper item, String type); + + protected abstract boolean hasComponent(ItemWrapper item, String type); + + protected abstract void removeComponent(ItemWrapper item, String type); + + protected abstract void update(ItemWrapper item); + + protected abstract I load(ItemWrapper item); + + protected abstract I getItem(ItemWrapper item); + + protected abstract I loadCopy(ItemWrapper item); + + protected abstract void customModelData(ItemWrapper item, Integer data); + + protected abstract Optional customModelData(ItemWrapper item); + + protected abstract void displayName(ItemWrapper item, String json); + + protected abstract Optional displayName(ItemWrapper item); + + protected abstract void skull(ItemWrapper item, String skullData); + + protected abstract Optional> lore(ItemWrapper item); + + protected abstract void lore(ItemWrapper item, List lore); + + protected abstract boolean unbreakable(ItemWrapper item); + + protected abstract void unbreakable(ItemWrapper item, boolean unbreakable); + + protected abstract Optional glint(ItemWrapper item); + + protected abstract void glint(ItemWrapper item, Boolean glint); + + protected abstract Optional damage(ItemWrapper item); + + protected abstract void damage(ItemWrapper item, Integer damage); + + protected abstract Optional maxDamage(ItemWrapper item); + + protected abstract void maxDamage(ItemWrapper item, Integer damage); + + protected abstract void enchantments(ItemWrapper item, List enchantments); + + protected abstract void storedEnchantments(ItemWrapper item, List enchantments); + + protected abstract void addEnchantment(ItemWrapper item, Enchantment enchantment); + + protected abstract void addStoredEnchantment(ItemWrapper item, Enchantment enchantment); + + protected abstract Optional getEnchantment(ItemWrapper item, Key key); + + protected abstract void itemFlags(ItemWrapper item, List flags); + + protected abstract Key id(ItemWrapper item); + + protected abstract Optional customId(ItemWrapper item); + + protected abstract Key vanillaId(ItemWrapper item); + + protected abstract int maxStackSize(ItemWrapper item); + + protected abstract void maxStackSize(ItemWrapper item, Integer maxStackSize); + + protected abstract boolean is(ItemWrapper item, Key itemTag); + + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java new file mode 100644 index 000000000..464b94248 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.util.Key; + +public class ItemKeys { + public static final Key TRIDENT = Key.of("minecraft:trident"); + public static final Key SHIELD = Key.of("minecraft:shield"); + public static final Key BOW = Key.of("minecraft:bow"); + public static final Key CROSSBOW = Key.of("minecraft:crossbow"); + public static final Key FISHING_ROD = Key.of("minecraft:fishing_rod"); + public static final Key ELYTRA = Key.of("minecraft:elytra"); + public static final Key GOAT_HORN = Key.of("minecraft:goat_horn"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java new file mode 100644 index 000000000..ae3821399 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.pack.LegacyOverridesModel; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.pack.generator.ModelGenerator; +import net.momirealms.craftengine.core.pack.model.ItemModel; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import javax.annotation.Nullable; +import java.util.*; + +public interface ItemManager extends Reloadable, ModelGenerator, ConfigSectionParser { + String CONFIG_SECTION_NAME = "items"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Map> legacyItemOverrides(); + + Map> modernItemOverrides(); + + T buildCustomItemStack(Key id, @Nullable Player player); + + T buildItemStack(Key id, @Nullable Player player); + + Item createCustomWrappedItem(Key id, @Nullable Player player); + + Item createWrappedItem(Key id, @Nullable Player player); + + Item wrap(T itemStack); + + Collection items(); + + Key itemId(T itemStack); + + Key customItemId(T itemStack); + + Optional> getCustomItem(Key key); + + Optional> getVanillaItem(Key key); + + default Optional> getBuildableItem(Key key) { + Optional> item = getCustomItem(key); + if (item.isPresent()) { + return item; + } + return getVanillaItem(key); + } + + List> tagToItems(Key tag); + + List> tagToVanillaItems(Key tag); + + List> tagToCustomItems(Key tag); + + default int loadingSequence() { + return LoadingSequence.ITEM; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java new file mode 100644 index 000000000..49af43621 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.item; + +public interface ItemWrapper { + + I getItem(); + + void update(); + + I load(); + + I loadCopy(); + + Object getLiteralObject(); + + boolean set(Object value, Object... path); + + boolean add(Object value, Object... path); + + V get(Object... path); + + V getExact(Object... path); + + boolean remove(Object... path); + + boolean hasTag(Object... path); + + void removeComponent(Object type); + + boolean hasComponent(Object type); + + void setComponent(Object type, Object value); + + Object getComponent(Object type); + + int count(); + + void count(int amount); + + ItemWrapper copyWithCount(int count); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/EmptyItemBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/EmptyItemBehavior.java new file mode 100644 index 000000000..e9ee30aaf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/EmptyItemBehavior.java @@ -0,0 +1,5 @@ +package net.momirealms.craftengine.core.item.behavior; + +public class EmptyItemBehavior extends ItemBehavior { + public static final EmptyItemBehavior INSTANCE = new EmptyItemBehavior(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java new file mode 100644 index 000000000..85c5c0a09 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.item.behavior; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.world.CEWorld; + +public abstract class ItemBehavior { + + public InteractionResult useOnBlock(UseOnContext context) { + return InteractionResult.PASS; + } + + public InteractionResult use(CEWorld context, Player player, InteractionHand hand) { + return InteractionResult.PASS; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviorFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviorFactory.java new file mode 100644 index 000000000..96a41a889 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviorFactory.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.item.behavior; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public interface ItemBehaviorFactory { + + ItemBehavior create(Key id, Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java new file mode 100644 index 000000000..9f751de2f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.item.behavior; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class ItemBehaviors { + + public static void register(Key key, ItemBehaviorFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_BEHAVIOR_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.ITEM_BEHAVIOR_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static ItemBehavior fromMap(Key id, Map map) { + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("behavior type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + ItemBehaviorFactory factory = BuiltInRegistries.ITEM_BEHAVIOR_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown behavior type: " + type); + } + return factory.create(id, map); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/BlockPlaceContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/BlockPlaceContext.java new file mode 100644 index 000000000..c310107e0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/BlockPlaceContext.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.item.context; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.World; + +public class BlockPlaceContext extends UseOnContext { + private final BlockPos relativePos; + protected boolean replaceClicked = true; + + public BlockPlaceContext(UseOnContext context) { + this(context.getLevel(), context.getPlayer(), context.getHand(), context.getItem(), context.getHitResult()); + } + + public BlockPlaceContext(World world, Player player, InteractionHand hand, Item stack, BlockHitResult hit) { + super(world, player, hand, stack, hit); + this.relativePos = hit.getBlockPos().relative(hit.getDirection()); + this.replaceClicked = world.getBlockAt(hit.getBlockPos()).canBeReplaced(this); + } + + @Override + public BlockPos getClickedPos() { + return this.replaceClicked ? super.getClickedPos() : this.relativePos; + } + + public boolean canPlace() { + return this.replaceClicked || this.getLevel().getBlockAt(this.getClickedPos()).canBeReplaced(this); + } + + public boolean isWaterSource() { + return this.getLevel().getBlockAt(this.getClickedPos()).isWaterSource(this); + } + + public boolean replacingClickedOnBlock() { + return this.replaceClicked; + } + + public Direction getNearestLookingDirection() { + return Direction.orderedByNearest(this.getPlayer())[0]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/DirectionalPlaceContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/DirectionalPlaceContext.java new file mode 100644 index 000000000..afde21e42 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/DirectionalPlaceContext.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.core.item.context; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; + +public class DirectionalPlaceContext extends BlockPlaceContext { + private final Direction direction; + + public DirectionalPlaceContext(World world, BlockPos pos, Direction facing, Item stack, Direction side) { + super(world, null, InteractionHand.MAIN_HAND, stack, new BlockHitResult(Vec3d.atBottomCenterOf(pos), side, pos, false)); + this.direction = facing; + } + + @Override + public BlockPos getClickedPos() { + return this.getHitResult().getBlockPos(); + } + + @Override + public boolean canPlace() { + return this.getLevel().getBlockAt(this.getHitResult().getBlockPos()).canBeReplaced(this); + } + + @Override + public boolean replacingClickedOnBlock() { + return this.canPlace(); + } + + public Direction getNearestLookingDirection() { + return Direction.DOWN; + } + + public Direction[] getNearestLookingDirections() { + return switch (this.direction) { + case UP -> + new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST}; + case NORTH -> + new Direction[]{Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.WEST, Direction.UP, Direction.SOUTH}; + case SOUTH -> + new Direction[]{Direction.DOWN, Direction.SOUTH, Direction.EAST, Direction.WEST, Direction.UP, Direction.NORTH}; + case WEST -> + new Direction[]{Direction.DOWN, Direction.WEST, Direction.SOUTH, Direction.UP, Direction.NORTH, Direction.EAST}; + case EAST -> + new Direction[]{Direction.DOWN, Direction.EAST, Direction.SOUTH, Direction.UP, Direction.NORTH, Direction.WEST}; + default -> + new Direction[]{Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.UP}; + }; + } + + @Override + public Direction getHorizontalDirection() { + return this.direction.axis() == Direction.Axis.Y ? Direction.NORTH : this.direction; + } + + @Override + public boolean isSecondaryUseActive() { + return false; + } + + @Override + public float getRotation() { + return (float) (this.direction.data2d() * 90); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java new file mode 100644 index 000000000..82bd60a38 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.item.context; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; + +public class UseOnContext { + private final Player player; + private final InteractionHand hand; + private final BlockHitResult hitResult; + private final World level; + private final Item itemStack; + + public UseOnContext(Player player, InteractionHand hand, BlockHitResult hit) { + this(player.level(), player, hand, player.getItemInHand(hand), hit); + } + + public UseOnContext(World world, Player player, InteractionHand hand, Item stack, BlockHitResult hit) { + this.player = player; + this.hand = hand; + this.hitResult = hit; + this.itemStack = stack; + this.level = world; + } + + protected final BlockHitResult getHitResult() { + return this.hitResult; + } + + public BlockPos getClickedPos() { + return this.hitResult.getBlockPos(); + } + + public Direction getClickedFace() { + return this.hitResult.getDirection(); + } + + public Vec3d getClickLocation() { + return this.hitResult.getLocation(); + } + + public boolean isInside() { + return this.hitResult.isInside(); + } + + public Item getItem() { + return this.itemStack; + } + + public Player getPlayer() { + return this.player; + } + + public InteractionHand getHand() { + return this.hand; + } + + public World getLevel() { + return this.level; + } + + public Direction getHorizontalDirection() { + return this.player == null ? Direction.NORTH : this.player.getDirection(); + } + + public boolean isSecondaryUseActive() { + return this.player != null && this.player.isSecondaryUseActive(); + } + + public float getRotation() { + return this.player == null ? 0.0F : this.player.getYRot(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java new file mode 100644 index 000000000..a9d49c43a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.item.modifier; + +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.YamlUtils; + +import java.util.Map; + +public class ComponentModifier implements ItemModifier { + private final Map parameters; + + public ComponentModifier(Map parameters) { + this.parameters = parameters; + } + + public ComponentModifier(Section section) { + this.parameters = YamlUtils.sectionToMap(section); + } + + @Override + public String name() { + return "components"; + } + + @Override + public void apply(Item item, Player player) { + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + item.setComponent(key, value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java new file mode 100644 index 000000000..818781117 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; + +public class CustomModelDataModifier implements ItemModifier { + private final int parameter; + + public CustomModelDataModifier(int parameter) { + this.parameter = parameter; + } + + @Override + public String name() { + return "custom-model-data"; + } + + @Override + public void apply(Item item, Player player) { + item.customModelData(parameter); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java new file mode 100644 index 000000000..a5a0fd458 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.minimessage.ImageTag; +import net.momirealms.craftengine.core.plugin.minimessage.PlaceholderTag; +import net.momirealms.craftengine.core.util.AdventureHelper; + +public class DisplayNameModifier implements ItemModifier { + private final String parameter; + + public DisplayNameModifier(String parameter) { + this.parameter = parameter; + } + + @Override + public String name() { + return "display-name"; + } + + @Override + public void apply(Item item, Player player) { + item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize( + parameter, ImageTag.instance(), new PlaceholderTag(player)))); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java new file mode 100644 index 000000000..34682960c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; + +public class IdModifier implements ItemModifier { + private final Key parameter; + + public IdModifier(Key parameter) { + this.parameter = parameter; + } + + @Override + public String name() { + return "tag"; + } + + @Override + public void apply(Item item, Player player) { + item.setTag(parameter.toString(), "craftengine:id"); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModifier.java new file mode 100644 index 000000000..8b61a0c43 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModifier.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; + +public interface ItemModifier { + + String name(); + + void apply(Item item, Player player); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java new file mode 100644 index 000000000..72f619170 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.minimessage.ImageTag; +import net.momirealms.craftengine.core.plugin.minimessage.PlaceholderTag; +import net.momirealms.craftengine.core.util.AdventureHelper; + +import java.util.List; + +public class LoreModifier implements ItemModifier { + private final List parameter; + + public LoreModifier(List parameter) { + this.parameter = parameter; + } + + @Override + public String name() { + return "lore"; + } + + @Override + public void apply(Item item, Player player) { + item.lore(parameter.stream().map(it -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize( + it, ImageTag.instance(), new PlaceholderTag(player)))).toList()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java new file mode 100644 index 000000000..4cb36662f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java @@ -0,0 +1,105 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.TypeUtils; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class TagsModifier implements ItemModifier { + private final Map parameters; + + public TagsModifier(Map parameters) { + this.parameters = mapToMap(parameters); + } + + @Override + public String name() { + return "tags"; + } + + @Override + public void apply(Item item, Player player) { + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + item.setTag(value, key); + } + } + + private static Map mapToMap(final Map source) { + Map resultMap = new LinkedHashMap<>(); + recursiveMapProcessing(source, resultMap); + return resultMap; + } + + private static void recursiveMapProcessing( + final Map sourceMap, + final Map targetMap + ) { + for (Map.Entry entry : sourceMap.entrySet()) { + processMapEntry(entry.getKey(), entry.getValue(), targetMap); + } + } + + private static void processMapEntry( + final String key, + final Object value, + final Map targetMap + ) { + if (value instanceof Map) { + handleNestedMap(key, MiscUtils.castToMap(value, false), targetMap); + } else if (value instanceof String) { + handleStringValue(key, (String) value, targetMap); + } else { + targetMap.put(key, value); + } + } + + private static void handleNestedMap( + final String key, + final Map nestedSource, + final Map parentMap + ) { + Map nestedTarget = new LinkedHashMap<>(); + parentMap.put(key, nestedTarget); + recursiveMapProcessing(nestedSource, nestedTarget); + } + + private static void handleStringValue( + final String key, + final String value, + final Map targetMap + ) { + ParsedValue parsed = tryParseTypedValue(value); + targetMap.put(key, parsed.success ? parsed.result : value); + } + + private static ParsedValue tryParseTypedValue(final String str) { + if (str.length() < 3 || str.charAt(0) != '(') { + return ParsedValue.FAILURE; + } + + int closingBracketPos = str.indexOf(')', 1); + if (closingBracketPos == -1 || closingBracketPos + 2 > str.length()) { + return ParsedValue.FAILURE; + } + + if (str.charAt(closingBracketPos + 1) != ' ') { + return ParsedValue.FAILURE; + } + + String typeMarker = str.substring(1, closingBracketPos); + String content = str.substring(closingBracketPos + 2); + return new ParsedValue( + true, + TypeUtils.castBasicTypes(content, typeMarker) + ); + } + + private record ParsedValue(boolean success, Object result) { + static final ParsedValue FAILURE = new ParsedValue(false, null); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java new file mode 100644 index 000000000..579896e58 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.item.recipe; + +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractRecipe implements Recipe { + protected RecipeCategory category; + protected String group; + + protected AbstractRecipe(RecipeCategory category, String group) { + this.category = category; + this.group = group; + } + + @Override + @Nullable + public RecipeCategory category() { + return category; + } + + @Override + @Nullable + public String group() { + return group; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java new file mode 100644 index 000000000..968c0e885 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingTableRecipe.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.item.recipe; + +public abstract class CraftingTableRecipe extends AbstractRecipe { + + protected CraftingTableRecipe(RecipeCategory category, String group) { + super(category, group); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomRecipeResult.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomRecipeResult.java new file mode 100644 index 000000000..6fc65f860 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomRecipeResult.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.BuildableItem; + +public record CustomRecipeResult(BuildableItem item, int count) { + + public T buildItemStack(Player player) { + return item.buildItemStack(player, count); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java new file mode 100644 index 000000000..f75cc0f2a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java @@ -0,0 +1,255 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomShapedRecipe extends CraftingTableRecipe { + public static final Factory FACTORY = new Factory>(); + private final ParsedPattern parsedPattern; + private final Pattern pattern; + private final CustomRecipeResult result; + + public CustomShapedRecipe(RecipeCategory category, String group, Pattern pattern, CustomRecipeResult result) { + super(category, group); + this.pattern = pattern; + this.parsedPattern = pattern.parse(); + this.result = result; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return this.parsedPattern.matches((CraftingInput) input); + } + + @Override + public T getResult(Player player) { + return result.buildItemStack(player); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SHAPED; + } + + public Pattern pattern() { + return pattern; + } + + public record Pattern(String[] pattern, Map> ingredients) { + + public ParsedPattern parse() { + String[] shrunk = shrink(pattern); + return new ParsedPattern<>(shrunk[0].length(), shrunk.length, + toIngredientList( + shrunk, + ingredients + )); + } + } + + public static class ParsedPattern { + private final int width; + private final int height; + private final List>> ingredients; + private final int ingredientCount; + private final boolean symmetrical; + + public ParsedPattern(int width, int height, List>> ingredients) { + this.height = height; + this.width = width; + this.ingredientCount = (int) ingredients.stream().flatMap(Optional::stream).count(); + this.symmetrical = isSymmetrical(width, height, ingredients); + this.ingredients = ingredients; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public boolean matches(CraftingInput input) { + if (input.ingredientCount() == this.ingredientCount) { + if (input.width() == this.width && input.height() == this.height) { + if (!this.symmetrical && this.matches(input, true)) { + return true; + } + return this.matches(input, false); + } + } + return false; + } + + private boolean matches(CraftingInput input, boolean mirrored) { + for (int i = 0; i < this.height; i++) { + for (int j = 0; j < this.width; j++) { + Optional> optional; + if (mirrored) { + optional = this.ingredients.get(this.width - j - 1 + i * this.width); + } else { + optional = this.ingredients.get(j + i * this.width); + } + OptimizedIDItem itemStack = input.getItem(j, i); + if (!Ingredient.isInstance(optional, itemStack)) { + return false; + } + } + } + return true; + } + + private static boolean isSymmetrical(int width, int height, List list) { + if (width != 1) { + int i = width / 2; + for (int j = 0; j < height; j++) { + for (int k = 0; k < i; k++) { + int l = width - 1 - k; + T o1 = list.get(k + j * width); + T o2 = list.get(l + j * width); + if (!o1.equals(o2)) { + return false; + } + } + } + } + return true; + } + } + + public static class Factory implements RecipeFactory { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe create(Map arguments) { + List pattern = MiscUtils.getAsStringList(arguments.get("pattern")); + if (pattern.isEmpty()) { + throw new IllegalArgumentException("pattern cannot be empty"); + } + if (!validatePattern(pattern)) { + throw new IllegalArgumentException("Invalid pattern: " + pattern); + } + Map ingredientMap = MiscUtils.castToMap(arguments.get("ingredients"), true); + if (ingredientMap == null) { + throw new IllegalArgumentException("ingredients cannot be empty"); + } + RecipeCategory recipeCategory = arguments.containsKey("category") ? RecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + Map> ingredients = new HashMap<>(); + for (Map.Entry entry : ingredientMap.entrySet()) { + String key = entry.getKey(); + if (key.length() != 1) { + throw new IllegalArgumentException("Invalid key: " + key); + } + char ch = key.charAt(0); + List items = MiscUtils.getAsStringList(entry.getValue()); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + ingredients.put(ch, Ingredient.of(holders)); + } + return new CustomShapedRecipe( + recipeCategory, + group, + new Pattern<>(pattern.toArray(new String[0]), ingredients), + parseResult(arguments) + ); + } + + private boolean validatePattern(List pattern) { + String first = pattern.get(0); + int length = first.length(); + for (String s : pattern) { + if (s.length() != length) { + return false; + } + if (s.length() > 3) { + return false; + } + } + return pattern.size() <= 3; + } + } + + public static List>> toIngredientList(String[] pattern, Map> ingredients) { + List>> result = new ArrayList<>(); + String[] shrunkPattern = shrink(pattern); + for (String pa : shrunkPattern) { + for (int j = 0; j < pa.length(); j++) { + char ch = pa.charAt(j); + if (ch == ' ') { + result.add(Optional.empty()); + } else { + Optional> ingredient = Optional.ofNullable(ingredients.get(ch)); + if (ingredient.isEmpty()) { + throw new IllegalArgumentException("Invalid ingredient: " + ch); + } + result.add(ingredient); + } + } + } + return result; + } + + public static String[] shrink(String[] patterns) { + int minStart = Integer.MAX_VALUE; + int maxEnd = 0; + int leadingEmptyPatterns = 0; + int consecutiveEmptyPatterns = 0; + for (int i = 0; i < patterns.length; i++) { + String pattern = patterns[i]; + minStart = Math.min(minStart, firstNonSpace(pattern)); + int patternEnd = lastNonSpace(pattern); + maxEnd = Math.max(maxEnd, patternEnd); + if (patternEnd < 0) { + if (leadingEmptyPatterns == i) { + leadingEmptyPatterns++; + } + consecutiveEmptyPatterns++; + } else { + consecutiveEmptyPatterns = 0; + } + } + if (patterns.length == consecutiveEmptyPatterns) { + return new String[0]; + } else { + String[] result = new String[patterns.length - consecutiveEmptyPatterns - leadingEmptyPatterns]; + for (int j = 0; j < result.length; j++) { + result[j] = patterns[j + leadingEmptyPatterns].substring(minStart, maxEnd + 1); + } + return result; + } + } + + private static int firstNonSpace(String line) { + int index = 0; + while (index < line.length() && line.charAt(index) == ' ') { + index++; + } + return index; + } + + private static int lastNonSpace(String line) { + int index = line.length() - 1; + while (index >= 0 && line.charAt(index) == ' ') { + index--; + } + return index; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java new file mode 100644 index 000000000..36774f423 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java @@ -0,0 +1,94 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomShapelessRecipe extends CraftingTableRecipe { + public static final Factory FACTORY = new Factory<>(); + private final List> ingredients; + private final PlacementInfo placementInfo; + private final CustomRecipeResult result; + + public CustomShapelessRecipe(RecipeCategory category, String group, List> ingredients, CustomRecipeResult result) { + super(category, group); + this.ingredients = ingredients; + this.result = result; + this.placementInfo = PlacementInfo.create(ingredients); + } + + public PlacementInfo placementInfo() { + return placementInfo; + } + + public List> ingredients() { + return ingredients; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return matches((CraftingInput) input); + } + + private boolean matches(CraftingInput input) { + if (input.ingredientCount() != this.ingredients.size()) { + return false; + } + if (input.size() == 1 && this.ingredients.size() == 1) { + return this.ingredients.get(0).test(input.getItem(0)); + } + return input.finder().canCraft(this); + } + + @Override + public T getResult(Player player) { + return result.buildItemStack(player); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SHAPELESS; + } + + public static class Factory implements RecipeFactory { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe create(Map arguments) { + Map ingredientMap = MiscUtils.castToMap(arguments.get("ingredients"), true); + if (ingredientMap == null) { + throw new IllegalArgumentException("ingredients cannot be empty"); + } + RecipeCategory recipeCategory = arguments.containsKey("category") ? RecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + List> ingredients = new ArrayList<>(); + for (Map.Entry entry : ingredientMap.entrySet()) { + List items = MiscUtils.getAsStringList(entry.getValue()); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + ingredients.add(Ingredient.of(holders)); + } + return new CustomShapelessRecipe( + recipeCategory, + group, + ingredients, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java new file mode 100644 index 000000000..dac02bfb9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; +import java.util.function.Predicate; + +public class Ingredient implements Predicate>, StackedContents.IngredientInfo> { + private final List> items; + + public Ingredient(List> items) { + this.items = items; + } + + public static boolean isInstance(Optional> optionalIngredient, OptimizedIDItem stack) { + return optionalIngredient.map((ingredient) -> ingredient.test(stack)) + .orElseGet(stack::isEmpty); + } + + public static Ingredient of(List> items) { + return new Ingredient<>(items); + } + + public static Ingredient of(Set> items) { + return new Ingredient<>(new ArrayList<>(items)); + } + + @Override + public boolean test(OptimizedIDItem optimizedIDItem) { + for (Holder item : this.items()) { + if (optimizedIDItem.is(item)) { + return true; + } + } + return false; + } + + public List> items() { + return this.items; + } + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", "); + for (Holder item : this.items()) { + joiner.add(item.toString()); + } + return "Ingredient: [" + joiner + "]"; + } + + public boolean isEmpty() { + return this.items().isEmpty(); + } + + @Override + public boolean acceptsItem(Holder entry) { + return this.items.contains(entry); + } +} + + diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java new file mode 100644 index 000000000..7e7750f00 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +public class OptimizedIDItem { + private final T rawItem; + private final Holder idHolder; + + public OptimizedIDItem(Holder idHolder, T rawItem) { + this.idHolder = idHolder; + this.rawItem = rawItem; + } + + public Holder id() { + return idHolder; + } + + public T rawItem() { + return rawItem; + } + + public boolean is(Holder id) { + return idHolder == id; + } + + public boolean isEmpty() { + return idHolder == null; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/PlacementInfo.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/PlacementInfo.java new file mode 100644 index 000000000..69b8f6b43 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/PlacementInfo.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.item.recipe; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; + +import java.util.List; + +public class PlacementInfo { + private final List> ingredients; + private final IntList slotsToIngredientIndex; + + private PlacementInfo(List> ingredients, IntList placementSlots) { + this.ingredients = ingredients; + this.slotsToIngredientIndex = placementSlots; + } + + public static PlacementInfo create(List> ingredients) { + int i = ingredients.size(); + IntList intList = new IntArrayList(i); + for (int j = 0; j < i; j++) { + Ingredient ingredient = ingredients.get(j); + if (ingredient.isEmpty()) { + return new PlacementInfo<>(List.of(), IntList.of()); + } + intList.add(j); + } + return new PlacementInfo<>(ingredients, intList); + } + + public List> ingredients() { + return this.ingredients; + } + + public boolean isImpossibleToPlace() { + return this.slotsToIngredientIndex.isEmpty(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java new file mode 100644 index 000000000..f44d5955c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface Recipe { + + boolean matches(RecipeInput input); + + T getResult(Player player); + + @NotNull + Key type(); + + @Nullable + RecipeCategory category(); + + @Nullable + String group(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeCategory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeCategory.java new file mode 100644 index 000000000..e8d44c57e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeCategory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.item.recipe; + +public enum RecipeCategory { + BUILDING, + REDSTONE, + EQUIPMENT, + MISC +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java new file mode 100644 index 000000000..e1e0ac552 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public interface RecipeFactory { + + Recipe create(Map arguments); + + @SuppressWarnings({"unchecked", "rawtypes"}) + default CustomRecipeResult parseResult(Map arguments) { + Map resultMap = MiscUtils.castToMap(arguments.get("result"), true); + if (resultMap == null) { + throw new IllegalArgumentException("result cannot be empty"); + } + String id = (String) resultMap.get("id"); + if (id == null) { + throw new IllegalArgumentException("result.id cannot be empty"); + } + int count = MiscUtils.getAsInt(resultMap.getOrDefault("count", 1)); + return new CustomRecipeResult( + CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow(() -> new IllegalArgumentException("Unknown recipe result item id: " + id)), + count + ); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java new file mode 100644 index 000000000..4266cf808 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public class RecipeFinder { + private final StackedContents> stackedContents = new StackedContents<>(); + + public void addInput(OptimizedIDItem item) { + if (!item.isEmpty()) { + this.stackedContents.add(item.id(), 1); + } + } + + public boolean canCraft(CustomShapelessRecipe recipe) { + PlacementInfo placementInfo = recipe.placementInfo(); + return !placementInfo.isImpossibleToPlace() && canCraft(placementInfo.ingredients()); + } + + private boolean canCraft(List>> rawIngredients) { + return this.stackedContents.tryPick(rawIngredients); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java new file mode 100644 index 000000000..44909544d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface RecipeManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "recipes"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + boolean isDataPackRecipe(Key key); + + boolean isCustomRecipe(Key key); + + List> getRecipes(Key type); + + @Nullable + Recipe getRecipe(Key type, RecipeInput input); + + void delayedLoad(); + + default int loadingSequence() { + return LoadingSequence.RECIPE; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java new file mode 100644 index 000000000..21d258a69 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class RecipeTypes { + public static final Key SHAPED = Key.of("minecraft:shaped"); + public static final Key SHAPELESS = Key.of("minecraft:shapeless"); + + static { + register(SHAPED, CustomShapedRecipe.FACTORY); + register(SHAPELESS, CustomShapelessRecipe.FACTORY); + } + + public static void register(Key key, RecipeFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.RECIPE_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.RECIPE_FACTORY.location(), key)); + holder.bindValue(factory); + } + + @SuppressWarnings("unchecked") + public static Recipe fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("recipe type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + RecipeFactory factory = (RecipeFactory) BuiltInRegistries.RECIPE_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown recipe type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/StackedContents.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/StackedContents.java new file mode 100644 index 000000000..cf9ff0c43 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/StackedContents.java @@ -0,0 +1,339 @@ +package net.momirealms.craftengine.core.item.recipe; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; + +public class StackedContents { + public final Reference2IntOpenHashMap amounts = new Reference2IntOpenHashMap<>(); + + public void add(T input, int count) { + this.amounts.addTo(input, count); + } + + void take(T input, int count) { + int i = this.amounts.addTo(input, -count); + if (i < count) { + throw new IllegalStateException("Took " + count + " items, but only had " + i); + } + } + + void put(T input, int count) { + this.amounts.addTo(input, count); + } + + boolean hasAtLeast(T input, int minimum) { + return this.amounts.getInt(input) >= minimum; + } + + public boolean tryPick(List> ingredients) { + return new Matcher(ingredients).tryPick(1); + } + + @FunctionalInterface + public interface IngredientInfo { + boolean acceptsItem(T entry); + } + + @FunctionalInterface + public interface Output { + void accept(T item); + } + + List getUniqueAvailableIngredientItems(List> ingredients) { + List list = new ArrayList<>(); + for (Reference2IntMap.Entry entry : amounts.reference2IntEntrySet()) { + if (entry.getIntValue() > 0 && anyIngredientMatches(ingredients, entry.getKey())) { + list.add(entry.getKey()); + } + } + return list; + } + + private static boolean anyIngredientMatches(Iterable> ingredients, T item) { + for (IngredientInfo ingredientInfo : ingredients) { + if (ingredientInfo.acceptsItem(item)) { + return true; + } + } + return false; + } + + public class Matcher { + private final List> ingredients; + private final int ingredientCount; + private final List items; + private final int itemCount; + private final BitSet data; + private final IntList path = new IntArrayList(); + + public Matcher(List> ingredients) { + this.ingredients = ingredients; + this.ingredientCount = ingredients.size(); + this.items = getUniqueAvailableIngredientItems(ingredients); + this.itemCount = this.items.size(); + this.data = new BitSet(this.visitedIngredientCount() + this.visitedItemCount() + this.satisfiedCount() + this.connectionCount() + this.residualCount()); + this.setInitialConnections(); + } + + private void setInitialConnections() { + for (int i = 0; i < this.ingredientCount; i++) { + IngredientInfo ingredientInfo = this.ingredients.get(i); + for (int j = 0; j < this.itemCount; j++) { + if (ingredientInfo.acceptsItem(this.items.get(j))) { + this.setConnection(j, i); + } + } + } + } + + @Nullable + private IntList tryAssigningNewItem(int min) { + this.clearAllVisited(); + for (int i = 0; i < this.itemCount; i++) { + if (hasAtLeast(this.items.get(i), min)) { + IntList intList = this.findNewItemAssignmentPath(i); + if (intList != null) { + return intList; + } + } + } + return null; + } + + @Nullable + private IntList findNewItemAssignmentPath(int itemIndex) { + this.path.clear(); + this.visitItem(itemIndex); + this.path.add(itemIndex); + + while (!this.path.isEmpty()) { + int currentPathSize = this.path.size(); + if (isPathIndexItem(currentPathSize - 1)) { + int currentItem = this.path.getInt(currentPathSize - 1); + for (int ingredientIndex = 0; ingredientIndex < this.ingredientCount; ingredientIndex++) { + if (!this.hasVisitedIngredient(ingredientIndex) && + this.hasConnection(currentItem, ingredientIndex) && + !this.isAssigned(currentItem, ingredientIndex)) { + this.visitIngredient(ingredientIndex); + this.path.add(ingredientIndex); + break; + } + } + } else { + int currentIngredient = this.path.getInt(currentPathSize - 1); + if (!this.isSatisfied(currentIngredient)) { + return this.path; + } + for (int itemIndexCandidate = 0; itemIndexCandidate < this.itemCount; itemIndexCandidate++) { + if (!this.hasVisitedItem(itemIndexCandidate) && + this.isAssigned(itemIndexCandidate, currentIngredient)) { + assert this.hasConnection(itemIndexCandidate, currentIngredient); + + this.visitItem(itemIndexCandidate); + this.path.add(itemIndexCandidate); + break; + } + } + } + int newPathSize = this.path.size(); + if (newPathSize == currentPathSize) { + this.path.removeInt(newPathSize - 1); + } + } + return null; + } + + public boolean tryPick(int quantity) { + int assignedIngredientsCount = 0; + while (true) { + IntList assignmentPath = this.tryAssigningNewItem(quantity); + if (assignmentPath == null) { + boolean allIngredientsTried = assignedIngredientsCount == this.ingredientCount; + this.clearAllVisited(); + this.clearSatisfied(); + + for (int ingredientIndex = 0; ingredientIndex < this.ingredientCount; ingredientIndex++) { + for (int itemIndex = 0; itemIndex < this.itemCount; itemIndex++) { + if (this.isAssigned(itemIndex, ingredientIndex)) { + this.unassign(itemIndex, ingredientIndex); + StackedContents.this.put(this.items.get(itemIndex), quantity); + break; + } + } + } + + assert this.data.get(this.residualOffset(), this.residualOffset() + this.residualCount()).isEmpty(); + return allIngredientsTried; + } + + int firstItemIndex = assignmentPath.getInt(0); + StackedContents.this.take(this.items.get(firstItemIndex), quantity); + + int lastIngredientIndex = assignmentPath.size() - 1; + this.setSatisfied(assignmentPath.getInt(lastIngredientIndex)); + assignedIngredientsCount++; + + for (int pathIndex = 0; pathIndex < assignmentPath.size() - 1; pathIndex++) { + if (isPathIndexItem(pathIndex)) { + int itemIndex = assignmentPath.getInt(pathIndex); + int ingredientIndex = assignmentPath.getInt(pathIndex + 1); + this.assign(itemIndex, ingredientIndex); + } else { + int ingredientIndex = assignmentPath.getInt(pathIndex + 1); + int itemIndex = assignmentPath.getInt(pathIndex); + this.unassign(itemIndex, ingredientIndex); + } + } + } + } + + private static boolean isPathIndexItem(int index) { + return (index & 1) == 0; + } + + private int visitedIngredientOffset() { + return 0; + } + + private int visitedIngredientCount() { + return this.ingredientCount; + } + + private int visitedItemOffset() { + return this.visitedIngredientOffset() + this.visitedIngredientCount(); + } + + private int visitedItemCount() { + return this.itemCount; + } + + private int satisfiedOffset() { + return this.visitedItemOffset() + this.visitedItemCount(); + } + + private int satisfiedCount() { + return this.ingredientCount; + } + + private int connectionOffset() { + return this.satisfiedOffset() + this.satisfiedCount(); + } + + private int connectionCount() { + return this.ingredientCount * this.itemCount; + } + + private int residualOffset() { + return this.connectionOffset() + this.connectionCount(); + } + + private int residualCount() { + return this.ingredientCount * this.itemCount; + } + + private boolean isSatisfied(int itemId) { + return this.data.get(this.getSatisfiedIndex(itemId)); + } + + private void setSatisfied(int itemId) { + this.data.set(this.getSatisfiedIndex(itemId)); + } + + private int getSatisfiedIndex(int itemId) { + assert itemId >= 0 && itemId < this.ingredientCount; + + return this.satisfiedOffset() + itemId; + } + + private void clearSatisfied() { + this.clearRange(this.satisfiedOffset(), this.satisfiedCount()); + } + + private void setConnection(int itemIndex, int ingredientIndex) { + this.data.set(this.getConnectionIndex(itemIndex, ingredientIndex)); + } + + private boolean hasConnection(int itemIndex, int ingredientIndex) { + return this.data.get(this.getConnectionIndex(itemIndex, ingredientIndex)); + } + + private int getConnectionIndex(int itemIndex, int ingredientIndex) { + assert itemIndex >= 0 && itemIndex < this.itemCount; + + assert ingredientIndex >= 0 && ingredientIndex < this.ingredientCount; + + return this.connectionOffset() + itemIndex * this.ingredientCount + ingredientIndex; + } + + private boolean isAssigned(int itemIndex, int ingredientIndex) { + return this.data.get(this.getResidualIndex(itemIndex, ingredientIndex)); + } + + private void assign(int itemIndex, int ingredientIndex) { + int i = this.getResidualIndex(itemIndex, ingredientIndex); + + assert !this.data.get(i); + + this.data.set(i); + } + + private void unassign(int itemIndex, int ingredientIndex) { + int i = this.getResidualIndex(itemIndex, ingredientIndex); + + assert this.data.get(i); + + this.data.clear(i); + } + + private int getResidualIndex(int itemIndex, int ingredientIndex) { + assert itemIndex >= 0 && itemIndex < this.itemCount; + + assert ingredientIndex >= 0 && ingredientIndex < this.ingredientCount; + + return this.residualOffset() + itemIndex * this.ingredientCount + ingredientIndex; + } + + private void visitIngredient(int index) { + this.data.set(this.getVisitedIngredientIndex(index)); + } + + private boolean hasVisitedIngredient(int index) { + return this.data.get(this.getVisitedIngredientIndex(index)); + } + + private int getVisitedIngredientIndex(int index) { + assert index >= 0 && index < this.ingredientCount; + + return this.visitedIngredientOffset() + index; + } + + private void visitItem(int index) { + this.data.set(this.getVisitedItemIndex(index)); + } + + private boolean hasVisitedItem(int index) { + return this.data.get(this.getVisitedItemIndex(index)); + } + + private int getVisitedItemIndex(int index) { + assert index >= 0 && index < this.itemCount; + return this.visitedItemOffset() + index; + } + + private void clearAllVisited() { + this.clearRange(this.visitedIngredientOffset(), this.visitedIngredientCount()); + this.clearRange(this.visitedItemOffset(), this.visitedItemCount()); + } + + private void clearRange(int start, int offset) { + this.data.clear(start, start + offset); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java new file mode 100644 index 000000000..80a702da1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java @@ -0,0 +1,102 @@ +package net.momirealms.craftengine.core.item.recipe.input; + +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.RecipeFinder; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CraftingInput implements RecipeInput { + private final int width; + private final int height; + private final List> items; + private final int ingredientCount; + private final RecipeFinder finder = new RecipeFinder(); + + private CraftingInput(int width, int height, List> items) { + this.height = height; + this.width = width; + this.items = items; + int i = 0; + for (OptimizedIDItem item : items) { + if (!item.isEmpty()) { + i++; + this.finder.addInput(item); + } + } + this.ingredientCount = i; + } + + public RecipeFinder finder() { + return finder; + } + + public static CraftingInput of(int width, int height, List> stacks) { + if (width <= 0 || height <= 0) { + return new CraftingInput<>(0, 0, Collections.emptyList()); + } + + int minCol = width; + int maxCol = -1; + int minRow = height; + int maxRow = -1; + + for (int index = 0; index < width * height; index++) { + OptimizedIDItem item = stacks.get(index); + if (!item.isEmpty()) { + int row = index / width; + int col = index % width; + minCol = Math.min(minCol, col); + maxCol = Math.max(maxCol, col); + minRow = Math.min(minRow, row); + maxRow = Math.max(maxRow, row); + } + } + + if (maxCol < minCol) { + return new CraftingInput<>(0, 0, Collections.emptyList()); + } + + int newWidth = maxCol - minCol + 1; + int newHeight = maxRow - minRow + 1; + + if (newWidth == width && newHeight == height) { + return new CraftingInput<>(width, height, stacks); + } + + List> trimmed = new ArrayList<>(newWidth * newHeight); + for (int row = minRow; row <= maxRow; row++) { + for (int col = minCol; col <= maxCol; col++) { + int originalIndex = col + row * width; + trimmed.add(stacks.get(originalIndex)); + } + } + + return new CraftingInput<>(newWidth, newHeight, trimmed); + } + + public int ingredientCount() { + return ingredientCount; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public int size() { + return items.size(); + } + + public OptimizedIDItem getItem(int x, int y) { + return this.items.get(x + y * width); + } + + public OptimizedIDItem getItem(int index) { + return this.items.get(index); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/RecipeInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/RecipeInput.java new file mode 100644 index 000000000..e067a35f5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/RecipeInput.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.item.recipe.input; + +public interface RecipeInput { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/RecipeResult.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/RecipeResult.java new file mode 100644 index 000000000..4950caa8a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/RecipeResult.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import com.google.gson.JsonObject; + +public record RecipeResult(String id, int count, JsonObject components) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java new file mode 100644 index 000000000..bfcd63726 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.RecipeCategory; + +public abstract class VanillaRecipe { + protected final String group; + protected final RecipeCategory category; + protected final RecipeResult result; + + protected VanillaRecipe(RecipeCategory category, String group, RecipeResult result) { + this.category = category; + this.group = group; + this.result = result; + } + + public RecipeCategory category() { + return category; + } + + public String group() { + return group; + } + + public RecipeResult result() { + return result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java new file mode 100644 index 000000000..2db9351a3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import com.google.gson.JsonObject; + +public interface VanillaRecipeReader { + + VanillaShapedRecipe readShaped(JsonObject json); + + VanillaShapelessRecipe readShapeless(JsonObject json); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java new file mode 100644 index 000000000..bffe26c1a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.RecipeCategory; + +import java.util.List; +import java.util.Map; + +public class VanillaShapedRecipe extends VanillaRecipe { + private final String[] pattern; + private final Map> key; + + public VanillaShapedRecipe(RecipeCategory category, + String group, + Map> key, + String[] pattern, + RecipeResult result) { + super(category, group, result); + this.key = key; + this.pattern = pattern; + } + + public Map> ingredients() { + return key; + } + + public String[] pattern() { + return pattern; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java new file mode 100644 index 000000000..878662b39 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.RecipeCategory; + +import java.util.List; + +public class VanillaShapelessRecipe extends VanillaRecipe { + private final List> ingredients; + + public VanillaShapelessRecipe(RecipeCategory category, String group, List> ingredients, RecipeResult result) { + super(category, group, result); + this.ingredients = ingredients; + } + + public List> ingredients() { + return ingredients; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java new file mode 100644 index 000000000..a6be31749 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/AbstractRecipeReader.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.impl; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.recipe.RecipeCategory; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaRecipeReader; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public abstract class AbstractRecipeReader implements VanillaRecipeReader { + + protected String[] readPattern(JsonObject object) { + JsonArray pattern = object.getAsJsonArray("pattern"); + List patternList = new ArrayList<>(); + for (JsonElement element : pattern) { + patternList.add(element.getAsString()); + } + return patternList.toArray(new String[0]); + } + + @Nullable + protected String readGroup(JsonObject object) { + return object.has("group") ? object.get("group").getAsString() : null; + } + + @Nullable + protected RecipeCategory readCategory(JsonObject object) { + return object.has("category") ? RecipeCategory.valueOf(object.get("category").getAsString().toUpperCase(Locale.ENGLISH)) : null; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java new file mode 100644 index 000000000..1ba03642f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20.java @@ -0,0 +1,97 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.impl; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.recipe.vanilla.RecipeResult; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapedRecipe; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaShapelessRecipe; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VanillaRecipeReader1_20 extends AbstractRecipeReader { + + @Override + public VanillaShapedRecipe readShaped(JsonObject json) { + return new VanillaShapedRecipe( + readCategory(json), + readGroup(json), + readShapedIngredientMap(json.getAsJsonObject("key")), + readPattern(json), + readResult(json.getAsJsonObject("result")) + ); + } + + @Override + public VanillaShapelessRecipe readShapeless(JsonObject json) { + return new VanillaShapelessRecipe( + readCategory(json), + readGroup(json), + readShapelessIngredients(json.getAsJsonArray("ingredients")), + readResult(json.getAsJsonObject("result")) + ); + } + + @NotNull + protected RecipeResult readResult(JsonObject object) { + String item = object.get("item").getAsString(); + int count = object.has("count") ? object.get("count").getAsInt() : 1; + return new RecipeResult(item, count, null); + } + + protected List> readShapelessIngredients(JsonArray json) { + List> ingredients = new ArrayList<>(); + for (JsonElement element : json) { + if (element.isJsonObject()) { + JsonObject jsonObject = element.getAsJsonObject(); + if (jsonObject.has("item")) { + ingredients.add(List.of(jsonObject.get("item").getAsString())); + } else if (jsonObject.has("tag")) { + ingredients.add(List.of("#" + jsonObject.get("tag").getAsString())); + } + } else if (element.isJsonArray()) { + List ingredient = readIngredientList((JsonArray) element); + ingredients.add(ingredient); + } + } + return ingredients; + } + + protected Map> readShapedIngredientMap(JsonObject json) { + Map> ingredients = new HashMap<>(); + for (Map.Entry entry : json.entrySet()) { + char c = entry.getKey().charAt(0); + if (entry.getValue().isJsonObject()) { + JsonObject argument = entry.getValue().getAsJsonObject(); + if (argument.has("item")) { + ingredients.put(c, List.of(argument.get("item").getAsString())); + } else if (argument.has("tag")) { + ingredients.put(c, List.of("#" + argument.get("tag").getAsString())); + } + } else if (entry.getValue().isJsonArray()) { + List items = readIngredientList((JsonArray) entry.getValue()); + ingredients.put(c, items); + } + } + return ingredients; + } + + protected @NotNull List readIngredientList(JsonArray array) { + List items = new ArrayList<>(); + for (JsonElement element : array) { + if (element.isJsonObject()) { + JsonObject argument = element.getAsJsonObject(); + if (argument.has("item")) { + items.add(argument.get("item").getAsString()); + } else if (argument.has("tag")) { + items.add("#" + argument.get("tag").getAsString()); + } + } + } + return items; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20_5.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20_5.java new file mode 100644 index 000000000..408145592 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_20_5.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.impl; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.recipe.vanilla.RecipeResult; +import org.jetbrains.annotations.NotNull; + +public class VanillaRecipeReader1_20_5 extends VanillaRecipeReader1_20 { + + @Override + protected @NotNull RecipeResult readResult(JsonObject object) { + String item = object.get("id").getAsString(); + JsonObject components = object.has("components") ? object.getAsJsonObject("components") : null; + int count = object.has("count") ? object.get("count").getAsInt() : 1; + return new RecipeResult(item, count, components); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java new file mode 100644 index 000000000..7bbf3c69b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/impl/VanillaRecipeReader1_21_2.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.impl; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VanillaRecipeReader1_21_2 extends VanillaRecipeReader1_20_5 { + + @Override + protected Map> readShapedIngredientMap(JsonObject json) { + Map> ingredients = new HashMap<>(); + for (Map.Entry entry : json.entrySet()) { + char c = entry.getKey().charAt(0); + if (entry.getValue().isJsonPrimitive()) { + ingredients.put(c, List.of(entry.getValue().getAsString())); + } else if (entry.getValue().isJsonArray()) { + List list = new ArrayList<>(); + for (JsonElement element : entry.getValue().getAsJsonArray()) { + list.add(element.getAsString()); + } + ingredients.put(c, list); + } + } + return ingredients; + } + + @Override + protected List> readShapelessIngredients(JsonArray json) { + List> ingredients = new ArrayList<>(); + for (JsonElement element : json) { + if (element.isJsonPrimitive()) { + ingredients.add(List.of(element.getAsString())); + } else if (element.isJsonArray()) { + List list = new ArrayList<>(); + for (JsonElement inner : element.getAsJsonArray()) { + list.add(inner.getAsString()); + } + ingredients.add(list); + } + } + return ingredients; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java new file mode 100644 index 000000000..2ad3dc4f4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.loot; + +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.world.World; + +import java.util.Optional; +import java.util.Random; + +public class LootContext { + private final World world; + private final ContextHolder contexts; + private final Random randomSource; + private final float luck; + + public LootContext(World world, ContextHolder contexts, Random randomSource, float luck) { + this.randomSource = randomSource; + this.contexts = contexts; + this.world = world; + this.luck = luck; + } + + public Random randomSource() { + return randomSource; + } + + public Optional getOptionalParameter(ContextKey parameter) { + return this.contexts.getOptional(parameter); + } + + public boolean hasParameter(ContextKey parameter) { + return this.contexts.has(parameter); + } + + public T getParameterOrThrow(ContextKey parameter) { + return this.contexts.getOrThrow(parameter); + } + + public float luck() { + return luck; + } + + public ContextHolder contexts() { + return contexts; + } + + public World world() { + return world; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java new file mode 100644 index 000000000..ef3a558ff --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java @@ -0,0 +1,79 @@ +package net.momirealms.craftengine.core.loot; + +import com.google.common.collect.Lists; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.entry.LootEntry; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.loot.provider.NumberProvider; +import net.momirealms.craftengine.core.util.MCUtils; +import org.apache.commons.lang3.mutable.MutableInt; + +import java.util.List; +import java.util.Random; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class LootPool { + private final List> entryContainers; + private final List conditions; + private final Predicate compositeCondition; + private final List> functions; + private final BiFunction, LootContext, Item> compositeFunction; + private final NumberProvider rolls; + private final NumberProvider bonusRolls; + + public LootPool(List> entryContainers, List conditions, List> functions, NumberProvider rolls, NumberProvider bonusRolls) { + this.entryContainers = entryContainers; + this.conditions = conditions; + this.functions = functions; + this.rolls = rolls; + this.bonusRolls = bonusRolls; + this.compositeCondition = LootConditions.andConditions(conditions); + this.compositeFunction = LootFunctions.compose(functions); + } + + public void addRandomItems(Consumer> lootConsumer, LootContext context) { + if (this.compositeCondition.test(context)) { + Consumer> consumer = LootFunction.decorate(this.compositeFunction, lootConsumer, context); + int i = this.rolls.getInt(context) + MCUtils.fastFloor(this.bonusRolls.getFloat(context) * context.luck()); + for (int j = 0; j < i; ++j) { + this.addRandomItem(consumer, context); + } + } + } + + private void addRandomItem(Consumer> lootConsumer, LootContext context) { + Random randomSource = context.randomSource(); + List> list = Lists.newArrayList(); + MutableInt mutableInt = new MutableInt(); + for (LootEntryContainer lootPoolEntryContainer : this.entryContainers) { + lootPoolEntryContainer.expand(context, (choice) -> { + int i = choice.getWeight(context.luck()); + if (i > 0) { + list.add(choice); + mutableInt.add(i); + } + }); + } + int i = list.size(); + if (mutableInt.intValue() != 0 && i != 0) { + if (i == 1) { + list.get(0).createItem(lootConsumer, context); + } else { + int j = randomSource.nextInt(mutableInt.intValue()); + for (LootEntry loot : list) { + j -= loot.getWeight(context.luck()); + if (j < 0) { + loot.createItem(lootConsumer, context); + return; + } + } + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java new file mode 100644 index 000000000..6ac0b8b01 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -0,0 +1,98 @@ +package net.momirealms.craftengine.core.loot; + +import com.google.common.collect.Lists; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainers; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.loot.provider.NumberProvider; +import net.momirealms.craftengine.core.loot.provider.NumberProviders; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public class LootTable { + private final List> pools; + private final List> functions; + private final BiFunction, LootContext, Item> compositeFunction; + + public LootTable(List> pools, List> functions) { + this.pools = pools; + this.functions = functions; + this.compositeFunction = LootFunctions.compose(functions); + } + + @Nullable + @SuppressWarnings("unchecked") + public static LootTable fromMap(Map map) { + if (map == null) return null; + List> poolList = (List>) map.get("pools"); + List> lootPools = new ArrayList<>(); + for (Map pool : poolList) { + NumberProvider rolls = NumberProviders.fromObject(pool.getOrDefault("rolls", 1)); + NumberProvider bonus_rolls = NumberProviders.fromObject(pool.getOrDefault("bonus_rolls", 0)); + List conditions = Optional.ofNullable(pool.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Lists.newArrayList()); + List> containers = Optional.ofNullable(pool.get("entries")) + .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList((List>) it))) + .orElse(Lists.newArrayList()); + List> functions = Optional.ofNullable(pool.get("functions")) + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList((List>) it))) + .orElse(Lists.newArrayList()); + lootPools.add(new LootPool<>(containers, conditions, functions, rolls, bonus_rolls)); + } + return new LootTable<>(lootPools, + Optional.ofNullable(map.get("functions")) + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList((List>) it))) + .orElse(Lists.newArrayList()) + ); + } + + public ArrayList> getRandomItems(ContextHolder parameters, World world) { + return this.getRandomItems(new LootContext(world, parameters, ThreadLocalRandom.current(), 1)); + } + + private ArrayList> getRandomItems(LootContext context) { + ArrayList> list = new ArrayList<>(); + this.getRandomItems(context, list::add); + return list; + } + + public void getRandomItems(LootContext context, Consumer> lootConsumer) { + this.getRandomItemsRaw(context, LootTable.createStackSplitter(lootConsumer)); + } + + public static Consumer> createStackSplitter(Consumer> consumer) { + return (item) -> { + if (item.count() < item.maxStackSize()) { + consumer.accept(item); + } else { + int remaining = item.count(); + while (remaining > 0) { + Item splitItem = item.copyWithCount(Math.min(item.maxStackSize(), remaining)); + remaining -= splitItem.count(); + consumer.accept(splitItem); + } + } + }; + } + + public void getRandomItemsRaw(LootContext context, Consumer> lootConsumer) { + Consumer> consumer = LootFunction.decorate(this.compositeFunction, lootConsumer, context); + for (LootPool pool : this.pools) { + pool.addRandomItems(consumer, context); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java new file mode 100644 index 000000000..4720b2587 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class AllOfCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final List conditions; + + public AllOfCondition(List conditions) { + this.conditions = conditions; + } + + @Override + public Key type() { + return LootConditions.ANY_OF; + } + + @Override + public boolean test(LootContext lootContext) { + for (LootCondition condition : conditions) { + if (!condition.test(lootContext)) { + return false; + } + } + return true; + } + + public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") + @Override + public LootCondition create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + return new AllOfCondition(LootConditions.fromMapList(terms)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java new file mode 100644 index 000000000..8ed439c3e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class AnyOfCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final List conditions; + + public AnyOfCondition(List conditions) { + this.conditions = conditions; + } + + @Override + public Key type() { + return LootConditions.ANY_OF; + } + + @Override + public boolean test(LootContext lootContext) { + for (LootCondition condition : conditions) { + if (condition.test(lootContext)) { + return true; + } + } + return false; + } + + public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") + @Override + public LootCondition create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + return new AnyOfCondition(LootConditions.fromMapList(terms)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java new file mode 100644 index 000000000..85159b142 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +public class EnchantmentCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final Key id; + private final Function expression; + + public EnchantmentCondition(Key id, Function expression) { + this.id = id; + this.expression = expression; + } + + @Override + public Key type() { + return LootConditions.MATCH_ITEM; + } + + @Override + public boolean test(LootContext lootContext) { + Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + if (item.isEmpty()) return false; + Optional enchantment = item.get().getEnchantment(id); + int level = enchantment.map(Enchantment::level).orElse(0); + return this.expression.apply(level); + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + String predicate = (String) arguments.get("predicate"); + String[] split = predicate.split("(<=|>=|<|>|==|=)", 2); + int level = Integer.parseInt(split[1]); + String operator = predicate.substring(split[0].length(), predicate.length() - split[1].length()); + Function expression; + switch (operator) { + case "<" -> expression = (i -> i < level); + case ">" -> expression = (i -> i > level); + case "==", "=" -> expression = (i -> i == level); + case "<=" -> expression = (i -> i <= level); + case ">=" -> expression = (i -> i >= level); + default -> throw new IllegalArgumentException("Unknown operator: " + operator); + } + return new EnchantmentCondition(Key.of(split[0]), expression); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java new file mode 100644 index 000000000..c802e908e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class FallingCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + public static final FallingCondition INSTANCE = new FallingCondition(); + + @Override + public Key type() { + return LootConditions.ANY_OF; + } + + @Override + public boolean test(LootContext lootContext) { + return lootContext.getOptionalParameter(LootParameters.FALLING_BLOCK).orElse(false); + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java new file mode 100644 index 000000000..ff1a32460 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class InvertedCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final LootCondition condition; + + public InvertedCondition(LootCondition condition) { + this.condition = condition; + } + + @Override + public Key type() { + return LootConditions.ANY_OF; + } + + @Override + public boolean test(LootContext lootContext) { + return !condition.test(lootContext); + } + + public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") + @Override + public LootCondition create(Map arguments) { + Map term = (Map) arguments.get("term"); + return new InvertedCondition(LootConditions.fromMap(term)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java new file mode 100644 index 000000000..5a684a171 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Predicate; + +public interface LootCondition extends Predicate { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java new file mode 100644 index 000000000..6f8173511 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.condition; + +import java.util.Map; + +public interface LootConditionFactory { + + LootCondition create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java new file mode 100644 index 000000000..806172e90 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java @@ -0,0 +1,98 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +public class LootConditions { + public static final Key MATCH_ITEM = Key.from("craftengine:match_item"); + public static final Key TABLE_BONUS = Key.from("craftengine:table_bonus"); + public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion"); + public static final Key ANY_OF = Key.from("craftengine:any_of"); + public static final Key ALL_OF = Key.from("craftengine:all_of"); + public static final Key ENCHANTMENT = Key.from("craftengine:enchantment"); + public static final Key INVERTED = Key.from("craftengine:inverted"); + public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); + + static { + register(MATCH_ITEM, MatchItemCondition.FACTORY); + register(TABLE_BONUS, TableBonusCondition.FACTORY); + register(SURVIVES_EXPLOSION, SurvivesExplosionCondition.FACTORY); + register(ANY_OF, AnyOfCondition.FACTORY); + register(ALL_OF, AllOfCondition.FACTORY); + register(ENCHANTMENT, EnchantmentCondition.FACTORY); + register(INVERTED, InvertedCondition.FACTORY); + register(FALLING_BLOCK, FallingCondition.FACTORY); + } + + public static void register(Key key, LootConditionFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.LOOT_CONDITION_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.LOOT_CONDITION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Predicate andConditions(List> predicates) { + List> list = List.copyOf(predicates); + return switch (list.size()) { + case 0 -> ctx -> true; + case 1 -> list.get(0); + case 2 -> list.get(0).and(list.get(1)); + default -> (ctx -> { + for (Predicate predicate : list) { + if (!predicate.test(ctx)) { + return false; + } + } + return true; + }); + }; + } + + public static Predicate orConditions(List> predicates) { + List> list = List.copyOf(predicates); + return switch (list.size()) { + case 0 -> ctx -> false; + case 1 -> list.get(0); + case 2 -> list.get(0).or(list.get(1)); + default -> (ctx -> { + for (Predicate predicate : list) { + if (predicate.test(ctx)) { + return true; + } + } + return false; + }); + }; + } + + public static List fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + public static LootCondition fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("condition type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + LootConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown loot condition type: " + type); + } + return factory.create(map); + } + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java new file mode 100644 index 000000000..367ac6ec3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.*; + +public class MatchItemCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final Set ids; + private final boolean regexMatch; + + public MatchItemCondition(Collection ids, boolean regexMatch) { + this.ids = new HashSet<>(ids); + this.regexMatch = regexMatch; + } + + @Override + public Key type() { + return LootConditions.MATCH_ITEM; + } + + @Override + public boolean test(LootContext lootContext) { + Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + if (item.isEmpty()) return false; + Key key = item.get().id(); + String itemId = key.toString(); + if (this.regexMatch) { + for (String regex : ids) { + if (itemId.matches(regex)) { + return true; + } + } + } else { + return this.ids.contains(itemId); + } + return false; + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + List ids = MiscUtils.getAsStringList(arguments.get("id")); + boolean regex = (boolean) arguments.getOrDefault("regex", false); + return new MatchItemCondition(ids, regex); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java new file mode 100644 index 000000000..3fd8f8cf6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Optional; + +public class SurvivesExplosionCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private static final SurvivesExplosionCondition INSTANCE = new SurvivesExplosionCondition(); + + @Override + public Key type() { + return LootConditions.SURVIVES_EXPLOSION; + } + + @Override + public boolean test(LootContext lootContext) { + Optional radius = lootContext.getOptionalParameter(LootParameters.EXPLOSION_RADIUS); + if (radius.isPresent()) { + float f = 1f / radius.get(); + return lootContext.randomSource().nextFloat() < f; + } + return true; + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java new file mode 100644 index 000000000..8560f80bd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class TableBonusCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final Key enchantmentType; + private final List values; + + public TableBonusCondition(Key enchantmentType, List values) { + this.enchantmentType = enchantmentType; + this.values = values; + } + + @Override + public Key type() { + return LootConditions.TABLE_BONUS; + } + + @Override + public boolean test(LootContext lootContext) { + Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + int level = item.map(value -> value.getEnchantment(this.enchantmentType).map(Enchantment::level).orElse(0)).orElse(0); + float f = this.values.get(Math.min(level, this.values.size() - 1)); + return lootContext.randomSource().nextFloat() < f; + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + Key enchantmentType = Key.of((String) arguments.get("enchantment")); + List floats = MiscUtils.getAsFloatList(arguments.get("chances")); + return new TableBonusCondition(enchantmentType, floats); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java new file mode 100644 index 000000000..76f4a57ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; + +import java.util.List; +import java.util.function.Consumer; + +public abstract class AbstractCompositeLootEntryContainer extends AbstractLootEntryContainer { + protected final List> children; + private final LootEntryContainer composedChildren; + + protected AbstractCompositeLootEntryContainer(List conditions, List> children) { + super(conditions); + this.children = children; + this.composedChildren = compose(children); + } + + protected abstract LootEntryContainer compose(List> children); + + @Override + public final boolean expand(LootContext context, Consumer> choiceConsumer) { + return this.test(context) && this.composedChildren.expand(context, choiceConsumer); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java new file mode 100644 index 000000000..a71d1651d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MCUtils; + +import java.util.List; +import java.util.function.Predicate; + +public abstract class AbstractLootEntryContainer implements LootEntryContainer, Predicate { + protected final List conditions; + private final Predicate compositeCondition; + + protected AbstractLootEntryContainer(List conditions) { + this.conditions = conditions; + this.compositeCondition = MCUtils.allOf(conditions); + } + + @Override + public final boolean test(LootContext context) { + return this.compositeCondition.test(context); + } + + public abstract Key type(); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java new file mode 100644 index 000000000..e9a273b57 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; + +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public abstract class AbstractSingleLootEntryContainer extends AbstractLootEntryContainer { + protected final int weight; + protected final int quality; + protected final List> functions; + protected final BiFunction, LootContext, Item> compositeFunction; + private final EntryBase entry = new EntryBase() { + @Override + public void createItem(Consumer> lootConsumer, LootContext context) { + AbstractSingleLootEntryContainer.this.createItem( + LootFunction.decorate(AbstractSingleLootEntryContainer.this.compositeFunction, lootConsumer, context), context + ); + } + }; + + protected AbstractSingleLootEntryContainer(List conditions, List> functions, int weight, int quality) { + super(conditions); + this.weight = weight; + this.quality = quality; + this.functions = functions; + this.compositeFunction = LootFunctions.compose(functions); + } + + @Override + public boolean expand(LootContext context, Consumer> choiceConsumer) { + if (this.test(context)) { + choiceConsumer.accept(this.entry); + return true; + } else { + return false; + } + } + + public int weight() { + return weight; + } + + public int quality() { + return quality; + } + + protected abstract void createItem(Consumer> lootConsumer, LootContext context); + + protected abstract class EntryBase implements LootEntry { + // https://luckformula.emc.gs + @Override + public int getWeight(float luck) { + float qualityModifier = (float) quality() * luck; + final int weightBoost = 100; + double baseWeight = weightBoost * (weight() + qualityModifier); + double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100); + float luckModifier = Math.min(100, luck * 10) / 100; + double reduced = Math.ceil(baseWeight - (impacted * luckModifier)); + return (int) Math.max(0, reduced); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java new file mode 100644 index 000000000..3c5e91f4e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; + +public class AlternativesLootEntryContainer extends AbstractCompositeLootEntryContainer { + public static final Factory FACTORY = new Factory<>(); + + protected AlternativesLootEntryContainer(List conditions, List> children) { + super(conditions, children); + } + + @Override + protected LootEntryContainer compose(List> children) { + return switch (children.size()) { + case 0 -> LootEntryContainer.alwaysFalse(); + case 1 -> children.get(0); + case 2 -> children.get(0).or(children.get(1)); + default -> (context, choiceConsumer) -> { + for (LootEntryContainer child : children) { + if (child.expand(context, choiceConsumer)) { + return true; + } + } + return false; + }; + }; + } + + @Override + public Key type() { + return LootEntryContainers.ALTERNATIVES; + } + + public static class Factory implements LootEntryContainerFactory { + @SuppressWarnings("unchecked") + @Override + public LootEntryContainer create(Map arguments) { + List> containers = Optional.ofNullable(arguments.get("children")) + .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList((List>) it))) + .orElse(Collections.emptyList()); + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new AlternativesLootEntryContainer<>(conditions, containers); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntry.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntry.java new file mode 100644 index 000000000..4b2ee68a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntry.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; + +import java.util.function.Consumer; + +public interface LootEntry { + + int getWeight(float luck); + + void createItem(Consumer> lootConsumer, LootContext context); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainer.java new file mode 100644 index 000000000..0fe78d6f3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainer.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; + +import java.util.function.Consumer; + +public interface LootEntryContainer { + + static LootEntryContainer alwaysFalse() { + return (context, choiceConsumer) -> false; + } + + static LootEntryContainer alwaysTrue() { + return (context, choiceConsumer) -> true; + } + + boolean expand(LootContext context, Consumer> choiceConsumer); + + default LootEntryContainer and(LootEntryContainer other) { + return (context, lootChoiceExpander) -> this.expand(context, lootChoiceExpander) && other.expand(context, lootChoiceExpander); + } + + default LootEntryContainer or(LootEntryContainer other) { + return (context, lootChoiceExpander) -> this.expand(context, lootChoiceExpander) || other.expand(context, lootChoiceExpander); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainerFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainerFactory.java new file mode 100644 index 000000000..c919e3025 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainerFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.entry; + +import java.util.Map; + +public interface LootEntryContainerFactory { + + LootEntryContainer create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java new file mode 100644 index 000000000..a40626f51 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class LootEntryContainers { + public static final Key ALTERNATIVES = Key.from("craftengine:alternatives"); + public static final Key ITEM = Key.from("craftengine:item"); + + static { + register(ALTERNATIVES, AlternativesLootEntryContainer.FACTORY); + register(ITEM, SingleItemLootEntryContainer.FACTORY); + } + + public static void register(Key key, LootEntryContainerFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.LOOT_ENTRY_CONTAINER_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static List> fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List> functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + @SuppressWarnings("unchecked") + public static LootEntryContainer fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("loot entry type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + LootEntryContainerFactory factory = (LootEntryContainerFactory) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown loot entry type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java new file mode 100644 index 000000000..845d275e0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; +import java.util.function.Consumer; + +public class SingleItemLootEntryContainer extends AbstractSingleLootEntryContainer { + public static final Factory FACTORY = new Factory<>(); + private final Key item; + + protected SingleItemLootEntryContainer(Key item, List conditions, List> lootFunctions, int weight, int quality) { + super(conditions, lootFunctions, weight, quality); + this.item = item; + } + + @Override + public Key type() { + return LootEntryContainers.ITEM; + } + + @SuppressWarnings("unchecked") + @Override + protected void createItem(Consumer> lootConsumer, LootContext context) { + Item tItem = (Item) CraftEngine.instance().itemManager().createWrappedItem(this.item, context.getOptionalParameter(LootParameters.PLAYER).orElse(null)); + if (tItem != null) { + lootConsumer.accept(tItem); + } else { + CraftEngine.instance().logger().warn("Failed to create item: " + this.item); + } + } + + public static class Factory implements LootEntryContainerFactory { + @SuppressWarnings("unchecked") + @Override + public LootEntryContainer create(Map arguments) { + Key item = Key.from((String) arguments.get("item")); + int weight = (int) arguments.getOrDefault("weight", 1); + int quality = (int) arguments.getOrDefault("quality", 0); + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + List> functions = Optional.ofNullable(arguments.get("functions")) + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList((List>) it))) + .orElse(Collections.emptyList()); + return new SingleItemLootEntryContainer<>(item, conditions, functions, weight, quality); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java new file mode 100644 index 000000000..c0de92238 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.util.MCUtils; + +import java.util.List; +import java.util.function.Predicate; + +public abstract class AbstractLootConditionalFunction implements LootFunction { + protected final List predicates; + private final Predicate compositePredicates; + + public AbstractLootConditionalFunction(List predicates) { + this.predicates = predicates; + this.compositePredicates = MCUtils.allOf(predicates); + } + + @Override + public Item apply(Item item, LootContext lootContext) { + return this.compositePredicates.test(lootContext) ? this.applyInternal(item, lootContext) : item; + } + + protected abstract Item applyInternal(Item item, LootContext context); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java new file mode 100644 index 000000000..9405d6e74 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ApplyBonusCountFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + private final Key enchantment; + private final Formula formula; + + public ApplyBonusCountFunction(List predicates, Key enchantment, Formula formula) { + super(predicates); + this.enchantment = enchantment; + this.formula = formula; + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + Optional> itemInHand = context.getOptionalParameter(LootParameters.TOOL); + int level = itemInHand.map(value -> value.getEnchantment(this.enchantment).map(Enchantment::level).orElse(0)).orElse(0); + int newCount = formula.apply(item.count(), level); + item.count(newCount); + return item; + } + + @Override + public Key type() { + return LootFunctions.APPLY_BONUS; + } + + public static class Factory implements LootFunctionFactory { + + @Override + public LootFunction create(Map arguments) { + return null; + } + } + + public interface Formula { + int apply(int initialCount, int enchantmentLevel); + + Key type(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java new file mode 100644 index 000000000..9a3fc8689 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; + +public class ExplosionDecayFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + + public ExplosionDecayFunction(List predicates) { + super(predicates); + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + Optional radius = context.getOptionalParameter(LootParameters.EXPLOSION_RADIUS); + if (radius.isPresent()) { + Random random = context.randomSource(); + float f = 1f / radius.get(); + int amount = item.count(); + int survive = 0; + for (int j = 0; j < amount; j++) { + if (random.nextFloat() <= f) { + survive++; + } + } + item.count(survive); + } + return item; + } + + @Override + public Key type() { + return LootFunctions.EXPLOSION_DECAY; + } + + public static class Factory implements LootFunctionFactory { + @SuppressWarnings("unchecked") + @Override + public LootFunction create(Map arguments) { + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new ExplosionDecayFunction<>(conditions); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunction.java new file mode 100644 index 000000000..83e41db56 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunction.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public interface LootFunction extends BiFunction, LootContext, Item> { + + Key type(); + + static Consumer> decorate(BiFunction, LootContext, Item> itemApplier, Consumer> lootConsumer, LootContext context) { + return item -> lootConsumer.accept(itemApplier.apply(item, context)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionFactory.java new file mode 100644 index 000000000..2431dee39 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.function; + +import java.util.Map; + +public interface LootFunctionFactory { + + LootFunction create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java new file mode 100644 index 000000000..16c08d8ab --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -0,0 +1,79 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + +public class LootFunctions { + public static final Key APPLY_BONUS = Key.from("craftengine:apply_bonus"); + public static final Key SET_COUNT = Key.from("craftengine:set_count"); + public static final Key EXPLOSION_DECAY = Key.from("craftengine:explosion_decay"); + + static { + register(SET_COUNT, SetCountFunction.FACTORY); + register(EXPLOSION_DECAY, ExplosionDecayFunction.FACTORY); + register(APPLY_BONUS, ApplyBonusCountFunction.FACTORY); + } + + public static void register(Key key, LootFunctionFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_FUNCTION_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.LOOT_FUNCTION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static BiFunction, LootContext, Item> identity() { + return (item, context) -> item; + } + + public static BiFunction, LootContext, Item> compose(List, LootContext, Item>> terms) { + List, LootContext, Item>> list = List.copyOf(terms); + return switch (list.size()) { + case 0 -> identity(); + case 1 -> list.get(0); + case 2 -> { + BiFunction, LootContext, Item> f1 = list.get(0); + BiFunction, LootContext, Item> f2 = list.get(1); + yield (item, context) -> f2.apply(f1.apply(item, context), context); + } + default -> (item, context) -> { + for (BiFunction, LootContext, Item> function : list) { + item = function.apply(item, context); + } + return item; + }; + }; + } + + public static List> fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List> functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + @SuppressWarnings("unchecked") + public static LootFunction fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("function type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + LootFunctionFactory factory = (LootFunctionFactory) BuiltInRegistries.LOOT_FUNCTION_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown function type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java new file mode 100644 index 000000000..800d8a761 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.provider.NumberProvider; +import net.momirealms.craftengine.core.loot.provider.NumberProviders; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class SetCountFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + + private final NumberProvider value; + private final boolean add; + + public SetCountFunction(List conditions, NumberProvider value, boolean add) { + super(conditions); + this.value = value; + this.add = add; + } + + @Override + public Key type() { + return LootFunctions.SET_COUNT; + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + int amount = this.add ? item.count() : 0; + item.count(amount + this.value.getInt(context)); + return item; + } + + public static class Factory implements LootFunctionFactory { + @SuppressWarnings("unchecked") + @Override + public LootFunction create(Map arguments) { + Object value = arguments.get("count"); + boolean add = (boolean) arguments.getOrDefault("add", true); + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new SetCountFunction<>(conditions, NumberProviders.fromObject(value), add); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java new file mode 100644 index 000000000..269622edb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.loot.parameter; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.world.Vec3d; + +public class LootParameters { + public static final ContextKey LOCATION = new ContextKey<>(Key.of("craftengine:location")); + public static final ContextKey ENTITY = new ContextKey<>(Key.of("craftengine:entity")); + public static final ContextKey FALLING_BLOCK = new ContextKey<>(Key.of("craftengine:falling_block")); + public static final ContextKey EXPLOSION_RADIUS = new ContextKey<>(Key.of("craftengine:explosion_radius")); + public static final ContextKey PLAYER = new ContextKey<>(Key.of("craftengine:player")); + public static final ContextKey> TOOL = new ContextKey<>(Key.of("craftengine:tool")); + public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block_state")); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/provider/FixedNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/FixedNumberProvider.java new file mode 100644 index 000000000..8d7b7109a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/FixedNumberProvider.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.loot.provider; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class FixedNumberProvider implements NumberProvider { + public static final Factory FACTORY = new Factory(); + private final float value; + + public FixedNumberProvider(float value) { + this.value = value; + } + + @Override + public float getFloat(LootContext context) { + return this.value; + } + + @Override + public Key type() { + return NumberProviders.FIXED; + } + + public static class Factory implements NumberProviderFactory { + @Override + public NumberProvider create(Map arguments) { + Number value = (Number) arguments.get("value"); + return new FixedNumberProvider(value.floatValue()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProvider.java new file mode 100644 index 000000000..3c0b0c893 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProvider.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.loot.provider; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +public interface NumberProvider { + + float getFloat(LootContext context); + + default int getInt(LootContext context) { + return Math.round(this.getFloat(context)); + } + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProviderFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProviderFactory.java new file mode 100644 index 000000000..5e642cb5b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProviderFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.provider; + +import java.util.Map; + +public interface NumberProviderFactory { + + NumberProvider create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProviders.java new file mode 100644 index 000000000..4416b2de9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/NumberProviders.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.loot.provider; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class NumberProviders { + public static final Key FIXED = Key.of("craftengine:constant"); + public static final Key UNIFORM = Key.of("craftengine:uniform"); + + static { + register(FIXED, FixedNumberProvider.FACTORY); + register(UNIFORM, UniformNumberProvider.FACTORY); + } + + public static void register(Key key, NumberProviderFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.NUMBER_PROVIDER_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.NUMBER_PROVIDER_FACTORY.location(), key)); + holder.bindValue(factory); + } + + static List fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + public static NumberProvider fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("number type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + NumberProviderFactory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown number type: " + type); + } + return factory.create(map); + } + + @SuppressWarnings("unchecked") + public static NumberProvider fromObject(Object object) { + if (object == null) { + throw new NullPointerException("number argument is null"); + } + if (object instanceof Number number) { + return new FixedNumberProvider(number.floatValue()); + } else if (object instanceof String string) { + return new FixedNumberProvider(Float.parseFloat(string)); + } else if (object instanceof Map map) { + return fromMap((Map) map); + } + throw new IllegalArgumentException("Can't convert " + object + " to " + NumberProvider.class.getSimpleName()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/provider/UniformNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/UniformNumberProvider.java new file mode 100644 index 000000000..25cfcba0f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/provider/UniformNumberProvider.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.loot.provider; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class UniformNumberProvider implements NumberProvider { + public static final Factory FACTORY = new Factory(); + private final NumberProvider min; + private final NumberProvider max; + + public UniformNumberProvider(NumberProvider min, NumberProvider max) { + this.min = min; + this.max = max; + } + + @Override + public int getInt(LootContext context) { + return context.randomSource().nextInt(this.min.getInt(context), this.max.getInt(context)); + } + + @Override + public float getFloat(LootContext context) { + return context.randomSource().nextFloat(this.min.getFloat(context), this.max.getFloat(context)); + } + + @Override + public Key type() { + return NumberProviders.UNIFORM; + } + + public static class Factory implements NumberProviderFactory { + @Override + public NumberProvider create(Map arguments) { + Object min = arguments.getOrDefault("min", 1); + Object max = arguments.getOrDefault("max", 1); + return new UniformNumberProvider(NumberProviders.fromObject(min), NumberProviders.fromObject(max)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfig.java b/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfig.java new file mode 100644 index 000000000..808c649f0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfig.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.pack; + +import java.nio.file.Path; +import java.util.Map; + +public class CachedConfig { + private final Pack pack; + private final Path filePath; + private final Map config; + + public CachedConfig(Map config, Path filePath, Pack pack) { + this.config = config; + this.filePath = filePath; + this.pack = pack; + } + + public Map config() { + return config; + } + + public Path filePath() { + return filePath; + } + + public Pack pack() { + return pack; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/LegacyOverridesModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/LegacyOverridesModel.java new file mode 100644 index 000000000..636b0a5e4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/LegacyOverridesModel.java @@ -0,0 +1,108 @@ +package net.momirealms.craftengine.core.pack; + +import com.google.gson.JsonObject; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; +import java.util.Objects; + +public class LegacyOverridesModel implements Comparable { + private final Map predicate; + private final String model; + private final int customModelData; + + public LegacyOverridesModel(Map predicate, String model, int customModelData) { + this.predicate = predicate; + this.model = model; + this.customModelData = customModelData; + this.predicate.put("custom_model_data", customModelData); + } + + public Map predicate() { + return predicate; + } + + public String model() { + return model; + } + + public JsonObject toJson() { + JsonObject json = new JsonObject(); + JsonObject predicateJson = new JsonObject(); + if (predicate != null && !predicate.isEmpty()) { + for (Map.Entry entry : predicate.entrySet()) { + if (entry.getValue() instanceof Boolean b) { + predicateJson.addProperty(entry.getKey(), b); + } else if (entry.getValue() instanceof Number n) { + predicateJson.addProperty(entry.getKey(), n); + } else if (entry.getValue() instanceof String s) { + predicateJson.addProperty(entry.getKey(), s); + } + } + json.add("predicate", predicateJson); + } + json.addProperty("model", model); + return json; + } + + public int customModelData() { + return customModelData; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LegacyOverridesModel that = (LegacyOverridesModel) o; + return customModelData == that.customModelData && Objects.equals(predicate, that.predicate) && Objects.equals(model, that.model); + } + + @Override + public int hashCode() { + int result = predicate.hashCode(); + result = 31 * result + Objects.hashCode(model); + result = 31 * result + customModelData; + return result; + } + + @Override + public String toString() { + return "LegacyOverridesModel{" + + "predicate=" + predicate + + ", model='" + model + '\'' + + ", custom-model-data=" + customModelData + + '}'; + } + + @Override + public int compareTo(@NotNull LegacyOverridesModel o) { + if (customModelData != o.customModelData) { + return customModelData - o.customModelData; + } else { + if (predicate.size() != o.predicate.size()) { + return predicate.size() - o.predicate.size(); + } + for (Map.Entry entry : predicate.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (!o.predicate.containsKey(key)) { + return 1; + } + Object otherValue = o.predicate.get(key); + int valueComparison = compareValues(value, otherValue); + if (valueComparison != 0) { + return valueComparison; + } + } + } + return 0; + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private int compareValues(Object value1, Object value2) { + if (value1 instanceof Comparable c1 && value2 instanceof Comparable c2) { + return ((Comparable) c1).compareTo(c2); + } + return value1.equals(value2) ? 0 : -1; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java new file mode 100644 index 000000000..4adfe7cd3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.pack; + +public class LoadingSequence { + public static final int TEMPLATE = 0; + public static final int BLOCK = 10; + public static final int ITEM = 20; + public static final int FONT = 30; + public static final int RECIPE = 40; +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java b/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java new file mode 100644 index 000000000..09b70fffe --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.pack; + +import java.nio.file.Path; + +/** + * Represents a folder under the user's resources directory, + * designed to simplify the installation of third-party resource packs. + *