From 9534e5ca13d8873f1ee05f53f64ac3bbb8934887 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 03:57:24 +0800 Subject: [PATCH 01/31] =?UTF-8?q?feat(client):=20=E6=B7=BB=E5=8A=A0=20Fabr?= =?UTF-8?q?ic=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=A8=A1=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client-mod/build.gradle | 90 + .../client/CraftEngineFabricModClient.java | 10 + .../CraftEngineFabricMod.java | 31 + .../util/RegisterBlocks.java | 31 + .../craftEngineFabricMod/util/YamlUtils.java | 27 + .../assets/craft-engine-fabric-mod/icon.png | Bin 0 -> 3844 bytes client-mod/src/main/resources/fabric.mod.json | 25 + client-mod/src/main/resources/mappings.yml | 2029 +++++++++++++++++ gradle.properties | 5 + settings.gradle.kts | 3 +- 10 files changed, 2250 insertions(+), 1 deletion(-) create mode 100644 client-mod/build.gradle create mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java create mode 100644 client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java create mode 100644 client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java create mode 100644 client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java create mode 100644 client-mod/src/main/resources/assets/craft-engine-fabric-mod/icon.png create mode 100644 client-mod/src/main/resources/fabric.mod.json create mode 100644 client-mod/src/main/resources/mappings.yml diff --git a/client-mod/build.gradle b/client-mod/build.gradle new file mode 100644 index 000000000..61675a3b9 --- /dev/null +++ b/client-mod/build.gradle @@ -0,0 +1,90 @@ +plugins { + id 'fabric-loom' version '1.10-SNAPSHOT' + id 'com.gradleup.shadow' version '9.0.0-beta11' +} + +version = project.project_version +group = project.project_group + +base { + archivesName = "craft-engine-fabric-mod" +} + +sourceSets { + client { + compileClasspath += main.compileClasspath + runtimeClasspath += main.runtimeClasspath + } + main { + output.dir(client.output) + } +} + +shadowJar { + relocate('org.yaml', 'net.momirealms.craftengine.libraries.org.yaml') + configurations = [project.configurations.shadow] + archiveFileName = "${base.archivesName.get()}-${project.version}-shadow.jar" + from sourceSets.main.output + from sourceSets.client.output +} + +remapJar { + dependsOn shadowJar + inputFile = shadowJar.archiveFile + + destinationDirectory = file("$rootDir/target") + archiveFileName = "${base.archivesName.get()}-${project.version}.jar" +} + +loom { + mods { + "craft-engine-fabric-mod" { + sourceSet sourceSets.main + sourceSet sourceSets.client + } + } +} + +configurations { + shadow + implementation.extendsFrom(shadow) +} + +dependencies { + minecraft "com.mojang:minecraft:${project.latest_minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + shadow 'org.yaml:snakeyaml:2.4' +} + +processResources { + inputs.property "version", project.version + inputs.property "minecraft_version", project.latest_minecraft_version + inputs.property "loader_version", project.loader_version + filteringCharset "UTF-8" + + filesMatching("fabric.mod.json") { + expand "version": project.version, + "minecraft_version": project.latest_minecraft_version, + "loader_version": project.loader_version + } +} + +def targetJavaVersion = 21 +tasks.withType(JavaCompile).configureEach { + it.options.encoding = "UTF-8" + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { + it.options.release.set(targetJavaVersion) + } +} + +java { + def javaVersion = JavaVersion.toVersion(targetJavaVersion) + if (JavaVersion.current() < javaVersion) { + toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) + } + withSourcesJar() +} + +tasks.build.dependsOn \ No newline at end of file diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java new file mode 100644 index 000000000..92fb454ee --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -0,0 +1,10 @@ +package net.momirealms.craftEngineFabricMod.client; + +import net.fabricmc.api.ClientModInitializer; + +public class CraftEngineFabricModClient implements ClientModInitializer { + + @Override + public void onInitializeClient() { + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java new file mode 100644 index 000000000..b15dc445d --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -0,0 +1,31 @@ +package net.momirealms.craftEngineFabricMod; + +import net.fabricmc.api.ModInitializer; +import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; +import net.momirealms.craftEngineFabricMod.util.YamlUtils; + +import java.util.HashMap; +import java.util.Map; + +public class CraftEngineFabricMod implements ModInitializer { + public static final String MOD_ID = "craftengine"; + + @Override + public void onInitialize() { + Map mappings = YamlUtils.loadConfig(); + Map blockCount = new HashMap<>(); + mappings.keySet().forEach(name -> { + String blockName = YamlUtils.split(name); + if (blockName != null) { + if (blockCount.containsKey(blockName)) { + blockCount.put(blockName, blockCount.get(blockName) + 1); + } else { + blockCount.put(blockName, 0); + } + RegisterBlocks.register(blockName + "_" + blockCount.get(blockName)); + } + }); + mappings.clear(); + blockCount.clear(); + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java new file mode 100644 index 000000000..9afc6c5a3 --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java @@ -0,0 +1,31 @@ +package net.momirealms.craftEngineFabricMod.util; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.CraftEngineFabricMod; + +import java.util.function.Function; + +public class RegisterBlocks { + public static Block register(String name) { + return register(name, Block::new, Block.Settings.copy(Blocks.STONE)); + } + + public static Block register(String name, Function blockFactory, AbstractBlock.Settings settings) { + RegistryKey blockKey = keyOfBlock(name); + Block block = blockFactory.apply(settings.registryKey(blockKey)); + + return Registry.register(Registries.BLOCK, blockKey, block); + } + + public static RegistryKey keyOfBlock(String name) { + return RegistryKey.of(RegistryKeys.BLOCK, Identifier.of(CraftEngineFabricMod.MOD_ID, name)); + } + +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java new file mode 100644 index 000000000..3ac880e3d --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -0,0 +1,27 @@ +package net.momirealms.craftEngineFabricMod.util; + +import org.jetbrains.annotations.Nullable; +import org.yaml.snakeyaml.Yaml; + +import java.io.InputStream; +import java.util.Map; + +public class YamlUtils { + + public static Map loadConfig() { + Yaml yaml = new Yaml(); + InputStream inputStream = YamlUtils.class.getClassLoader() + .getResourceAsStream("mappings.yml"); + return yaml.load(inputStream); + } + + public static @Nullable String split(String str) { + int colonIndex = str.indexOf(':'); + int bracketIndex = str.indexOf('['); + if (colonIndex == -1 && bracketIndex == -1) return null; + int start = (colonIndex != -1) ? colonIndex + 1 : 0; + int end = (bracketIndex != -1) ? bracketIndex : str.length(); + if (start > end) start = end; + return str.substring(start, end); + } +} diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/icon.png b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a388e01c06cd5eb8c00b68490ccaeb90bcc0564f GIT binary patch literal 3844 zcmbVP2~<;88jdzYr9ITnFp8Q{G67*`gzO|FB%lQ$RD&L23TicmmnR93_hMck2?$oK zXa^{YQ_--s;!;|dL0T<_Ma2b|z=XOC8bNAJ0BZtb1zG0?5VTb@)0~r&w|w_szW@8~ zJ^5sLM3~E4bKb(?a4zA3kQF%Gl!f;1G$-)Hu;aj2;Kx}ZSc&0qZ@b#RQ*gS%SvVZN zOBNNQiV-g5La3Z9mY}gPStC~fG!DlL(kR4G0<0p&!f`T$PqOK2Nko~1Pm1;vQiY0O zSSk~wDB;MIh$tu}0pdtVL4ib`h6@77VU?JuktZS;SHmZb#^r)*`(p};I0{iE@JWm8 z35hYn<-}lA2@^SFnlD79(ur&iS1_W~4%Mj}>;9fBngcRi|< zi$TXSxi}7{D3CZ3ae_x~Fq()eL1IuHW3&pPkQP0FkHIi> zy-F=s!i(YnTaNWa0o7CNP8@55^2;7a-#zErXK=6;*e@qGA#gLXjll@myOdy)TDRqJ z2iOl!g@-JP(iA?tvn;m=o_nD?GHdx4*UJ96IdV?@tf!IZzUx{hpk2tRnUZ7)`1jUh zXSOc5_x{OKkXUj5!Yo&4AHLM{Gv*iZXZPG{@MIkL!wH*V^;_;Xqr6(&y_^AGYUwDQ|gokR{+%SfWP3K6tDCUv1?rPskt6?XPkl=}u-^T%ONn2fk29 z(lW09b+>__q5B9kpXiv$kvzxqyqF8y0nOyGdakuvq7A zd=%rLm~Jn@<;;s=SDSe;4^65DTh*<~EhW7bL2+tq@b1G?zcidiI|8vJmXS z@!vCb?3c`XGRlpgZ1|P=`uWAFeG$x)N%0=K)q$GCt+nR5WYjdLzv{6qb!6wg;Kns> zwS5MHu@Erfpc0o>e6wERr(2!xl6$S)C08`^^UqT2Z4rlHsNT3CwY{f>lg`xXgLJEW zo+KaLwyWoaHU-MVEHzrc8R&!>Co7y3>XEhrVnJikWv7wjt~tVQ+i3k+eV16gwT&#^ zijJO!z@ZT4$=)XqrPfDQgA}obj$l{Q>gv3von8v${jz{|DkC) z>~_9-TX6xRDGbohFjOmtS1{Fs=cH>7l45y9Sbsv=>ROKbE-~KkRJV_UZJr7U=-ma@9#xJu}CURtK50 zh`=ptU$EVz|Lp{Qf5-XJ`^nz*QG|J=HoCxu*FKFs(Y6zj>?e4XJ=VsRq?2@nwEWQi zD#Q1L;6`E2u;tsf@;MI1rg8QB49PxxB{M93pc81p#Q5F>f@%_rR)%87s>|IBX`M02 z(U+z9>Iyxl!KWf1w8@aCd1HQ+tEXSDK54jeD4p4R?Z$s3+Si)^NN={>PK@XrT6Al> z`2@xG4xfFe%U{j9y|6hb#aox!UY%HXk3ncYxVW=N=wmhFb2ew^<9Bk6>g>S;+YzaCZ`?%$*-w~Vroud`A;~wD zAgIZCs-k|n zmA9jhg<<;W*30JM9fku<0io%s-R?$HbnRf}--ipQ&#soyuCMVdIK<8jM1d{JRCOMA zW`#SLDR5KiNXgKH<88E6Dc*w4ONZux6XoK(=4|uPK}(So>AkEsn)brU-hxvyT8al` z1=RQrM(kMP9s)T&90q^)WL>0OlbznObx1b68WV3q^DwO0ZNQ>F3g@Q!6|Q#0TDt^| zN#4^=|Jn7`TdB?(vBR&qOEdW6C*ch_Y@CyO6}jNe?#hnBR_**!HgAQ4QtE8@@Y?ob zpsPiF;Z=q$Ga7-hn(T+irZ`74xMamY9kQm{H|Jn3I4Ubzd0hd=G}gP8N>}{d9lw&= zqzaET77VI_LG9=?OMla^QAz;=IF}i4(3*TV~^> ztM=_;IB2)qt3IkGDWye}_lCR30k*g5JMDmguIXqk$v!$`&%j*V>5Dg)=${loader_version}", + "fabric": "*", + "minecraft": "${minecraft_version}" + } +} diff --git a/client-mod/src/main/resources/mappings.yml b/client-mod/src/main/resources/mappings.yml new file mode 100644 index 000000000..fc43ff532 --- /dev/null +++ b/client-mod/src/main/resources/mappings.yml @@ -0,0 +1,2029 @@ +######################################################################################################################################################################################################################## +# Sapling Block +minecraft:oak_sapling[stage=1]: minecraft:oak_sapling[stage=0] +minecraft:birch_sapling[stage=1]: minecraft:birch_sapling[stage=0] +minecraft:spruce_sapling[stage=1]: minecraft:spruce_sapling[stage=0] +minecraft:jungle_sapling[stage=1]: minecraft:jungle_sapling[stage=0] +minecraft:dark_oak_sapling[stage=1]: minecraft:dark_oak_sapling[stage=0] +minecraft:acacia_sapling[stage=1]: minecraft:acacia_sapling[stage=0] +minecraft:cherry_sapling[stage=1]: minecraft:cherry_sapling[stage=0] +######################################################################################################################################################################################################################## +# 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/gradle.properties b/gradle.properties index cfde053d7..f4ca831c9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -47,7 +47,12 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.15.11 snake_yaml_version=2.3 anti_grief_version=0.13 +# Fabric Dependencies +fabric_version=0.119.2+1.21.4 +yarn_mappings=1.21.4+build.8 +loader_version=0.16.10 +org.gradle.jvmargs=-Xmx1G # Proxy settings #systemProp.socks.proxyHost=127.0.0.1 #systemProp.socks.proxyPort=7890 diff --git a/settings.gradle.kts b/settings.gradle.kts index cd96a4442..35b81e042 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ include(":bukkit:legacy") include(":bukkit:compatibility") include(":bukkit-loader") include(":server-mod") +include(":client-mod") pluginManagement { plugins { kotlin("jvm") version "2.0.20" @@ -13,6 +14,6 @@ pluginManagement { repositories { gradlePluginPortal() maven("https://repo.papermc.io/repository/maven-public/") + maven("https://maven.fabricmc.net/") } } - From b5a077d831dcd96738f8af8f02f8db319f34f260 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 04:07:10 +0800 Subject: [PATCH 02/31] =?UTF-8?q?fix(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E6=96=B9=E5=9D=97=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftEngineFabricMod/CraftEngineFabricMod.java | 14 +++++++++++++- .../craftEngineFabricMod/util/RegisterBlocks.java | 7 +++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index b15dc445d..10d4473bd 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -1,6 +1,11 @@ package net.momirealms.craftEngineFabricMod; import net.fabricmc.api.ModInitializer; +import net.minecraft.block.Block; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.util.Identifier; import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; import net.momirealms.craftEngineFabricMod.util.YamlUtils; @@ -22,10 +27,17 @@ public class CraftEngineFabricMod implements ModInitializer { } else { blockCount.put(blockName, 0); } - RegisterBlocks.register(blockName + "_" + blockCount.get(blockName)); + RegisterBlocks.register( + blockName + "_" + blockCount.get(blockName), + Registries.BLOCK.get(keyOfBlock(blockName)) + ); } }); mappings.clear(); blockCount.clear(); } + + private static RegistryKey keyOfBlock(String name) { + return RegistryKey.of(RegistryKeys.BLOCK, Identifier.of("minecraft", name)); + } } diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java index 9afc6c5a3..57b9835fd 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java @@ -2,7 +2,6 @@ package net.momirealms.craftEngineFabricMod.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; -import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; @@ -13,8 +12,8 @@ import net.momirealms.craftEngineFabricMod.CraftEngineFabricMod; import java.util.function.Function; public class RegisterBlocks { - public static Block register(String name) { - return register(name, Block::new, Block.Settings.copy(Blocks.STONE)); + public static Block register(String name, Block block) { + return register(name, Block::new, Block.Settings.copy(block)); } public static Block register(String name, Function blockFactory, AbstractBlock.Settings settings) { @@ -24,7 +23,7 @@ public class RegisterBlocks { return Registry.register(Registries.BLOCK, blockKey, block); } - public static RegistryKey keyOfBlock(String name) { + private static RegistryKey keyOfBlock(String name) { return RegistryKey.of(RegistryKeys.BLOCK, Identifier.of(CraftEngineFabricMod.MOD_ID, name)); } From 9356691d8aceb7d5603b952c76ac7a60de03d6cc Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 04:26:53 +0800 Subject: [PATCH 03/31] =?UTF-8?q?fix(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E6=96=B9=E5=9D=97=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftEngineFabricMod/CraftEngineFabricMod.java | 14 +------------- .../craftEngineFabricMod/util/RegisterBlocks.java | 5 +++-- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index 10d4473bd..b15dc445d 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -1,11 +1,6 @@ package net.momirealms.craftEngineFabricMod; import net.fabricmc.api.ModInitializer; -import net.minecraft.block.Block; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.Identifier; import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; import net.momirealms.craftEngineFabricMod.util.YamlUtils; @@ -27,17 +22,10 @@ public class CraftEngineFabricMod implements ModInitializer { } else { blockCount.put(blockName, 0); } - RegisterBlocks.register( - blockName + "_" + blockCount.get(blockName), - Registries.BLOCK.get(keyOfBlock(blockName)) - ); + RegisterBlocks.register(blockName + "_" + blockCount.get(blockName)); } }); mappings.clear(); blockCount.clear(); } - - private static RegistryKey keyOfBlock(String name) { - return RegistryKey.of(RegistryKeys.BLOCK, Identifier.of("minecraft", name)); - } } diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java index 57b9835fd..e6237217a 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java @@ -2,6 +2,7 @@ package net.momirealms.craftEngineFabricMod.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; +import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; @@ -12,8 +13,8 @@ import net.momirealms.craftEngineFabricMod.CraftEngineFabricMod; import java.util.function.Function; public class RegisterBlocks { - public static Block register(String name, Block block) { - return register(name, Block::new, Block.Settings.copy(block)); + public static Block register(String name) { + return register(name, Block::new, Block.Settings.create().nonOpaque()); } public static Block register(String name, Function blockFactory, AbstractBlock.Settings settings) { From f91ace4efae6c1efa40960b4a68e173631274b80 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 04:27:09 +0800 Subject: [PATCH 04/31] =?UTF-8?q?fix(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E6=96=B9=E5=9D=97=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java | 1 - 1 file changed, 1 deletion(-) diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java index e6237217a..55f064f4b 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java @@ -2,7 +2,6 @@ package net.momirealms.craftEngineFabricMod.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; -import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; From 8648753ba95883fa9f57914ad130014d76295789 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 06:25:01 +0800 Subject: [PATCH 05/31] =?UTF-8?q?fix(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E6=96=B9=E5=9D=97=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/CraftEngineFabricModClient.java | 11 ++ .../CraftEngineFabricMod.java | 29 ++-- .../craftEngineFabricMod/util/YamlUtils.java | 139 ++++++++++++++++-- .../config/additional-real-blocks.yml | 26 ++++ .../config}/mappings.yml | 0 5 files changed, 177 insertions(+), 28 deletions(-) create mode 100644 client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml rename client-mod/src/main/resources/{ => assets/craft-engine-fabric-mod/config}/mappings.yml (100%) diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index 92fb454ee..cd5cafe45 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -1,10 +1,21 @@ package net.momirealms.craftEngineFabricMod.client; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; public class CraftEngineFabricModClient implements ClientModInitializer { + public static final String MOD_ID = "craftengine"; @Override public void onInitializeClient() { + Registries.BLOCK.forEach(block -> { + Identifier id = Registries.BLOCK.getId(block); + if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { + BlockRenderLayerMap.INSTANCE.putBlock(block, RenderLayer.getTranslucent()); + } + }); } } diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index b15dc445d..a8abd3abb 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -1,10 +1,11 @@ package net.momirealms.craftEngineFabricMod; import net.fabricmc.api.ModInitializer; +import net.minecraft.util.Identifier; import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; import net.momirealms.craftEngineFabricMod.util.YamlUtils; -import java.util.HashMap; +import java.io.IOException; import java.util.Map; public class CraftEngineFabricMod implements ModInitializer { @@ -12,20 +13,20 @@ public class CraftEngineFabricMod implements ModInitializer { @Override public void onInitialize() { - Map mappings = YamlUtils.loadConfig(); - Map blockCount = new HashMap<>(); - mappings.keySet().forEach(name -> { - String blockName = YamlUtils.split(name); - if (blockName != null) { - if (blockCount.containsKey(blockName)) { - blockCount.put(blockName, blockCount.get(blockName) + 1); - } else { - blockCount.put(blockName, 0); + try { + YamlUtils.ensureConfigFile("additional-real-blocks.yml"); + YamlUtils.ensureConfigFile("mappings.yml"); + Map map = YamlUtils.loadMappingsAndAdditionalBlocks(); + System.out.println("Loaded " + map.size() + " additional real blocks."); + for (Map.Entry entry : map.entrySet()) { + Identifier replacedBlockId = entry.getKey(); + for (int i = 0; i < entry.getValue(); i++) { + RegisterBlocks.register(replacedBlockId.getPath() + "_" + i); } - RegisterBlocks.register(blockName + "_" + blockCount.get(blockName)); } - }); - mappings.clear(); - blockCount.clear(); + System.out.println("Registered " + map.size() + " additional real blocks."); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 3ac880e3d..e677a51d5 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -1,27 +1,138 @@ package net.momirealms.craftEngineFabricMod.util; -import org.jetbrains.annotations.Nullable; +import com.mojang.brigadier.StringReader; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.command.argument.BlockArgumentParser; +import net.minecraft.registry.BuiltinRegistries; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.util.Identifier; import org.yaml.snakeyaml.Yaml; +import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; public class YamlUtils { + private static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; + private static final Yaml yaml = new Yaml(); + private static final RegistryWrapper registryWrapper = BuiltinRegistries.createWrapperLookup().getOrThrow(RegistryKeys.BLOCK); - public static Map loadConfig() { - Yaml yaml = new Yaml(); - InputStream inputStream = YamlUtils.class.getClassLoader() - .getResourceAsStream("mappings.yml"); - return yaml.load(inputStream); + /** + * 从指定路径加载 YAML 文件 + */ + public static T loadConfig(Path filePath) throws IOException { + try (InputStream inputStream = Files.newInputStream(filePath)) { + return yaml.load(inputStream); + } } - public static @Nullable String split(String str) { - int colonIndex = str.indexOf(':'); - int bracketIndex = str.indexOf('['); - if (colonIndex == -1 && bracketIndex == -1) return null; - int start = (colonIndex != -1) ? colonIndex + 1 : 0; - int end = (bracketIndex != -1) ? bracketIndex : str.length(); - if (start > end) start = end; - return str.substring(start, end); + /** + * 确保配置文件存在(不存在时从 JAR 内释放) + */ + public static void ensureConfigFile(String fileName) throws IOException { + Path configDir = Path.of(CONFIG_DIR); + if (!Files.exists(configDir)) { + Files.createDirectories(configDir); + } + + Path targetPath = configDir.resolve(fileName); + if (Files.exists(targetPath)) return; + String resourcePath = "assets/craft-engine-fabric-mod/config/" + fileName; + try (InputStream inputStream = YamlUtils.class.getClassLoader().getResourceAsStream(resourcePath)) { + if (inputStream == null) { + throw new IOException("Default config file not found: " + resourcePath); + } + Files.copy(inputStream, targetPath, StandardCopyOption.REPLACE_EXISTING); + } + } + + + public static Map loadMappingsAndAdditionalBlocks() throws IOException { + Path mappingPath = Path.of(CONFIG_DIR + "mappings.yml"); + Path additionalYamlPath = Path.of(CONFIG_DIR + "additional-real-blocks.yml"); + System.out.println("Loading mappings.yml and additional-real-blocks.yml..."); + Map blockStateMappings = loadConfig(mappingPath); + System.out.println("Loaded " + blockStateMappings.size() + " block state mappings."); + validateBlockStateMappings(blockStateMappings); + System.out.println("Validated block state mappings."); + Map blockTypeCounter = new LinkedHashMap<>(); + Map appearanceMapper = new HashMap<>(); + System.out.println("Processing block state mappings..."); + for (Map.Entry entry : blockStateMappings.entrySet()) { + processBlockStateMapping(entry, appearanceMapper, blockTypeCounter); + } + System.out.println("Processed " + blockTypeCounter.size() + " block state mappings."); + Map additionalYaml = loadConfig(additionalYamlPath); + System.out.println("Loaded " + additionalYaml.size() + " additional real blocks."); + return buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); + } + + + private static void validateBlockStateMappings(Map blockStateMappings) { + Map temp = new HashMap<>(blockStateMappings); + System.out.println("Validating block state mappings..."); + for (Map.Entry entry : temp.entrySet()) { + String state = entry.getValue(); + blockStateMappings.remove(state); + } + System.out.println("Validated " + blockStateMappings.size() + " block state mappings."); + } + + private static void processBlockStateMapping( + Map.Entry entry, + Map stateIdMapper, + Map blockUsageCounter + ) { + // 1. 转换方块状态(更明确的变量名) + final BlockState sourceState = createBlockData(entry.getKey()); + final BlockState targetState = createBlockData(entry.getValue()); + + // 2. 提前返回无效状态(合并校验逻辑) + if (sourceState == null || targetState == null) { + return; + } + + // 3. 获取状态ID(提取重复操作) + final int sourceStateId = Block.STATE_IDS.getRawId(sourceState); + final int targetStateId = Block.STATE_IDS.getRawId(targetState); + + // 4. 记录映射关系(使用 putIfAbsent 避免覆盖) + if (stateIdMapper.putIfAbsent(sourceStateId, targetStateId) == null) { + // 5. 统计方块使用次数(使用 computeIfAbsent 优化) + final Block sourceBlock = sourceState.getBlock(); + final Identifier blockId = Registries.BLOCK.getId(sourceBlock); + blockUsageCounter.merge(blockId, 1, Integer::sum); + } + } + + private static BlockState createBlockData(String blockState) { + try { + StringReader reader = new StringReader(blockState); + BlockArgumentParser.BlockResult arg = BlockArgumentParser.block(registryWrapper, reader, true); + return arg.blockState(); + } catch (Exception e) { + return null; + } + } + + private static LinkedHashMap buildRegisteredRealBlockSlots(Map counter, Map additionalYaml) { + LinkedHashMap map = new LinkedHashMap<>(); + System.out.println("Building registered real block slots..."); + for (Map.Entry entry : counter.entrySet()) { + String id = entry.getKey().toString(); + Integer additionalStates = additionalYaml.get(id); + int internalIds = entry.getValue() + (additionalStates != null ? additionalStates : 0); + map.put(entry.getKey(), internalIds); + } + System.out.println("Built " + map.size() + " registered real block slots."); + return map; } } diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml new file mode 100644 index 000000000..ec4cfa011 --- /dev/null +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml @@ -0,0 +1,26 @@ +# 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 + +minecraft:oak_sapling: 1 +minecraft:birch_sapling: 1 +minecraft:spruce_sapling: 1 +minecraft:jungle_sapling: 1 +minecraft:dark_oak_sapling: 1 +minecraft:acacia_sapling: 1 +minecraft:cherry_sapling: 1 \ No newline at end of file diff --git a/client-mod/src/main/resources/mappings.yml b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/mappings.yml similarity index 100% rename from client-mod/src/main/resources/mappings.yml rename to client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/mappings.yml From 485fd520e356311c2b2f012f2724aeb77a8b921a Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 06:35:16 +0800 Subject: [PATCH 06/31] =?UTF-8?q?clean(client-mod):=20=E6=B8=85=E7=90=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftEngineFabricMod/util/YamlUtils.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index e677a51d5..985a403c9 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -25,18 +25,12 @@ public class YamlUtils { private static final Yaml yaml = new Yaml(); private static final RegistryWrapper registryWrapper = BuiltinRegistries.createWrapperLookup().getOrThrow(RegistryKeys.BLOCK); - /** - * 从指定路径加载 YAML 文件 - */ public static T loadConfig(Path filePath) throws IOException { try (InputStream inputStream = Files.newInputStream(filePath)) { return yaml.load(inputStream); } } - /** - * 确保配置文件存在(不存在时从 JAR 内释放) - */ public static void ensureConfigFile(String fileName) throws IOException { Path configDir = Path.of(CONFIG_DIR); if (!Files.exists(configDir)) { @@ -91,22 +85,17 @@ public class YamlUtils { Map stateIdMapper, Map blockUsageCounter ) { - // 1. 转换方块状态(更明确的变量名) final BlockState sourceState = createBlockData(entry.getKey()); final BlockState targetState = createBlockData(entry.getValue()); - // 2. 提前返回无效状态(合并校验逻辑) if (sourceState == null || targetState == null) { return; } - // 3. 获取状态ID(提取重复操作) final int sourceStateId = Block.STATE_IDS.getRawId(sourceState); final int targetStateId = Block.STATE_IDS.getRawId(targetState); - // 4. 记录映射关系(使用 putIfAbsent 避免覆盖) if (stateIdMapper.putIfAbsent(sourceStateId, targetStateId) == null) { - // 5. 统计方块使用次数(使用 computeIfAbsent 优化) final Block sourceBlock = sourceState.getBlock(); final Identifier blockId = Registries.BLOCK.getId(sourceBlock); blockUsageCounter.merge(blockId, 1, Integer::sum); From ddc605e3688e07d0fa2babb59fcd3ea1ee1061d2 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 07:17:52 +0800 Subject: [PATCH 07/31] =?UTF-8?q?build(client-mod):=20=E5=B0=86=20build.gr?= =?UTF-8?q?adle=20=E9=87=8D=E5=91=BD=E5=90=8D=E4=B8=BA=20build.gradle.kts?= =?UTF-8?q?=E5=B9=B6=E8=BF=9B=E8=A1=8C=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client-mod/build.gradle | 90 ----------------------------------- client-mod/build.gradle.kts | 95 +++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 90 deletions(-) delete mode 100644 client-mod/build.gradle create mode 100644 client-mod/build.gradle.kts diff --git a/client-mod/build.gradle b/client-mod/build.gradle deleted file mode 100644 index 61675a3b9..000000000 --- a/client-mod/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ -plugins { - id 'fabric-loom' version '1.10-SNAPSHOT' - id 'com.gradleup.shadow' version '9.0.0-beta11' -} - -version = project.project_version -group = project.project_group - -base { - archivesName = "craft-engine-fabric-mod" -} - -sourceSets { - client { - compileClasspath += main.compileClasspath - runtimeClasspath += main.runtimeClasspath - } - main { - output.dir(client.output) - } -} - -shadowJar { - relocate('org.yaml', 'net.momirealms.craftengine.libraries.org.yaml') - configurations = [project.configurations.shadow] - archiveFileName = "${base.archivesName.get()}-${project.version}-shadow.jar" - from sourceSets.main.output - from sourceSets.client.output -} - -remapJar { - dependsOn shadowJar - inputFile = shadowJar.archiveFile - - destinationDirectory = file("$rootDir/target") - archiveFileName = "${base.archivesName.get()}-${project.version}.jar" -} - -loom { - mods { - "craft-engine-fabric-mod" { - sourceSet sourceSets.main - sourceSet sourceSets.client - } - } -} - -configurations { - shadow - implementation.extendsFrom(shadow) -} - -dependencies { - minecraft "com.mojang:minecraft:${project.latest_minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - shadow 'org.yaml:snakeyaml:2.4' -} - -processResources { - inputs.property "version", project.version - inputs.property "minecraft_version", project.latest_minecraft_version - inputs.property "loader_version", project.loader_version - filteringCharset "UTF-8" - - filesMatching("fabric.mod.json") { - expand "version": project.version, - "minecraft_version": project.latest_minecraft_version, - "loader_version": project.loader_version - } -} - -def targetJavaVersion = 21 -tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { - it.options.release.set(targetJavaVersion) - } -} - -java { - def javaVersion = JavaVersion.toVersion(targetJavaVersion) - if (JavaVersion.current() < javaVersion) { - toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) - } - withSourcesJar() -} - -tasks.build.dependsOn \ No newline at end of file diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts new file mode 100644 index 000000000..54a451fee --- /dev/null +++ b/client-mod/build.gradle.kts @@ -0,0 +1,95 @@ +plugins { + id("fabric-loom") version "1.10-SNAPSHOT" + id("com.gradleup.shadow") version "9.0.0-beta11" +} + +version = property("project_version")!! +group = property("project_group")!! +val project_version: String by project +val latest_minecraft_version: String by project +val loader_version: String by project + +base { + archivesName.set("craft-engine-fabric-mod") +} + +sourceSets { + create("client") { + compileClasspath += sourceSets.main.get().compileClasspath + runtimeClasspath += sourceSets.main.get().runtimeClasspath + } + main { + output.dir(sourceSets["client"].output) + } +} + +tasks.shadowJar { + relocate("org.yaml", "net.momirealms.craftengine.libraries.org.yaml") + configurations = listOf(project.configurations.getByName("shadow")) + archiveFileName.set("${base.archivesName.get()}-${project.version}-shadow.jar") + from(sourceSets.main.get().output) + from(sourceSets["client"].output) +} + +tasks.remapJar { + dependsOn(tasks.shadowJar) + inputFile.set(tasks.shadowJar.get().archiveFile) + + destinationDirectory.set(file("$rootDir/target")) + archiveFileName.set("${base.archivesName.get()}-${project.version}.jar") +} + +loom { + mods { + create("craft-engine-fabric-mod") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets["client"]) + } + } +} + +dependencies { + minecraft("com.mojang:minecraft:${property("latest_minecraft_version")}") + mappings("net.fabricmc:yarn:${property("yarn_mappings")}:v2") + modImplementation("net.fabricmc:fabric-loader:${property("loader_version")}") + modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}") + add("shadow", "org.yaml:snakeyaml:2.4") +} + +tasks.processResources { + inputs.property("version", project_version) + inputs.property("minecraft_version", latest_minecraft_version) + inputs.property("loader_version", loader_version) + + filteringCharset = "UTF-8" + + filesMatching("fabric.mod.json") { + expand( + "version" to project_version, + "minecraft_version" to latest_minecraft_version, + "loader_version" to loader_version + ) + } +} + +val targetJavaVersion = 21 +tasks.withType().configureEach { + options.encoding = "UTF-8" + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { + options.release.set(targetJavaVersion) + } +} + +java { + val javaVersion = JavaVersion.toVersion(targetJavaVersion) + if (JavaVersion.current() < javaVersion) { + toolchain { + languageVersion.set(JavaLanguageVersion.of(targetJavaVersion)) + } + } + withSourcesJar() +} + +tasks.build { + dependsOn(tasks.shadowJar) +} \ No newline at end of file From a855612bc84313fc1fcdbdfffb2efc4c82a7824f Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 07:18:58 +0800 Subject: [PATCH 08/31] =?UTF-8?q?build(client-mod):=20=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E9=85=8D=E7=BD=AE=E4=B8=AD=E7=9A=84=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client-mod/build.gradle.kts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts index 54a451fee..39bbbfec0 100644 --- a/client-mod/build.gradle.kts +++ b/client-mod/build.gradle.kts @@ -5,9 +5,9 @@ plugins { version = property("project_version")!! group = property("project_group")!! -val project_version: String by project -val latest_minecraft_version: String by project -val loader_version: String by project +val projectVersion: String by project +val latestMinecraftVersion: String by project +val loaderVersion: String by project base { archivesName.set("craft-engine-fabric-mod") @@ -57,17 +57,17 @@ dependencies { } tasks.processResources { - inputs.property("version", project_version) - inputs.property("minecraft_version", latest_minecraft_version) - inputs.property("loader_version", loader_version) + inputs.property("version", projectVersion) + inputs.property("minecraft_version", latestMinecraftVersion) + inputs.property("loader_version", loaderVersion) filteringCharset = "UTF-8" filesMatching("fabric.mod.json") { expand( - "version" to project_version, - "minecraft_version" to latest_minecraft_version, - "loader_version" to loader_version + "version" to projectVersion, + "minecraft_version" to latestMinecraftVersion, + "loader_version" to loaderVersion ) } } From 400cd53c184219a3ecbf09813169d6ea34128b68 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 07:20:06 +0800 Subject: [PATCH 09/31] =?UTF-8?q?build(client-mod):=20=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=9E=84=E5=BB=BA=E9=85=8D=E7=BD=AE=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E9=87=8F=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client-mod/build.gradle.kts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts index 39bbbfec0..54a451fee 100644 --- a/client-mod/build.gradle.kts +++ b/client-mod/build.gradle.kts @@ -5,9 +5,9 @@ plugins { version = property("project_version")!! group = property("project_group")!! -val projectVersion: String by project -val latestMinecraftVersion: String by project -val loaderVersion: String by project +val project_version: String by project +val latest_minecraft_version: String by project +val loader_version: String by project base { archivesName.set("craft-engine-fabric-mod") @@ -57,17 +57,17 @@ dependencies { } tasks.processResources { - inputs.property("version", projectVersion) - inputs.property("minecraft_version", latestMinecraftVersion) - inputs.property("loader_version", loaderVersion) + inputs.property("version", project_version) + inputs.property("minecraft_version", latest_minecraft_version) + inputs.property("loader_version", loader_version) filteringCharset = "UTF-8" filesMatching("fabric.mod.json") { expand( - "version" to projectVersion, - "minecraft_version" to latestMinecraftVersion, - "loader_version" to loaderVersion + "version" to project_version, + "minecraft_version" to latest_minecraft_version, + "loader_version" to loader_version ) } } From 1963f190397b614bcb8683d82e1ce612a39e5796 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 11:20:05 +0800 Subject: [PATCH 10/31] =?UTF-8?q?feat(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 10 +++++ .../plugin/network/PacketConsumers.java | 17 +++---- .../plugin/user/BukkitServerPlayer.java | 10 +++++ .../client/CraftEngineFabricModClient.java | 3 ++ .../client/network/ByteArrayCodec.java | 20 +++++++++ .../client/network/CraftEnginePayload.java | 20 +++++++++ .../CraftEngineFabricMod.java | 10 ++++- .../craftEngineFabricMod/util/BlockUtils.java | 45 +++++++++++++++++++ .../util/LoggerFilter.java | 21 +++++++++ .../util/RegisterBlocks.java | 8 +++- .../craftEngineFabricMod/util/YamlUtils.java | 2 +- .../core/plugin/network/NetWorkUser.java | 4 ++ 12 files changed, 158 insertions(+), 12 deletions(-) create mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java create mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java create mode 100644 client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java create mode 100644 client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java 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 index 0763f2f44..e1cdde613 100644 --- 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 @@ -26,6 +26,7 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -158,6 +159,15 @@ public class BukkitNetworkManager implements NetworkManager, Listener { this.onlineUsers.remove(player.getUniqueId()); } + @EventHandler + public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) { + Player player = event.getPlayer(); + NetWorkUser user = getUser(player); + if (user != null) { + user.setUsingClientMod(true); + } + } + @Override public Collection onlineUsers() { return onlineUsers.values(); 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 index ab80d70f4..88b142d44 100644 --- 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 @@ -55,7 +55,8 @@ public class PacketConsumers { BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize()); } - public static int remap(int stateId) { + public static int remap(int stateId, NetWorkUser user) { + if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(stateId)) return stateId; return mappings[stateId]; } @@ -74,11 +75,11 @@ public class PacketConsumers { PalettedContainer container = mcSection.blockStateContainer(); Palette palette = container.data().palette(); if (palette.canRemap()) { - palette.remap(PacketConsumers::remap); + palette.remap(stateId -> remap(stateId, user)); } else { for (int j = 0; j < 4096; j ++) { int state = container.get(j); - int newState = remap(state); + int newState = remap(state, user); if (newState != state) { container.set(j, newState); } @@ -105,7 +106,7 @@ public class PacketConsumers { for (int i = 0; i < blocks; i++) { long k = buf.readVarLong(); positions[i] = (short) ((int) (k & 4095L)); - states[i] = remap((int) (k >>> 12)); + states[i] = remap((int) (k >>> 12), user); } buf.clear(); buf.writeVarInt(event.packetID()); @@ -125,7 +126,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); BlockPos pos = buf.readBlockPos(buf); int before = buf.readVarInt(); - int state = remap(before); + int state = remap(before, user); if (state == before) { return; } @@ -147,7 +148,7 @@ public class PacketConsumers { BlockPos blockPos = buf.readBlockPos(buf); int state = buf.readInt(); boolean global = buf.readBoolean(); - int newState = remap(state); + int newState = remap(state, user); if (newState == state) { return; } @@ -181,7 +182,7 @@ public class PacketConsumers { if (!Reflections.clazz$BlockParticleOption.isInstance(option)) return; Object blockState = Reflections.field$BlockParticleOption$blockState.get(option); int id = BlockStateUtils.blockStateToId(blockState); - int remapped = remap(id); + int remapped = remap(id, user); if (remapped == id) return; Reflections.field$BlockParticleOption$blockState.set(option, BlockStateUtils.idToBlockState(remapped)); event.setChanged(true); @@ -523,7 +524,7 @@ public class PacketConsumers { // Falling blocks if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { int data = Reflections.field$ClientboundAddEntityPacket$data.getInt(packet); - int remapped = remap(data); + int remapped = remap(data, user); if (remapped != data) { Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); } 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 index 07e3fccad..90180937c 100644 --- 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 @@ -63,6 +63,8 @@ public class BukkitServerPlayer extends Player { private Key lastUsedRecipe = null; + private boolean usingClientMod = false; + private Map> furnitureView = new ConcurrentHashMap<>(); public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { @@ -616,4 +618,12 @@ public class BukkitServerPlayer extends Player { public void setLastUsedRecipe(Key lastUsedRecipe) { this.lastUsedRecipe = lastUsedRecipe; } + + public boolean usingClientMod() { + return this.usingClientMod; + } + + public void setUsingClientMod(boolean usingClientMod) { + this.usingClientMod = usingClientMod; + } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index cd5cafe45..01fffd7dd 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -2,15 +2,18 @@ package net.momirealms.craftEngineFabricMod.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; public class CraftEngineFabricModClient implements ClientModInitializer { public static final String MOD_ID = "craftengine"; @Override public void onInitializeClient() { + PayloadTypeRegistry.playS2C().register(CraftEnginePayload.ID, CraftEnginePayload.CODEC); Registries.BLOCK.forEach(block -> { Identifier id = Registries.BLOCK.getId(block); if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java new file mode 100644 index 000000000..28782f35d --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java @@ -0,0 +1,20 @@ +package net.momirealms.craftEngineFabricMod.client.network; + +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; + +public class ByteArrayCodec implements PacketCodec { + + @Override + public void encode(RegistryByteBuf buf, byte[] value) { + buf.writeBytes(value); + } + + @Override + public byte[] decode(RegistryByteBuf buf) { + int length = buf.readableBytes(); + byte[] data = new byte[length]; + buf.readBytes(data); + return data; + } +} \ No newline at end of file diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java new file mode 100644 index 000000000..da4a971f8 --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java @@ -0,0 +1,20 @@ +package net.momirealms.craftEngineFabricMod.client.network; + +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; + +public record CraftEnginePayload(byte[] data) implements CustomPayload { + public static final Identifier ADD_CRAFTENGINE_BLOCK = Identifier.of("craftengine", "payload"); + public static final Id ID = new Id<>(CraftEnginePayload.ADD_CRAFTENGINE_BLOCK); + public static final PacketCodec CODEC = PacketCodec.tuple( + new ByteArrayCodec(), CraftEnginePayload::data, + CraftEnginePayload::new + ); + + @Override + public Id getId() { + return ID; + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index a8abd3abb..ad91ee19d 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -1,7 +1,10 @@ package net.momirealms.craftEngineFabricMod; import net.fabricmc.api.ModInitializer; +import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.util.BlockUtils; +import net.momirealms.craftEngineFabricMod.util.LoggerFilter; import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; import net.momirealms.craftEngineFabricMod.util.YamlUtils; @@ -13,6 +16,7 @@ public class CraftEngineFabricMod implements ModInitializer { @Override public void onInitialize() { + LoggerFilter.filter(); try { YamlUtils.ensureConfigFile("additional-real-blocks.yml"); YamlUtils.ensureConfigFile("mappings.yml"); @@ -21,7 +25,11 @@ public class CraftEngineFabricMod implements ModInitializer { for (Map.Entry entry : map.entrySet()) { Identifier replacedBlockId = entry.getKey(); for (int i = 0; i < entry.getValue(); i++) { - RegisterBlocks.register(replacedBlockId.getPath() + "_" + i); + BlockState blockState = YamlUtils.createBlockData("minecraft:" + replacedBlockId.getPath()); + RegisterBlocks.register( + replacedBlockId.getPath() + "_" + i, + BlockUtils.canPassThrough(blockState) + ); } } System.out.println("Registered " + map.size() + " additional real blocks."); diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java new file mode 100644 index 000000000..2e58963b5 --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java @@ -0,0 +1,45 @@ +package net.momirealms.craftEngineFabricMod.util; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import static java.util.Objects.requireNonNull; + +public class BlockUtils { + private final static Field COLLIDABLE_FIELD = requireNonNull(getDeclaredField(AbstractBlock.Settings.class, boolean.class, 0)); + + @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; + } + + @NotNull + public static T setAccessible(@NotNull final T o) { + o.setAccessible(true); + return o; + } + + public static boolean canPassThrough(BlockState state) { + try { + if (state == null) return false; + AbstractBlock.Settings settings = state.getBlock().getSettings(); + boolean collidable = COLLIDABLE_FIELD.getBoolean(settings); + return !collidable; + } catch (IllegalAccessException e) { + throw new RuntimeException("Failed to access 'collidable' field", e); + } + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java new file mode 100644 index 000000000..1c6c45c00 --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java @@ -0,0 +1,21 @@ +package net.momirealms.craftEngineFabricMod.util; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.filter.AbstractFilter; + +public class LoggerFilter { + public static void filter() { + Logger rootLogger = (Logger) LogManager.getRootLogger(); + rootLogger.addFilter(new AbstractFilter() { + @Override + public Result filter(LogEvent event) { + if (event.getMessage().getFormattedMessage().contains("Missing model for variant: 'craftengine:")) { + return Result.DENY; + } + return Result.NEUTRAL; + } + }); + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java index 55f064f4b..9d9f5f079 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java @@ -2,6 +2,7 @@ package net.momirealms.craftEngineFabricMod.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; +import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; @@ -12,8 +13,11 @@ import net.momirealms.craftEngineFabricMod.CraftEngineFabricMod; import java.util.function.Function; public class RegisterBlocks { - public static Block register(String name) { - return register(name, Block::new, Block.Settings.create().nonOpaque()); + @SuppressWarnings("UnusedReturnValue") + public static Block register(String name, boolean canPassThrough) { + AbstractBlock.Settings settings = Block.Settings.create().nonOpaque().strength(-1.0F, 3600000.0F); + if (canPassThrough) settings.noCollision(); + return register(name, Block::new, settings); } public static Block register(String name, Function blockFactory, AbstractBlock.Settings settings) { diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 985a403c9..3d0e664a7 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -102,7 +102,7 @@ public class YamlUtils { } } - private static BlockState createBlockData(String blockState) { + public static BlockState createBlockData(String blockState) { try { StringReader reader = new StringReader(blockState); BlockArgumentParser.BlockResult arg = BlockArgumentParser.block(registryWrapper, reader, true); 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 index c70b49362..cb80057c8 100644 --- 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 @@ -36,4 +36,8 @@ public interface NetWorkUser { Object platformPlayer(); Map> furnitureView(); + + boolean usingClientMod(); + + void setUsingClientMod(boolean usingClientMod); } From e70ad6a85af24be5da5ed1672fec474c008ff514 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 11:33:58 +0800 Subject: [PATCH 11/31] =?UTF-8?q?feat(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=A7=86=E8=A7=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/CraftEngineFabricModClient.java | 6 +++++- .../client/util/BlockUtils.java | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index 01fffd7dd..2d846701b 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -7,6 +7,7 @@ import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; +import net.momirealms.craftEngineFabricMod.client.util.BlockUtils; public class CraftEngineFabricModClient implements ClientModInitializer { public static final String MOD_ID = "craftengine"; @@ -17,7 +18,10 @@ public class CraftEngineFabricModClient implements ClientModInitializer { Registries.BLOCK.forEach(block -> { Identifier id = Registries.BLOCK.getId(block); if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { - BlockRenderLayerMap.INSTANCE.putBlock(block, RenderLayer.getTranslucent()); + BlockRenderLayerMap.INSTANCE.putBlock(block, RenderLayer.getCutoutMipped()); + if (id.getPath().contains("leaves")) { + BlockUtils.registerColor(block); + } } }); } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java new file mode 100644 index 000000000..284859cbf --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java @@ -0,0 +1,21 @@ +package net.momirealms.craftEngineFabricMod.client.util; + +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; +import net.minecraft.block.Block; +import net.minecraft.client.color.world.BiomeColors; +import net.minecraft.world.biome.FoliageColors; + +public class BlockUtils { + public static void registerColor(Block block) { + + ColorProviderRegistry.BLOCK.register( + (state, world, pos, tintIndex) -> { + if (world != null && pos != null) { + return BiomeColors.getFoliageColor(world, pos); + } + return FoliageColors.DEFAULT; // 默认颜色 + }, + block + ); + } +} From a84dc3cd04a6cbf5e1aa2533bb6d93dbeb2ef6ea Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 11:40:44 +0800 Subject: [PATCH 12/31] =?UTF-8?q?feat(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=A7=86=E8=A7=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 index 88b142d44..b443ff3bd 100644 --- 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 @@ -56,8 +56,9 @@ public class PacketConsumers { } public static int remap(int stateId, NetWorkUser user) { - if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(stateId)) return stateId; - return mappings[stateId]; + int remapId = mappings[stateId]; + if (user.usingClientMod() && BlockStateUtils.isVanillaBlock(remapId)) return stateId; + return remapId; } public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { From 0f7f5e87d90cb7fb4d060806f8881cd1b36dcd82 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 12:09:02 +0800 Subject: [PATCH 13/31] =?UTF-8?q?feat(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=A7=86=E8=A7=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index b443ff3bd..055f5c200 100644 --- 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 @@ -57,7 +57,8 @@ public class PacketConsumers { public static int remap(int stateId, NetWorkUser user) { int remapId = mappings[stateId]; - if (user.usingClientMod() && BlockStateUtils.isVanillaBlock(remapId)) return stateId; + if (remapId == stateId) return stateId; + if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(stateId)) return stateId; return remapId; } From 36edf67dfef61b490f0303449c116e7fd605ad6c Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 14:26:01 +0800 Subject: [PATCH 14/31] =?UTF-8?q?feat(client-mod):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=A7=86=E8=A7=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/BukkitNetworkManager.java | 6 +++--- client-mod/build.gradle.kts | 2 ++ .../craftEngineFabricMod/client/util/BlockUtils.java | 2 +- .../craftEngineFabricMod/util/RegisterBlocks.java | 1 - 4 files changed, 6 insertions(+), 5 deletions(-) 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 index e1cdde613..5373cac5a 100644 --- 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 @@ -161,11 +161,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener { @EventHandler public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) { + if (!event.getChannel().equals("craftengine:payload")) return; Player player = event.getPlayer(); NetWorkUser user = getUser(player); - if (user != null) { - user.setUsingClientMod(true); - } + if (user == null) return; + user.setUsingClientMod(true); } @Override diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts index 54a451fee..9f6bcae72 100644 --- a/client-mod/build.gradle.kts +++ b/client-mod/build.gradle.kts @@ -19,6 +19,8 @@ sourceSets { runtimeClasspath += sourceSets.main.get().runtimeClasspath } main { + compileClasspath += sourceSets["client"].output + runtimeClasspath += sourceSets["client"].output output.dir(sourceSets["client"].output) } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java index 284859cbf..ecb969783 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java @@ -13,7 +13,7 @@ public class BlockUtils { if (world != null && pos != null) { return BiomeColors.getFoliageColor(world, pos); } - return FoliageColors.DEFAULT; // 默认颜色 + return FoliageColors.DEFAULT; }, block ); diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java index 9d9f5f079..79ee25203 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java @@ -2,7 +2,6 @@ package net.momirealms.craftEngineFabricMod.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; -import net.minecraft.block.Blocks; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; From d05c0fe6894401fb69229be1b12ce44f6ff2e1d0 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 14:30:38 +0800 Subject: [PATCH 15/31] =?UTF-8?q?fix(client-mod):=20=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E8=AF=86=E5=88=AB=E5=88=B0=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AFmod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftEngineFabricMod/client/CraftEngineFabricModClient.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index 2d846701b..b7abd9401 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -2,6 +2,7 @@ package net.momirealms.craftEngineFabricMod.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; @@ -15,6 +16,7 @@ public class CraftEngineFabricModClient implements ClientModInitializer { @Override public void onInitializeClient() { PayloadTypeRegistry.playS2C().register(CraftEnginePayload.ID, CraftEnginePayload.CODEC); + ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); Registries.BLOCK.forEach(block -> { Identifier id = Registries.BLOCK.getId(block); if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { From 19f49073a775babdafd1ff1ecd64968d927ef2ec Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 16:39:12 +0800 Subject: [PATCH 16/31] =?UTF-8?q?feat(client-mod):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A8=A1=E7=BB=84=E9=85=8D=E7=BD=AE=E8=8F=9C=E5=8D=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client-mod/build.gradle.kts | 13 +++++- .../client/CraftEngineFabricModClient.java | 16 ++++++- .../client/config/ModConfig.java | 35 +++++++++++++++ .../client/config/ModMenuIntegration.java | 11 +++++ .../craftEngineFabricMod/util/YamlUtils.java | 6 ++- .../CraftEngineFabricMod.java | 43 +++++++++++++++++++ .../craft-engine-fabric-mod/lang/en_us.json | 6 +++ .../craft-engine-fabric-mod/lang/zh_cn.json | 6 +++ client-mod/src/main/resources/fabric.mod.json | 21 ++++++--- gradle.properties | 2 + 10 files changed, 150 insertions(+), 9 deletions(-) create mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java create mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java rename client-mod/src/{main => client}/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java (96%) create mode 100644 client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json create mode 100644 client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts index 9f6bcae72..2eab55f43 100644 --- a/client-mod/build.gradle.kts +++ b/client-mod/build.gradle.kts @@ -8,6 +8,8 @@ group = property("project_group")!! val project_version: String by project val latest_minecraft_version: String by project val loader_version: String by project +var modmenu_version = property("modmenu_version") +var cloth_version = property("cloth_version") base { archivesName.set("craft-engine-fabric-mod") @@ -50,11 +52,18 @@ loom { } } +repositories { + maven("https://maven.shedaniel.me/") + maven("https://maven.terraformersmc.com/releases/") +} + dependencies { minecraft("com.mojang:minecraft:${property("latest_minecraft_version")}") mappings("net.fabricmc:yarn:${property("yarn_mappings")}:v2") modImplementation("net.fabricmc:fabric-loader:${property("loader_version")}") modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_version")}") + modApi("me.shedaniel.cloth:cloth-config-fabric:${property("cloth_version")}") + modApi("com.terraformersmc:modmenu:${property("modmenu_version")}") add("shadow", "org.yaml:snakeyaml:2.4") } @@ -69,7 +78,9 @@ tasks.processResources { expand( "version" to project_version, "minecraft_version" to latest_minecraft_version, - "loader_version" to loader_version + "loader_version" to loader_version, + "modmenu_version" to modmenu_version, + "cloth_version" to cloth_version ) } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index b7abd9401..f52a736a5 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -2,13 +2,21 @@ package net.momirealms.craftEngineFabricMod.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.client.config.ModConfig; import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; import net.momirealms.craftEngineFabricMod.client.util.BlockUtils; +import net.momirealms.craftEngineFabricMod.util.YamlUtils; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Map; public class CraftEngineFabricModClient implements ClientModInitializer { public static final String MOD_ID = "craftengine"; @@ -16,7 +24,6 @@ public class CraftEngineFabricModClient implements ClientModInitializer { @Override public void onInitializeClient() { PayloadTypeRegistry.playS2C().register(CraftEnginePayload.ID, CraftEnginePayload.CODEC); - ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); Registries.BLOCK.forEach(block -> { Identifier id = Registries.BLOCK.getId(block); if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { @@ -26,5 +33,12 @@ public class CraftEngineFabricModClient implements ClientModInitializer { } } }); + ClientTickEvents.START_CLIENT_TICK.register(client -> { + if (!ModConfig.enableNetwork) { + ClientPlayNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID.id()); + return; + } + ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); + }); } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java new file mode 100644 index 000000000..3e4342517 --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java @@ -0,0 +1,35 @@ +package net.momirealms.craftEngineFabricMod.client.config; + +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class ModConfig { + public static boolean enableNetwork = true; + + public static Screen getConfigScreen(Screen parent) { + ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(parent) + .setTitle(Text.translatable("title.craftengine.config")); + + ConfigCategory general = builder.getOrCreateCategory(Text.translatable("category.craftengine.general")); + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + general.addEntry(entryBuilder.startBooleanToggle( + Text.translatable("option.craftengine.enable_network") + .formatted(Formatting.WHITE), + enableNetwork) + .setDefaultValue(true) + .setSaveConsumer(newValue -> enableNetwork = newValue) + .setTooltip( + Text.translatable("tooltip.craftengine.enable_network") + .formatted(Formatting.GRAY) + ) + .build()); + + return builder.build(); + } +} diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java new file mode 100644 index 000000000..730b58a45 --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java @@ -0,0 +1,11 @@ +package net.momirealms.craftEngineFabricMod.client.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; + +public class ModMenuIntegration implements ModMenuApi { + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return ModConfig::getConfigScreen; + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java similarity index 96% rename from client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java rename to client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 3d0e664a7..6b3eb2805 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -21,7 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; public class YamlUtils { - private static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; + public static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; private static final Yaml yaml = new Yaml(); private static final RegistryWrapper registryWrapper = BuiltinRegistries.createWrapperLookup().getOrThrow(RegistryKeys.BLOCK); @@ -31,6 +31,10 @@ public class YamlUtils { } } + public static void saveConfig(Map config, Path filePath) throws IOException { + Files.writeString(filePath, yaml.dump(config)); + } + public static void ensureConfigFile(String fileName) throws IOException { Path configDir = Path.of(CONFIG_DIR); if (!Files.exists(configDir)) { diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index ad91ee19d..937c3116b 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -1,25 +1,37 @@ package net.momirealms.craftEngineFabricMod; import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; +import net.momirealms.craftEngineFabricMod.client.config.ModConfig; import net.momirealms.craftEngineFabricMod.util.BlockUtils; import net.momirealms.craftEngineFabricMod.util.LoggerFilter; import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; import net.momirealms.craftEngineFabricMod.util.YamlUtils; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; import java.io.IOException; +import java.io.InputStream; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Map; public class CraftEngineFabricMod implements ModInitializer { + private static final Path CONFIG_PATH = FabricLoader.getInstance().getConfigDir().resolve("craft-engine-fabric-mod/config.yml"); public static final String MOD_ID = "craftengine"; @Override public void onInitialize() { + loadConfig(); + Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); LoggerFilter.filter(); try { YamlUtils.ensureConfigFile("additional-real-blocks.yml"); YamlUtils.ensureConfigFile("mappings.yml"); + YamlUtils.ensureConfigFile("config.yml"); Map map = YamlUtils.loadMappingsAndAdditionalBlocks(); System.out.println("Loaded " + map.size() + " additional real blocks."); for (Map.Entry entry : map.entrySet()) { @@ -37,4 +49,35 @@ public class CraftEngineFabricMod implements ModInitializer { e.printStackTrace(); } } + + @SuppressWarnings("unchecked") + private void loadConfig() { + if (!Files.exists(CONFIG_PATH)) { + saveConfig(); + return; + } + + try (InputStream inputStream = Files.newInputStream(CONFIG_PATH)) { + Yaml yaml = new Yaml(); + var config = yaml.loadAs(inputStream, java.util.Map.class); + ModConfig.enableNetwork = (Boolean) config.getOrDefault("enable-network", true); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void saveConfig() { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + Yaml yaml = new Yaml(options); + + var data = new java.util.HashMap(); + data.put("enable-network", ModConfig.enableNetwork); + + try (Writer writer = Files.newBufferedWriter(CONFIG_PATH)) { + yaml.dump(data, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json new file mode 100644 index 000000000..fccc82ec9 --- /dev/null +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json @@ -0,0 +1,6 @@ +{ + "title.craftengine.config": "CraftEngine Settings", + "category.craftengine.general": "General", + "option.craftengine.enable_network": "Enable custom blocks in server", + "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect" +} \ No newline at end of file diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json new file mode 100644 index 000000000..ff5183d31 --- /dev/null +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json @@ -0,0 +1,6 @@ +{ + "title.craftengine.config": "CraftEngine设置", + "category.craftengine.general": "通用", + "option.craftengine.enable_network": "启用服务器内自定义方块", + "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效" +} \ No newline at end of file diff --git a/client-mod/src/main/resources/fabric.mod.json b/client-mod/src/main/resources/fabric.mod.json index e018bd02a..646ff1fc5 100644 --- a/client-mod/src/main/resources/fabric.mod.json +++ b/client-mod/src/main/resources/fabric.mod.json @@ -3,10 +3,16 @@ "id": "craft-engine-fabric-mod", "version": "${version}", - "name": "craft-engine-fabric-mod", - "description": "", - "authors": [], - "contact": {}, + "name": "CraftEngine Fabric Mod", + "description": "CraftEngine Fabric Mod", + "authors": [ + "jhqwqmc" + ], + "contact": { + "name": "CraftEngine", + "homepage": "https://github.com/Xiao-MoMi/craft-engine", + "issues": "https://github.com/Xiao-MoMi/craft-engine/issues" + }, "license": "GPL-3.0", "icon": "assets/craft-engine-fabric-mod/icon.png", @@ -14,12 +20,15 @@ "environment": "client", "entrypoints": { "client": ["net.momirealms.craftEngineFabricMod.client.CraftEngineFabricModClient"], - "main": ["net.momirealms.craftEngineFabricMod.CraftEngineFabricMod"] + "main": ["net.momirealms.craftEngineFabricMod.CraftEngineFabricMod"], + "modmenu": ["net.momirealms.craftEngineFabricMod.client.config.ModMenuIntegration"] }, "depends": { "fabricloader": ">=${loader_version}", "fabric": "*", - "minecraft": "${minecraft_version}" + "minecraft": "${minecraft_version}", + "modmenu": ">=${modmenu_version}", + "cloth-config": ">=${cloth_version}" } } diff --git a/gradle.properties b/gradle.properties index f4ca831c9..283ccaa6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,6 +51,8 @@ anti_grief_version=0.13 fabric_version=0.119.2+1.21.4 yarn_mappings=1.21.4+build.8 loader_version=0.16.10 +modmenu_version=13.0.3 +cloth_version=17.0.144 org.gradle.jvmargs=-Xmx1G # Proxy settings From f12350fec0936f837faa731d2fdc44946ce7d373 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 16:47:16 +0800 Subject: [PATCH 17/31] Added sync blocks option --- bukkit-loader/src/main/resources/config.yml | 4 ++ .../craftengine/bukkit/util/Reflections.java | 57 +++++++++++++++++++ .../bukkit/world/BukkitWorldManager.java | 52 +++++++++++++++++ .../core/plugin/config/ConfigManager.java | 6 ++ .../craftengine/core/world/ChunkPos.java | 9 +++ 5 files changed, 128 insertions(+) diff --git a/bukkit-loader/src/main/resources/config.yml b/bukkit-loader/src/main/resources/config.yml index e3e398072..0546ca672 100644 --- a/bukkit-loader/src/main/resources/config.yml +++ b/bukkit-loader/src/main/resources/config.yml @@ -210,6 +210,10 @@ performance: # Disabling this option prevents the plugin from converting custom blocks to vanilla states when chunks are unloaded. # While this can improve performance, custom blocks will turn into air if the plugin is uninstalled. restore-vanilla-blocks-on-chunk-unload: true + # When you edit a map locally using CraftEngine fabric mod, the custom block data is not immediately synchronized with the + # server's CraftEngine internal data. Enabling this option will synchronize the data when the chunk is loaded. + # (This option only slightly impacts performance, which has been fully optimized, so you don't need to worry too much.) + sync-custom-blocks-on-chunk-load: false # If you disable this, it's a must to disable the above option. restore-custom-blocks-on-chunk-load: true 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 index d0819e6b6..95eb2c69c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -1823,6 +1823,12 @@ public class Reflections { ) ); + public static final Method method$LevelChunkSection$getBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelChunkSection, clazz$BlockState, int.class, int.class, int.class + ) + ); + public static final Class clazz$StatePredicate = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$StatePredicate"), @@ -5371,4 +5377,55 @@ public class Reflections { throw new RuntimeException(e); } } + + public static final Class clazz$SingleValuePalette = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.SingleValuePalette") + ) + ); + + public static final Field field$SingleValuePalette$value = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SingleValuePalette, Object.class, 0 + ) + ); + + public static final Class clazz$HashMapPalette = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.HashMapPalette"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPaletteHash") + ) + ); + + public static final Class clazz$CrudeIncrementalIntIdentityHashBiMap = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("util.CrudeIncrementalIntIdentityHashBiMap"), + BukkitReflectionUtils.assembleMCClass("util.RegistryID") + ) + ); + + public static final Field field$CrudeIncrementalIntIdentityHashBiMap$keys = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CrudeIncrementalIntIdentityHashBiMap, Object.class.arrayType(), 0 + ) + ); + + public static final Field field$HashMapPalette$values = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$HashMapPalette, clazz$CrudeIncrementalIntIdentityHashBiMap, 0 + ) + ); + + public static final Class clazz$LinearPalette = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.LinearPalette"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPaletteLinear") + ) + ); + + public static final Field field$LinearPalette$values = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LinearPalette, Object.class.arrayType(), 0 + ) + ); } 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 index d5bc16d95..8b6a9a69c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -2,6 +2,7 @@ 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.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.plugin.config.ConfigManager; @@ -253,6 +254,55 @@ public class BukkitWorldManager implements WorldManager, Listener { for (int i = 0; i < ceSections.length; i++) { CESection ceSection = ceSections[i]; Object section = sections[i]; + if (ConfigManager.syncCustomBlocks()) { + Object statesContainer = Reflections.field$LevelChunkSection$states.get(section); + Object data = Reflections.field$PalettedContainer$data.get(statesContainer); + Object palette = Reflections.field$PalettedContainer$Data$palette.get(data); + boolean requiresSync = false; + if (Reflections.clazz$SingleValuePalette.isInstance(palette)) { + Object onlyBlockState = Reflections.field$SingleValuePalette$value.get(palette); + if (!BlockStateUtils.isVanillaBlock(BlockStateUtils.blockStateToId(onlyBlockState))) { + requiresSync = true; + } + } else if (Reflections.clazz$LinearPalette.isInstance(palette)) { + Object[] blockStates = (Object[]) Reflections.field$LinearPalette$values.get(palette); + for (Object blockState : blockStates) { + if (blockState != null) { + if (!BlockStateUtils.isVanillaBlock(BlockStateUtils.blockStateToId(blockState))) { + requiresSync = true; + break; + } + } + } + } else if (Reflections.clazz$HashMapPalette.isInstance(palette)) { + Object biMap = Reflections.field$HashMapPalette$values.get(palette); + Object[] blockStates = (Object[]) Reflections.field$CrudeIncrementalIntIdentityHashBiMap$keys.get(biMap); + for (Object blockState : blockStates) { + if (blockState != null) { + if (!BlockStateUtils.isVanillaBlock(BlockStateUtils.blockStateToId(blockState))) { + requiresSync = true; + break; + } + } + } + } else { + requiresSync = true; + } + if (requiresSync) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 16; y++) { + Object mcState = Reflections.method$LevelChunkSection$getBlockState.invoke(section, x, y, z); + int stateId = BlockStateUtils.blockStateToId(mcState); + ImmutableBlockState customState = this.plugin.blockManager().getImmutableBlockState(stateId); + if (customState != null) { + ceSection.setBlockState(x, y, z, customState); + } + } + } + } + } + } if (ConfigManager.restoreCustomBlocks()) { if (!ceSection.statesContainer().isEmpty()) { for (int x = 0; x < 16; x++) { @@ -286,4 +336,6 @@ public class BukkitWorldManager implements WorldManager, Listener { } ceChunk.load(); } + + } 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 index 9e7e4f18e..64d50a78a 100644 --- 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 @@ -95,6 +95,7 @@ public class ConfigManager implements Reloadable { protected int performance$max_block_chain_update_limit; protected boolean performance$chunk_system$restore_vanilla_blocks_on_chunk_unload; protected boolean performance$chunk_system$restore_custom_blocks_on_chunk_load; + protected boolean performance$chunk_system$sync_custom_blocks_on_chunk_load; protected boolean furniture$remove_invalid_furniture_on_chunk_load$enable; protected Set furniture$remove_invalid_furniture_on_chunk_load$list; @@ -236,6 +237,7 @@ public class ConfigManager implements Reloadable { performance$light_system$enable = config.getBoolean("performance.light-system.enable", true); performance$chunk_system$restore_vanilla_blocks_on_chunk_unload = config.getBoolean("performance.chunk-system.restore-vanilla-blocks-on-chunk-unload", true); performance$chunk_system$restore_custom_blocks_on_chunk_load = config.getBoolean("performance.chunk-system.restore-custom-blocks-on-chunk-load", true); + performance$chunk_system$sync_custom_blocks_on_chunk_load = config.getBoolean("performance.chunk-system.sync-custom-blocks-on-chunk-load", false); // furniture furniture$remove_invalid_furniture_on_chunk_load$enable = config.getBoolean("furniture.remove-invalid-furniture-on-chunk-load.enable", false); @@ -342,6 +344,10 @@ public class ConfigManager implements Reloadable { return instance.performance$chunk_system$restore_custom_blocks_on_chunk_load; } + public static boolean syncCustomBlocks() { + return instance.performance$chunk_system$sync_custom_blocks_on_chunk_load; + } + public static List foldersToMerge() { return instance.resource_pack$merge_external_folders; } 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 index f90eaaad4..d64ff68c0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java @@ -24,6 +24,15 @@ public class ChunkPos { this.longKey = asLong(this.x, this.z); } + @Override + public String toString() { + return "ChunkPos{" + + "x=" + x + + ", z=" + z + + ", longKey=" + longKey + + '}'; + } + public int x() { return x; } From da78a38305f46b0241c06af75328200463a5a8af Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 16:54:57 +0800 Subject: [PATCH 18/31] Update SaplingBlockBehavior.java --- .../bukkit/block/behavior/SaplingBlockBehavior.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java index d9bd89399..2998fa762 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java @@ -121,7 +121,9 @@ public class SaplingBlockBehavior extends BushBlockBehavior { throw new IllegalArgumentException("stage property not set for sapling"); } double boneMealSuccessChance = MiscUtils.getAsDouble(arguments.getOrDefault("bone-meal-success-chance", 0.45)); - if (arguments.containsKey("tags")) { + if (arguments.containsKey("bottom-block-tags")) { + return new SaplingBlockBehavior(Key.of(feature), stageProperty, MiscUtils.getAsStringList(arguments.get("bottom-block-tags")).stream().map(it -> BlockTags.getOrCreate(Key.of(it))).toList(), boneMealSuccessChance); + } else if (arguments.containsKey("tags")) { return new SaplingBlockBehavior(Key.of(feature), stageProperty, MiscUtils.getAsStringList(arguments.get("tags")).stream().map(it -> BlockTags.getOrCreate(Key.of(it))).toList(), boneMealSuccessChance); } else { return new SaplingBlockBehavior(Key.of(feature), stageProperty, List.of(DIRT_TAG, FARMLAND), boneMealSuccessChance); From 1d40e2999115065f119f9846d18f9869cf3d054e Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 17:11:33 +0800 Subject: [PATCH 19/31] =?UTF-8?q?feat(network):=20=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E6=B3=A8=E5=86=8C=E8=A1=A8=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 6 ++++ .../client/CraftEngineFabricModClient.java | 28 +++++++++++++++---- .../craftEngineFabricMod/util/YamlUtils.java | 4 --- .../craft-engine-fabric-mod/lang/en_us.json | 4 ++- .../craft-engine-fabric-mod/lang/zh_cn.json | 4 ++- 5 files changed, 34 insertions(+), 12 deletions(-) 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 index 5373cac5a..139d24511 100644 --- 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 @@ -10,6 +10,7 @@ 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.bukkit.util.RegistryUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; @@ -30,6 +31,7 @@ import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; @@ -166,6 +168,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener { NetWorkUser user = getUser(player); if (user == null) return; user.setUsingClientMod(true); + int blockRegistrySize = RegistryUtils.currentBlockRegistrySize(); + byte[] payload = ("cp:" + blockRegistrySize).getBytes(StandardCharsets.UTF_8); + player.sendPluginMessage(plugin.bootstrap(), "craftengine:payload", payload); } @Override @@ -177,6 +182,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { public void init() { if (init) return; try { + plugin.bootstrap().getServer().getMessenger().registerOutgoingPluginChannel(plugin.bootstrap(), "craftengine:payload"); Object server = Reflections.method$MinecraftServer$getServer.invoke(null); Object serverConnection = Reflections.field$MinecraftServer$connection.get(server); @SuppressWarnings("unchecked") diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index f52a736a5..c1d5b2f92 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -5,18 +5,17 @@ import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; -import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.Block; +import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.momirealms.craftEngineFabricMod.client.config.ModConfig; import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; import net.momirealms.craftEngineFabricMod.client.util.BlockUtils; -import net.momirealms.craftEngineFabricMod.util.YamlUtils; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Map; +import java.nio.charset.StandardCharsets; public class CraftEngineFabricModClient implements ClientModInitializer { public static final String MOD_ID = "craftengine"; @@ -38,7 +37,24 @@ public class CraftEngineFabricModClient implements ClientModInitializer { ClientPlayNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID.id()); return; } - ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); + ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> { + try { + byte[] data = payload.data(); + String decoded = new String(data, StandardCharsets.UTF_8); + if (decoded.startsWith("cp:")) { + int blockRegistrySize = Integer.parseInt(decoded.substring(3)); + if (Block.STATE_IDS.size() != blockRegistrySize) { + client.disconnect(new DisconnectedScreen( + client.currentScreen, + Text.translatable("disconnect.craftengine.title"), + Text.translatable("disconnect.craftengine.block_registry_mismatch")) + ); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + }); }); } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 6b3eb2805..4e133ef22 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -31,10 +31,6 @@ public class YamlUtils { } } - public static void saveConfig(Map config, Path filePath) throws IOException { - Files.writeString(filePath, yaml.dump(config)); - } - public static void ensureConfigFile(String fileName) throws IOException { Path configDir = Path.of(CONFIG_DIR); if (!Files.exists(configDir)) { diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json index fccc82ec9..4828e8338 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json @@ -2,5 +2,7 @@ "title.craftengine.config": "CraftEngine Settings", "category.craftengine.general": "General", "option.craftengine.enable_network": "Enable custom blocks in server", - "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect" + "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect", + "disconnect.craftengine.block_registry_mismatch": "Block registry size mismatch!", + "disconnect.craftengine.title": "CraftEngine Connection Error" } \ No newline at end of file diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json index ff5183d31..ef1c36b89 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json @@ -2,5 +2,7 @@ "title.craftengine.config": "CraftEngine设置", "category.craftengine.general": "通用", "option.craftengine.enable_network": "启用服务器内自定义方块", - "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效" + "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效", + "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配!", + "disconnect.craftengine.title": "CraftEngine连接错误" } \ No newline at end of file From ebf0cd4dea7a8d526babc8f19398c7fa94e308db Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 17:34:00 +0800 Subject: [PATCH 20/31] =?UTF-8?q?perf(network):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8C=85=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/PacketConsumers.java | 154 ++++++++++++------ 1 file changed, 104 insertions(+), 50 deletions(-) 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 index 055f5c200..c5170df88 100644 --- 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 @@ -55,44 +55,73 @@ public class PacketConsumers { BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize()); } - public static int remap(int stateId, NetWorkUser user) { - int remapId = mappings[stateId]; - if (remapId == stateId) return stateId; - if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(stateId)) return stateId; - return remapId; + 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(stateId -> remap(stateId, user)); - } else { - for (int j = 0; j < 4096; j ++) { - int state = container.get(j); - int newState = remap(state, user); - if (newState != state) { - container.set(j, newState); + if (!user.usingClientMod()) { + 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; } - mcSection.writePacket(newBuf); - } catch (Exception e) { - break; } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); + } else { + 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(state -> BlockStateUtils.isVanillaBlock(state) ? remap(state) : state); + } else { + for (int j = 0; j < 4096; j++) { + int state = container.get(j); + int newState = BlockStateUtils.isVanillaBlock(state) ? remap(state) : state; + if (newState != state) { + container.set(j, newState); + } + } + } + mcSection.writePacket(newBuf); + } catch (Exception e) { + break; + } + } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); } - Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelChunkWithLightPacket", e); } @@ -100,24 +129,46 @@ public class PacketConsumers { 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), user); + if (!user.usingClientMod()) { + 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); + } else { + 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)); + int stateId = (int) (k >>> 12); + states[i] = BlockStateUtils.isVanillaBlock(stateId) ? remap(stateId) : stateId; + } + 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); } - 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); } @@ -128,7 +179,10 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); BlockPos pos = buf.readBlockPos(buf); int before = buf.readVarInt(); - int state = remap(before, user); + if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(before)) { + return; + } + int state = remap(before); if (state == before) { return; } @@ -150,7 +204,7 @@ public class PacketConsumers { BlockPos blockPos = buf.readBlockPos(buf); int state = buf.readInt(); boolean global = buf.readBoolean(); - int newState = remap(state, user); + int newState = remap(state); if (newState == state) { return; } @@ -184,7 +238,7 @@ public class PacketConsumers { if (!Reflections.clazz$BlockParticleOption.isInstance(option)) return; Object blockState = Reflections.field$BlockParticleOption$blockState.get(option); int id = BlockStateUtils.blockStateToId(blockState); - int remapped = remap(id, user); + int remapped = remap(id); if (remapped == id) return; Reflections.field$BlockParticleOption$blockState.set(option, BlockStateUtils.idToBlockState(remapped)); event.setChanged(true); @@ -526,7 +580,7 @@ public class PacketConsumers { // Falling blocks if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { int data = Reflections.field$ClientboundAddEntityPacket$data.getInt(packet); - int remapped = remap(data, user); + int remapped = remap(data); if (remapped != data) { Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); } From 6e91b3f8cf7277a570156db55ab63fb62d2cc3bb Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 17:43:39 +0800 Subject: [PATCH 21/31] =?UTF-8?q?perf(network):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8C=85=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/PacketConsumers.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) 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 index c5170df88..a055ab29e 100644 --- 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 @@ -39,6 +39,7 @@ import java.util.function.Consumer; public class PacketConsumers { private static int[] mappings; + private static int[] mappingsMOD; private static IntIdentityList BLOCK_LIST; private static IntIdentityList BIOME_LIST; @@ -51,6 +52,16 @@ public class PacketConsumers { for (Map.Entry entry : map.entrySet()) { mappings[entry.getKey()] = entry.getValue(); } + mappingsMOD = new int[registrySize]; + Arrays.fill(mappingsMOD, -1); + for (int i = 0; i < registrySize; i++) { + mappingsMOD[i] = i; + } + for (Map.Entry entry : map.entrySet()) { + if (BlockStateUtils.isVanillaBlock(entry.getKey())) { + mappingsMOD[entry.getKey()] = entry.getValue(); + } + } BLOCK_LIST = new IntIdentityList(registrySize); BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize()); } @@ -59,6 +70,10 @@ public class PacketConsumers { return mappings[stateId]; } + public static int remapMOD(int stateId) { + return mappingsMOD[stateId]; + } + public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { try { if (!user.usingClientMod()) { @@ -105,11 +120,11 @@ public class PacketConsumers { PalettedContainer container = mcSection.blockStateContainer(); Palette palette = container.data().palette(); if (palette.canRemap()) { - palette.remap(state -> BlockStateUtils.isVanillaBlock(state) ? remap(state) : state); + palette.remap(PacketConsumers::remapMOD); } else { for (int j = 0; j < 4096; j++) { int state = container.get(j); - int newState = BlockStateUtils.isVanillaBlock(state) ? remap(state) : state; + int newState = remapMOD(state); if (newState != state) { container.set(j, newState); } @@ -157,8 +172,7 @@ public class PacketConsumers { for (int i = 0; i < blocks; i++) { long k = buf.readVarLong(); positions[i] = (short) ((int) (k & 4095L)); - int stateId = (int) (k >>> 12); - states[i] = BlockStateUtils.isVanillaBlock(stateId) ? remap(stateId) : stateId; + states[i] = remapMOD((int) (k >>> 12)); } buf.clear(); buf.writeVarInt(event.packetID()); From ac4b3c70e3065e66714948fa6f67d26feaed8f2a Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 17:50:41 +0800 Subject: [PATCH 22/31] =?UTF-8?q?perf(network):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8C=85=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/PacketConsumers.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) 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 index a055ab29e..28dcf9ef2 100644 --- 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 @@ -45,19 +45,12 @@ public class PacketConsumers { 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; } + mappingsMOD = Arrays.copyOf(mappings, registrySize); for (Map.Entry entry : map.entrySet()) { mappings[entry.getKey()] = entry.getValue(); - } - mappingsMOD = new int[registrySize]; - Arrays.fill(mappingsMOD, -1); - for (int i = 0; i < registrySize; i++) { - mappingsMOD[i] = i; - } - for (Map.Entry entry : map.entrySet()) { if (BlockStateUtils.isVanillaBlock(entry.getKey())) { mappingsMOD[entry.getKey()] = entry.getValue(); } From 310d23bd1dfc2adae53e7bdd97288e117b4f58d8 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 17:54:55 +0800 Subject: [PATCH 23/31] =?UTF-8?q?refactor(client-mod):=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftEngineFabricMod/util/YamlUtils.java | 10 ---------- .../craftEngineFabricMod/CraftEngineFabricMod.java | 2 -- 2 files changed, 12 deletions(-) diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 4e133ef22..0b938535b 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -52,32 +52,24 @@ public class YamlUtils { public static Map loadMappingsAndAdditionalBlocks() throws IOException { Path mappingPath = Path.of(CONFIG_DIR + "mappings.yml"); Path additionalYamlPath = Path.of(CONFIG_DIR + "additional-real-blocks.yml"); - System.out.println("Loading mappings.yml and additional-real-blocks.yml..."); Map blockStateMappings = loadConfig(mappingPath); - System.out.println("Loaded " + blockStateMappings.size() + " block state mappings."); validateBlockStateMappings(blockStateMappings); - System.out.println("Validated block state mappings."); Map blockTypeCounter = new LinkedHashMap<>(); Map appearanceMapper = new HashMap<>(); - System.out.println("Processing block state mappings..."); for (Map.Entry entry : blockStateMappings.entrySet()) { processBlockStateMapping(entry, appearanceMapper, blockTypeCounter); } - System.out.println("Processed " + blockTypeCounter.size() + " block state mappings."); Map additionalYaml = loadConfig(additionalYamlPath); - System.out.println("Loaded " + additionalYaml.size() + " additional real blocks."); return buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); } private static void validateBlockStateMappings(Map blockStateMappings) { Map temp = new HashMap<>(blockStateMappings); - System.out.println("Validating block state mappings..."); for (Map.Entry entry : temp.entrySet()) { String state = entry.getValue(); blockStateMappings.remove(state); } - System.out.println("Validated " + blockStateMappings.size() + " block state mappings."); } private static void processBlockStateMapping( @@ -114,14 +106,12 @@ public class YamlUtils { private static LinkedHashMap buildRegisteredRealBlockSlots(Map counter, Map additionalYaml) { LinkedHashMap map = new LinkedHashMap<>(); - System.out.println("Building registered real block slots..."); for (Map.Entry entry : counter.entrySet()) { String id = entry.getKey().toString(); Integer additionalStates = additionalYaml.get(id); int internalIds = entry.getValue() + (additionalStates != null ? additionalStates : 0); map.put(entry.getKey(), internalIds); } - System.out.println("Built " + map.size() + " registered real block slots."); return map; } } diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java index 937c3116b..3fef9d282 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java @@ -33,7 +33,6 @@ public class CraftEngineFabricMod implements ModInitializer { YamlUtils.ensureConfigFile("mappings.yml"); YamlUtils.ensureConfigFile("config.yml"); Map map = YamlUtils.loadMappingsAndAdditionalBlocks(); - System.out.println("Loaded " + map.size() + " additional real blocks."); for (Map.Entry entry : map.entrySet()) { Identifier replacedBlockId = entry.getKey(); for (int i = 0; i < entry.getValue(); i++) { @@ -44,7 +43,6 @@ public class CraftEngineFabricMod implements ModInitializer { ); } } - System.out.println("Registered " + map.size() + " additional real blocks."); } catch (IOException e) { e.printStackTrace(); } From ad332d5ec973305d4c38a19db92b402bc99e69f8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 19:25:26 +0800 Subject: [PATCH 24/31] move module --- {bukkit-loader => bukkit/loader}/build.gradle.kts | 0 .../craftengine/bukkit/BukkitBootstrap.java | 0 .../src/main/resources/additional-real-blocks.yml | 0 .../loader}/src/main/resources/blockstates.yml | 0 .../loader}/src/main/resources/commands.yml | 0 .../loader}/src/main/resources/config.yml | 0 .../src/main/resources/craft-engine.properties | 0 .../src/main/resources/internal/items/_all.json | 0 .../src/main/resources/internal/items/_list.json | 0 .../main/resources/internal/models/block/_all.json | 0 .../main/resources/internal/models/block/_list.json | 0 .../resources/internal/models/item/legacy/_all.json | 0 .../internal/models/item/legacy/_list.json | 0 .../resources/internal/models/item/modern/_all.json | 0 .../internal/models/item/modern/_list.json | 0 .../loader}/src/main/resources/internal/sounds.json | 0 .../resources/internal/textures/block/_list.json | 0 .../resources/internal/textures/font/_list.json | 0 .../resources/internal/textures/item/_list.json | 0 .../loader}/src/main/resources/mappings.yml | 0 .../resources/default/configuration/blocks.yml | 0 .../resources/default/configuration/categories.yml | 0 .../resources/default/configuration/furniture.yml | 0 .../resources/default/configuration/i18n.yml | 0 .../resources/default/configuration/icons.yml | 0 .../resources/default/configuration/items.yml | 0 .../resources/default/configuration/ores.yml | 0 .../resources/default/configuration/palm_tree.yml | 0 .../resources/default/configuration/plants.yml | 0 .../resources/default/configuration/templates.yml | 0 .../src/main/resources/resources/default/pack.yml | 0 .../models/block/custom/fairy_flower_1.json | 0 .../assets/minecraft/models/block/custom/reed.json | 0 .../assets/minecraft/models/item/custom/bench.json | 0 .../minecraft/models/item/custom/table_lamp.json | 0 .../minecraft/models/item/custom/wooden_chair.json | 0 .../textures/block/custom/chinese_lantern.png | Bin .../block/custom/chinese_lantern.png.mcmeta | 0 .../textures/block/custom/chinese_lantern_top.png | Bin .../block/custom/chinese_lantern_top.png.mcmeta | 0 .../textures/block/custom/deepslate_topaz_ore.png | Bin .../block/custom/deepslate_topaz_ore.png.mcmeta | 0 .../textures/block/custom/fairy_flower_1.png | Bin .../textures/block/custom/fairy_flower_2.png | Bin .../textures/block/custom/fairy_flower_3.png | Bin .../textures/block/custom/fairy_flower_4.png | Bin .../minecraft/textures/block/custom/palm_leaves.png | Bin .../minecraft/textures/block/custom/palm_log.png | Bin .../textures/block/custom/palm_log_top.png | Bin .../minecraft/textures/block/custom/palm_planks.png | Bin .../textures/block/custom/palm_sapling.png | Bin .../assets/minecraft/textures/block/custom/reed.png | Bin .../textures/block/custom/stripped_palm_log.png | Bin .../textures/block/custom/stripped_palm_log_top.png | Bin .../minecraft/textures/block/custom/topaz_ore.png | Bin .../textures/block/custom/topaz_ore.png.mcmeta | 0 .../textures/entity/equipment/humanoid/topaz.png | Bin .../entity/equipment/humanoid_leggings/topaz.png | Bin .../assets/minecraft/textures/font/image/icons.png | Bin .../gui/sprites/tooltip/topaz_background.png | Bin .../gui/sprites/tooltip/topaz_background.png.mcmeta | 0 .../textures/gui/sprites/tooltip/topaz_frame.png | Bin .../gui/sprites/tooltip/topaz_frame.png.mcmeta | 0 .../assets/minecraft/textures/item/custom/bench.png | Bin .../minecraft/textures/item/custom/fairy_flower.png | Bin .../assets/minecraft/textures/item/custom/reed.png | Bin .../minecraft/textures/item/custom/table_lamp.png | Bin .../assets/minecraft/textures/item/custom/topaz.png | Bin .../minecraft/textures/item/custom/topaz.png.mcmeta | 0 .../minecraft/textures/item/custom/topaz_axe.png | Bin .../textures/item/custom/topaz_axe.png.mcmeta | 0 .../minecraft/textures/item/custom/topaz_boots.png | Bin .../textures/item/custom/topaz_boots.png.mcmeta | 0 .../minecraft/textures/item/custom/topaz_bow.png | Bin .../textures/item/custom/topaz_bow_pulling_0.png | Bin .../textures/item/custom/topaz_bow_pulling_1.png | Bin .../textures/item/custom/topaz_bow_pulling_2.png | Bin .../textures/item/custom/topaz_chestplate.png | Bin .../item/custom/topaz_chestplate.png.mcmeta | 0 .../textures/item/custom/topaz_crossbow.png | Bin .../textures/item/custom/topaz_crossbow_arrow.png | Bin .../item/custom/topaz_crossbow_firework.png | Bin .../item/custom/topaz_crossbow_pulling_0.png | Bin .../item/custom/topaz_crossbow_pulling_1.png | Bin .../item/custom/topaz_crossbow_pulling_2.png | Bin .../minecraft/textures/item/custom/topaz_helmet.png | Bin .../textures/item/custom/topaz_helmet.png.mcmeta | 0 .../minecraft/textures/item/custom/topaz_hoe.png | Bin .../textures/item/custom/topaz_hoe.png.mcmeta | 0 .../textures/item/custom/topaz_leggings.png | Bin .../textures/item/custom/topaz_leggings.png.mcmeta | 0 .../textures/item/custom/topaz_pickaxe.png | Bin .../textures/item/custom/topaz_pickaxe.png.mcmeta | 0 .../minecraft/textures/item/custom/topaz_rod.png | Bin .../textures/item/custom/topaz_rod_cast.png | Bin .../minecraft/textures/item/custom/topaz_shovel.png | Bin .../textures/item/custom/topaz_shovel.png.mcmeta | 0 .../minecraft/textures/item/custom/topaz_sword.png | Bin .../textures/item/custom/topaz_sword.png.mcmeta | 0 .../minecraft/textures/item/custom/wooden_chair.png | Bin .../resources/default/resourcepack/pack.mcmeta | 0 .../resources/default/resourcepack/pack.png | Bin .../resources/internal/configuration/gui.yml | 0 .../resources/internal/configuration/i18n.yml | 0 .../internal/configuration/offset_chars.yml | 0 .../src/main/resources/resources/internal/pack.yml | 0 .../models/block/default_chorus_plant.json | 0 .../minecraft/textures/font/gui/custom/blasting.png | Bin .../minecraft/textures/font/gui/custom/campfire.png | Bin .../minecraft/textures/font/gui/custom/category.png | Bin .../textures/font/gui/custom/cooking_recipe.png | Bin .../textures/font/gui/custom/crafting_recipe.png | Bin .../textures/font/gui/custom/item_browser.png | Bin .../textures/font/gui/custom/no_recipe.png | Bin .../minecraft/textures/font/gui/custom/smelting.png | Bin .../font/gui/custom/smithing_transform_recipe.png | Bin .../minecraft/textures/font/gui/custom/smoking.png | Bin .../font/gui/custom/stonecutting_recipe.png | Bin .../minecraft/textures/font/offset/space_split.png | Bin .../textures/item/custom/gui/cooking_info.png | Bin .../item/custom/gui/cooking_info.png.mcmeta | 0 .../minecraft/textures/item/custom/gui/exit.png | Bin .../minecraft/textures/item/custom/gui/get_item.png | Bin .../textures/item/custom/gui/next_page_0.png | Bin .../textures/item/custom/gui/next_page_1.png | Bin .../textures/item/custom/gui/previous_page_0.png | Bin .../textures/item/custom/gui/previous_page_1.png | Bin .../minecraft/textures/item/custom/gui/return.png | Bin .../loader}/src/main/resources/translations/en.yml | 0 .../loader}/src/main/resources/translations/es.yml | 0 .../src/main/resources/translations/zh_cn.yml | 0 .../src/main/resources/translations/zh_tw.yml | 0 gradle.properties | 3 ++- settings.gradle.kts | 4 ++-- 134 files changed, 4 insertions(+), 3 deletions(-) rename {bukkit-loader => bukkit/loader}/build.gradle.kts (100%) rename {bukkit-loader => bukkit/loader}/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/additional-real-blocks.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/blockstates.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/commands.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/config.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/craft-engine.properties (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/items/_all.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/items/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/models/block/_all.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/models/block/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/models/item/legacy/_all.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/models/item/legacy/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/models/item/modern/_all.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/models/item/modern/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/sounds.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/textures/block/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/textures/font/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/internal/textures/item/_list.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/mappings.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/blocks.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/categories.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/furniture.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/i18n.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/icons.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/items.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/ores.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/palm_tree.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/plants.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/configuration/templates.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/pack.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/reed.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/reed.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid/topaz.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid_leggings/topaz.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/reed.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/pack.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/default/resourcepack/pack.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/configuration/gui.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/configuration/i18n.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/configuration/offset_chars.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/pack.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smithing_transform_recipe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/exit.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/translations/en.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/translations/es.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/translations/zh_cn.yml (100%) rename {bukkit-loader => bukkit/loader}/src/main/resources/translations/zh_tw.yml (100%) diff --git a/bukkit-loader/build.gradle.kts b/bukkit/loader/build.gradle.kts similarity index 100% rename from bukkit-loader/build.gradle.kts rename to bukkit/loader/build.gradle.kts 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 similarity index 100% rename from bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java rename to bukkit/loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java diff --git a/bukkit-loader/src/main/resources/additional-real-blocks.yml b/bukkit/loader/src/main/resources/additional-real-blocks.yml similarity index 100% rename from bukkit-loader/src/main/resources/additional-real-blocks.yml rename to bukkit/loader/src/main/resources/additional-real-blocks.yml diff --git a/bukkit-loader/src/main/resources/blockstates.yml b/bukkit/loader/src/main/resources/blockstates.yml similarity index 100% rename from bukkit-loader/src/main/resources/blockstates.yml rename to bukkit/loader/src/main/resources/blockstates.yml diff --git a/bukkit-loader/src/main/resources/commands.yml b/bukkit/loader/src/main/resources/commands.yml similarity index 100% rename from bukkit-loader/src/main/resources/commands.yml rename to bukkit/loader/src/main/resources/commands.yml diff --git a/bukkit-loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml similarity index 100% rename from bukkit-loader/src/main/resources/config.yml rename to bukkit/loader/src/main/resources/config.yml diff --git a/bukkit-loader/src/main/resources/craft-engine.properties b/bukkit/loader/src/main/resources/craft-engine.properties similarity index 100% rename from bukkit-loader/src/main/resources/craft-engine.properties rename to bukkit/loader/src/main/resources/craft-engine.properties diff --git a/bukkit-loader/src/main/resources/internal/items/_all.json b/bukkit/loader/src/main/resources/internal/items/_all.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/items/_all.json rename to bukkit/loader/src/main/resources/internal/items/_all.json diff --git a/bukkit-loader/src/main/resources/internal/items/_list.json b/bukkit/loader/src/main/resources/internal/items/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/items/_list.json rename to bukkit/loader/src/main/resources/internal/items/_list.json diff --git a/bukkit-loader/src/main/resources/internal/models/block/_all.json b/bukkit/loader/src/main/resources/internal/models/block/_all.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/models/block/_all.json rename to bukkit/loader/src/main/resources/internal/models/block/_all.json diff --git a/bukkit-loader/src/main/resources/internal/models/block/_list.json b/bukkit/loader/src/main/resources/internal/models/block/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/models/block/_list.json rename to bukkit/loader/src/main/resources/internal/models/block/_list.json diff --git a/bukkit-loader/src/main/resources/internal/models/item/legacy/_all.json b/bukkit/loader/src/main/resources/internal/models/item/legacy/_all.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/models/item/legacy/_all.json rename to bukkit/loader/src/main/resources/internal/models/item/legacy/_all.json diff --git a/bukkit-loader/src/main/resources/internal/models/item/legacy/_list.json b/bukkit/loader/src/main/resources/internal/models/item/legacy/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/models/item/legacy/_list.json rename to bukkit/loader/src/main/resources/internal/models/item/legacy/_list.json diff --git a/bukkit-loader/src/main/resources/internal/models/item/modern/_all.json b/bukkit/loader/src/main/resources/internal/models/item/modern/_all.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/models/item/modern/_all.json rename to bukkit/loader/src/main/resources/internal/models/item/modern/_all.json diff --git a/bukkit-loader/src/main/resources/internal/models/item/modern/_list.json b/bukkit/loader/src/main/resources/internal/models/item/modern/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/models/item/modern/_list.json rename to bukkit/loader/src/main/resources/internal/models/item/modern/_list.json diff --git a/bukkit-loader/src/main/resources/internal/sounds.json b/bukkit/loader/src/main/resources/internal/sounds.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/sounds.json rename to bukkit/loader/src/main/resources/internal/sounds.json diff --git a/bukkit-loader/src/main/resources/internal/textures/block/_list.json b/bukkit/loader/src/main/resources/internal/textures/block/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/textures/block/_list.json rename to bukkit/loader/src/main/resources/internal/textures/block/_list.json diff --git a/bukkit-loader/src/main/resources/internal/textures/font/_list.json b/bukkit/loader/src/main/resources/internal/textures/font/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/textures/font/_list.json rename to bukkit/loader/src/main/resources/internal/textures/font/_list.json diff --git a/bukkit-loader/src/main/resources/internal/textures/item/_list.json b/bukkit/loader/src/main/resources/internal/textures/item/_list.json similarity index 100% rename from bukkit-loader/src/main/resources/internal/textures/item/_list.json rename to bukkit/loader/src/main/resources/internal/textures/item/_list.json diff --git a/bukkit-loader/src/main/resources/mappings.yml b/bukkit/loader/src/main/resources/mappings.yml similarity index 100% rename from bukkit-loader/src/main/resources/mappings.yml rename to bukkit/loader/src/main/resources/mappings.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/categories.yml b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/categories.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/categories.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml b/bukkit/loader/src/main/resources/resources/default/configuration/furniture.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/furniture.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/i18n.yml b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/i18n.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml b/bukkit/loader/src/main/resources/resources/default/configuration/icons.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/icons.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/icons.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/items.yml b/bukkit/loader/src/main/resources/resources/default/configuration/items.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/items.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/items.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml b/bukkit/loader/src/main/resources/resources/default/configuration/ores.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/ores.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/ores.yml 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/plants.yml b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/plants.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/plants.yml diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml b/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/configuration/templates.yml rename to bukkit/loader/src/main/resources/resources/default/configuration/templates.yml diff --git a/bukkit-loader/src/main/resources/resources/default/pack.yml b/bukkit/loader/src/main/resources/resources/default/pack.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/pack.yml rename to bukkit/loader/src/main/resources/resources/default/pack.yml 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/reed.json b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/reed.json similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/reed.json rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/reed.json 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/reed.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/reed.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/reed.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/reed.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid/topaz.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid/topaz.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid/topaz.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid/topaz.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid_leggings/topaz.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid_leggings/topaz.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid_leggings/topaz.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid_leggings/topaz.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/reed.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/reed.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/reed.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/reed.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta b/bukkit/loader/src/main/resources/resources/default/resourcepack/pack.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta rename to bukkit/loader/src/main/resources/resources/default/resourcepack/pack.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/pack.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png rename to bukkit/loader/src/main/resources/resources/default/resourcepack/pack.png diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml b/bukkit/loader/src/main/resources/resources/internal/configuration/gui.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml rename to bukkit/loader/src/main/resources/resources/internal/configuration/gui.yml diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/i18n.yml b/bukkit/loader/src/main/resources/resources/internal/configuration/i18n.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/configuration/i18n.yml rename to bukkit/loader/src/main/resources/resources/internal/configuration/i18n.yml 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml rename to bukkit/loader/src/main/resources/resources/internal/configuration/offset_chars.yml diff --git a/bukkit-loader/src/main/resources/resources/internal/pack.yml b/bukkit/loader/src/main/resources/resources/internal/pack.yml similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/pack.yml rename to bukkit/loader/src/main/resources/resources/internal/pack.yml 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smithing_transform_recipe.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smithing_transform_recipe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smithing_transform_recipe.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smithing_transform_recipe.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png 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 similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/exit.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/exit.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/exit.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/exit.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png b/bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png similarity index 100% rename from bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png rename to bukkit/loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png diff --git a/bukkit-loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml similarity index 100% rename from bukkit-loader/src/main/resources/translations/en.yml rename to bukkit/loader/src/main/resources/translations/en.yml diff --git a/bukkit-loader/src/main/resources/translations/es.yml b/bukkit/loader/src/main/resources/translations/es.yml similarity index 100% rename from bukkit-loader/src/main/resources/translations/es.yml rename to bukkit/loader/src/main/resources/translations/es.yml diff --git a/bukkit-loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml similarity index 100% rename from bukkit-loader/src/main/resources/translations/zh_cn.yml rename to bukkit/loader/src/main/resources/translations/zh_cn.yml diff --git a/bukkit-loader/src/main/resources/translations/zh_tw.yml b/bukkit/loader/src/main/resources/translations/zh_tw.yml similarity index 100% rename from bukkit-loader/src/main/resources/translations/zh_tw.yml rename to bukkit/loader/src/main/resources/translations/zh_tw.yml diff --git a/gradle.properties b/gradle.properties index 283ccaa6d..31fb8339e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,5 @@ +org.gradle.jvmargs=-Xmx1G + # Project settings # Rule: [major update].[feature update].[bug fix] project_version=0.0.37 @@ -54,7 +56,6 @@ loader_version=0.16.10 modmenu_version=13.0.3 cloth_version=17.0.144 -org.gradle.jvmargs=-Xmx1G # Proxy settings #systemProp.socks.proxyHost=127.0.0.1 #systemProp.socks.proxyPort=7890 diff --git a/settings.gradle.kts b/settings.gradle.kts index 35b81e042..e222e92cd 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,12 +4,12 @@ include(":core") include(":bukkit") include(":bukkit:legacy") include(":bukkit:compatibility") -include(":bukkit-loader") +include(":bukkit:loader") include(":server-mod") include(":client-mod") pluginManagement { plugins { - kotlin("jvm") version "2.0.20" + kotlin("jvm") version "2.1.20" } repositories { gradlePluginPortal() From a8725bb789618f5464d5c04ce751bcf150e053f4 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 19:39:22 +0800 Subject: [PATCH 25/31] rename methods --- .../plugin/network/BukkitNetworkManager.java | 7 +- .../plugin/network/PacketConsumers.java | 70 +++++++++---------- .../plugin/user/BukkitServerPlayer.java | 14 ++-- .../core/plugin/network/NetWorkUser.java | 4 +- .../core/plugin/network/NetworkManager.java | 2 + gradle.properties | 5 ++ server-mod/build.gradle.kts | 10 +-- 7 files changed, 60 insertions(+), 52 deletions(-) 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 index 139d24511..bce8d79ac 100644 --- 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 @@ -161,16 +161,17 @@ public class BukkitNetworkManager implements NetworkManager, Listener { this.onlineUsers.remove(player.getUniqueId()); } + // for mod @EventHandler public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) { - if (!event.getChannel().equals("craftengine:payload")) return; + if (!event.getChannel().equals(MOD_CHANNEL)) return; Player player = event.getPlayer(); NetWorkUser user = getUser(player); if (user == null) return; - user.setUsingClientMod(true); + user.setClientModState(true); int blockRegistrySize = RegistryUtils.currentBlockRegistrySize(); byte[] payload = ("cp:" + blockRegistrySize).getBytes(StandardCharsets.UTF_8); - player.sendPluginMessage(plugin.bootstrap(), "craftengine:payload", payload); + player.sendPluginMessage(plugin.bootstrap(), MOD_CHANNEL, payload); } @Override 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 index 28dcf9ef2..51dc3732e 100644 --- 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 @@ -69,37 +69,7 @@ public class PacketConsumers { public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { try { - if (!user.usingClientMod()) { - 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()); - } else { + if (user.clientModEnabled()) { BukkitServerPlayer player = (BukkitServerPlayer) user; Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); @@ -129,6 +99,36 @@ public class PacketConsumers { } } Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); + } else { + 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); @@ -137,7 +137,7 @@ public class PacketConsumers { public static final BiConsumer SECTION_BLOCK_UPDATE = (user, event) -> { try { - if (!user.usingClientMod()) { + if (user.clientModEnabled()) { FriendlyByteBuf buf = event.getBuffer(); long pos = buf.readLong(); int blocks = buf.readVarInt(); @@ -146,7 +146,7 @@ public class PacketConsumers { for (int i = 0; i < blocks; i++) { long k = buf.readVarLong(); positions[i] = (short) ((int) (k & 4095L)); - states[i] = remap((int) (k >>> 12)); + states[i] = remapMOD((int) (k >>> 12)); } buf.clear(); buf.writeVarInt(event.packetID()); @@ -165,7 +165,7 @@ public class PacketConsumers { for (int i = 0; i < blocks; i++) { long k = buf.readVarLong(); positions[i] = (short) ((int) (k & 4095L)); - states[i] = remapMOD((int) (k >>> 12)); + states[i] = remap((int) (k >>> 12)); } buf.clear(); buf.writeVarInt(event.packetID()); @@ -186,7 +186,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); BlockPos pos = buf.readBlockPos(buf); int before = buf.readVarInt(); - if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(before)) { + if (user.clientModEnabled() && !BlockStateUtils.isVanillaBlock(before)) { return; } int state = remap(before); 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 index 90180937c..84698bc75 100644 --- 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 @@ -63,9 +63,9 @@ public class BukkitServerPlayer extends Player { private Key lastUsedRecipe = null; - private boolean usingClientMod = false; - - private Map> furnitureView = new ConcurrentHashMap<>(); + private boolean hasClientMod = false; + // for better fake furniture visual sync + private final Map> furnitureView = new ConcurrentHashMap<>(); public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { this.channel = channel; @@ -619,11 +619,11 @@ public class BukkitServerPlayer extends Player { this.lastUsedRecipe = lastUsedRecipe; } - public boolean usingClientMod() { - return this.usingClientMod; + public boolean clientModEnabled() { + return this.hasClientMod; } - public void setUsingClientMod(boolean usingClientMod) { - this.usingClientMod = usingClientMod; + public void setClientModState(boolean enable) { + this.hasClientMod = enable; } } 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 index cb80057c8..4844ff92d 100644 --- 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 @@ -37,7 +37,7 @@ public interface NetWorkUser { Map> furnitureView(); - boolean usingClientMod(); + boolean clientModEnabled(); - void setUsingClientMod(boolean usingClientMod); + void setClientModState(boolean enable); } 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 index 2a8341e1f..4b0a0dc77 100644 --- 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 @@ -6,6 +6,8 @@ import net.momirealms.craftengine.core.entity.player.Player; import java.util.Collection; public interface NetworkManager { + String MOD_CHANNEL = "craftengine:payload"; + void setUser(Channel channel, NetWorkUser user); NetWorkUser getUser(Channel channel); diff --git a/gradle.properties b/gradle.properties index 31fb8339e..54d75bea8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,6 +49,11 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.15.11 snake_yaml_version=2.3 anti_grief_version=0.13 +# Ignite Dependencies +mixinextras_version=0.4.1 +mixin_version=0.15.2+mixin.0.8.7 +ignite_version=1.1.0 +tiny_remapper_version=0.10.4 # Fabric Dependencies fabric_version=0.119.2+1.21.4 yarn_mappings=1.21.4+build.8 diff --git a/server-mod/build.gradle.kts b/server-mod/build.gradle.kts index cb3c3b595..f407dd6fe 100644 --- a/server-mod/build.gradle.kts +++ b/server-mod/build.gradle.kts @@ -14,11 +14,11 @@ repositories { 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") + remapper("net.fabricmc:tiny-remapper:${rootProject.properties["tiny_remapper_version"]}:fat") + paperweightDevelopmentBundle("io.papermc.paper:dev-bundle:${property("latest_minecraft_version")}-R0.1-SNAPSHOT") + compileOnly("space.vectrix.ignite:ignite-api:${rootProject.properties["ignite_version"]}") + compileOnly("net.fabricmc:sponge-mixin:${rootProject.properties["mixin_version"]}") + compileOnly("io.github.llamalad7:mixinextras-common:${rootProject.properties["mixinextras_version"]}") } java { From 90279e90fdfb642dae5f802aad918526d748715e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 19:44:17 +0800 Subject: [PATCH 26/31] rename packages --- .../client/util/BlockUtils.java | 21 ---------------- .../client/CraftEngineFabricModClient.java | 24 +++++++++++++++---- .../fabric}/client/config/ModConfig.java | 2 +- .../client/config/ModMenuIntegration.java | 2 +- .../client/network/ByteArrayCodec.java | 2 +- .../client/network/CraftEnginePayload.java | 2 +- .../fabric}/CraftEngineFabricMod.java | 12 +++++----- .../fabric}/util/BlockUtils.java | 3 ++- .../fabric}/util/LoggerFilter.java | 2 +- .../fabric}/util/RegisterBlocks.java | 4 ++-- .../craftEngine/fabric}/util/YamlUtils.java | 2 +- 11 files changed, 35 insertions(+), 41 deletions(-) delete mode 100644 client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java rename client-mod/src/client/java/net/momirealms/{craftEngineFabricMod => craftengine/fabric}/client/CraftEngineFabricModClient.java (75%) rename client-mod/src/client/java/net/momirealms/{craftEngineFabricMod => craftengine/fabric}/client/config/ModConfig.java (95%) rename client-mod/src/client/java/net/momirealms/{craftEngineFabricMod => craftengine/fabric}/client/config/ModMenuIntegration.java (83%) rename client-mod/src/client/java/net/momirealms/{craftEngineFabricMod => craftengine/fabric}/client/network/ByteArrayCodec.java (89%) rename client-mod/src/client/java/net/momirealms/{craftEngineFabricMod => craftengine/fabric}/client/network/CraftEnginePayload.java (92%) rename client-mod/src/main/java/net/momirealms/{craftEngineFabricMod => craftEngine/fabric}/CraftEngineFabricMod.java (88%) rename client-mod/src/main/java/net/momirealms/{craftEngineFabricMod => craftEngine/fabric}/util/BlockUtils.java (96%) rename client-mod/src/main/java/net/momirealms/{craftEngineFabricMod => craftEngine/fabric}/util/LoggerFilter.java (93%) rename client-mod/src/main/java/net/momirealms/{craftEngineFabricMod => craftEngine/fabric}/util/RegisterBlocks.java (91%) rename client-mod/src/{client/java/net/momirealms/craftEngineFabricMod => main/java/net/momirealms/craftEngine/fabric}/util/YamlUtils.java (99%) diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java deleted file mode 100644 index ecb969783..000000000 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/util/BlockUtils.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.momirealms.craftEngineFabricMod.client.util; - -import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; -import net.minecraft.block.Block; -import net.minecraft.client.color.world.BiomeColors; -import net.minecraft.world.biome.FoliageColors; - -public class BlockUtils { - public static void registerColor(Block block) { - - ColorProviderRegistry.BLOCK.register( - (state, world, pos, tintIndex) -> { - if (world != null && pos != null) { - return BiomeColors.getFoliageColor(world, pos); - } - return FoliageColors.DEFAULT; - }, - block - ); - } -} diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java similarity index 75% rename from client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java rename to client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java index c1d5b2f92..6ea917713 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java @@ -1,19 +1,21 @@ -package net.momirealms.craftEngineFabricMod.client; +package net.momirealms.craftengine.fabric.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.minecraft.block.Block; +import net.minecraft.client.color.world.BiomeColors; import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import net.momirealms.craftEngineFabricMod.client.config.ModConfig; -import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; -import net.momirealms.craftEngineFabricMod.client.util.BlockUtils; +import net.minecraft.world.biome.FoliageColors; +import net.momirealms.craftengine.fabric.client.config.ModConfig; +import net.momirealms.craftengine.fabric.client.network.CraftEnginePayload; import java.nio.charset.StandardCharsets; @@ -28,7 +30,7 @@ public class CraftEngineFabricModClient implements ClientModInitializer { if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { BlockRenderLayerMap.INSTANCE.putBlock(block, RenderLayer.getCutoutMipped()); if (id.getPath().contains("leaves")) { - BlockUtils.registerColor(block); + registerColor(block); } } }); @@ -57,4 +59,16 @@ public class CraftEngineFabricModClient implements ClientModInitializer { }); }); } + + public static void registerColor(Block block) { + ColorProviderRegistry.BLOCK.register( + (state, world, pos, tintIndex) -> { + if (world != null && pos != null) { + return BiomeColors.getFoliageColor(world, pos); + } + return FoliageColors.DEFAULT; + }, + block + ); + } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/config/ModConfig.java similarity index 95% rename from client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java rename to client-mod/src/client/java/net/momirealms/craftengine/fabric/client/config/ModConfig.java index 3e4342517..6546896d6 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModConfig.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/config/ModConfig.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.client.config; +package net.momirealms.craftengine.fabric.client.config; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/config/ModMenuIntegration.java similarity index 83% rename from client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java rename to client-mod/src/client/java/net/momirealms/craftengine/fabric/client/config/ModMenuIntegration.java index 730b58a45..7378fe979 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/config/ModMenuIntegration.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/config/ModMenuIntegration.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.client.config; +package net.momirealms.craftengine.fabric.client.config; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/ByteArrayCodec.java similarity index 89% rename from client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java rename to client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/ByteArrayCodec.java index 28782f35d..314baa358 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/ByteArrayCodec.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/ByteArrayCodec.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.client.network; +package net.momirealms.craftengine.fabric.client.network; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java similarity index 92% rename from client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java rename to client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java index da4a971f8..b8b27ff44 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/network/CraftEnginePayload.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.client.network; +package net.momirealms.craftengine.fabric.client.network; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/CraftEngineFabricMod.java similarity index 88% rename from client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java rename to client-mod/src/main/java/net/momirealms/craftEngine/fabric/CraftEngineFabricMod.java index 3fef9d282..e47e27e11 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/CraftEngineFabricMod.java @@ -1,14 +1,14 @@ -package net.momirealms.craftEngineFabricMod; +package net.momirealms.craftEngine.fabric; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; -import net.momirealms.craftEngineFabricMod.client.config.ModConfig; -import net.momirealms.craftEngineFabricMod.util.BlockUtils; -import net.momirealms.craftEngineFabricMod.util.LoggerFilter; -import net.momirealms.craftEngineFabricMod.util.RegisterBlocks; -import net.momirealms.craftEngineFabricMod.util.YamlUtils; +import net.momirealms.craftEngine.fabric.util.BlockUtils; +import net.momirealms.craftEngine.fabric.util.LoggerFilter; +import net.momirealms.craftEngine.fabric.util.RegisterBlocks; +import net.momirealms.craftEngine.fabric.util.YamlUtils; +import net.momirealms.craftengine.fabric.client.config.ModConfig; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/BlockUtils.java similarity index 96% rename from client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java rename to client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/BlockUtils.java index 2e58963b5..d9ad1633f 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/BlockUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/BlockUtils.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.util; +package net.momirealms.craftEngine.fabric.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockState; @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; + import static java.util.Objects.requireNonNull; public class BlockUtils { diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/LoggerFilter.java similarity index 93% rename from client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java rename to client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/LoggerFilter.java index 1c6c45c00..b92c03779 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/LoggerFilter.java +++ b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/LoggerFilter.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.util; +package net.momirealms.craftEngine.fabric.util; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LogEvent; diff --git a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/RegisterBlocks.java similarity index 91% rename from client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java rename to client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/RegisterBlocks.java index 79ee25203..4c248577c 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngineFabricMod/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/RegisterBlocks.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.util; +package net.momirealms.craftEngine.fabric.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; @@ -7,7 +7,7 @@ import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; -import net.momirealms.craftEngineFabricMod.CraftEngineFabricMod; +import net.momirealms.craftEngine.fabric.CraftEngineFabricMod; import java.util.function.Function; diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/YamlUtils.java similarity index 99% rename from client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java rename to client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/YamlUtils.java index 0b938535b..3907b338d 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/YamlUtils.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngineFabricMod.util; +package net.momirealms.craftEngine.fabric.util; import com.mojang.brigadier.StringReader; import net.minecraft.block.Block; From ebeb87fcf786e74225dc795339f81935e55872eb Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 19:49:42 +0800 Subject: [PATCH 27/31] fix client mod --- .../fabric/CraftEngineFabricMod.java | 10 +++++----- .../fabric/util/BlockUtils.java | 2 +- .../fabric/util/LoggerFilter.java | 2 +- .../fabric/util/RegisterBlocks.java | 4 ++-- .../fabric/util/YamlUtils.java | 2 +- client-mod/src/main/resources/fabric.mod.json | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) rename client-mod/src/main/java/net/momirealms/{craftEngine => craftengine}/fabric/CraftEngineFabricMod.java (90%) rename client-mod/src/main/java/net/momirealms/{craftEngine => craftengine}/fabric/util/BlockUtils.java (96%) rename client-mod/src/main/java/net/momirealms/{craftEngine => craftengine}/fabric/util/LoggerFilter.java (93%) rename client-mod/src/main/java/net/momirealms/{craftEngine => craftengine}/fabric/util/RegisterBlocks.java (91%) rename client-mod/src/main/java/net/momirealms/{craftEngine => craftengine}/fabric/util/YamlUtils.java (99%) diff --git a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java similarity index 90% rename from client-mod/src/main/java/net/momirealms/craftEngine/fabric/CraftEngineFabricMod.java rename to client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java index e47e27e11..9050e2434 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java @@ -1,13 +1,13 @@ -package net.momirealms.craftEngine.fabric; +package net.momirealms.craftengine.fabric; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; -import net.momirealms.craftEngine.fabric.util.BlockUtils; -import net.momirealms.craftEngine.fabric.util.LoggerFilter; -import net.momirealms.craftEngine.fabric.util.RegisterBlocks; -import net.momirealms.craftEngine.fabric.util.YamlUtils; +import net.momirealms.craftengine.fabric.util.BlockUtils; +import net.momirealms.craftengine.fabric.util.LoggerFilter; +import net.momirealms.craftengine.fabric.util.RegisterBlocks; +import net.momirealms.craftengine.fabric.util.YamlUtils; import net.momirealms.craftengine.fabric.client.config.ModConfig; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; diff --git a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/BlockUtils.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java similarity index 96% rename from client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/BlockUtils.java rename to client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java index d9ad1633f..3dc205eae 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/BlockUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngine.fabric.util; +package net.momirealms.craftengine.fabric.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockState; diff --git a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/LoggerFilter.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/LoggerFilter.java similarity index 93% rename from client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/LoggerFilter.java rename to client-mod/src/main/java/net/momirealms/craftengine/fabric/util/LoggerFilter.java index b92c03779..2dc648a6a 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/LoggerFilter.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/LoggerFilter.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngine.fabric.util; +package net.momirealms.craftengine.fabric.util; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LogEvent; diff --git a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/RegisterBlocks.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/RegisterBlocks.java similarity index 91% rename from client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/RegisterBlocks.java rename to client-mod/src/main/java/net/momirealms/craftengine/fabric/util/RegisterBlocks.java index 4c248577c..f53152557 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/RegisterBlocks.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/RegisterBlocks.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngine.fabric.util; +package net.momirealms.craftengine.fabric.util; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; @@ -7,7 +7,7 @@ import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; -import net.momirealms.craftEngine.fabric.CraftEngineFabricMod; +import net.momirealms.craftengine.fabric.CraftEngineFabricMod; import java.util.function.Function; diff --git a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java similarity index 99% rename from client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/YamlUtils.java rename to client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java index 3907b338d..8286589b0 100644 --- a/client-mod/src/main/java/net/momirealms/craftEngine/fabric/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java @@ -1,4 +1,4 @@ -package net.momirealms.craftEngine.fabric.util; +package net.momirealms.craftengine.fabric.util; import com.mojang.brigadier.StringReader; import net.minecraft.block.Block; diff --git a/client-mod/src/main/resources/fabric.mod.json b/client-mod/src/main/resources/fabric.mod.json index 646ff1fc5..534f4f8f7 100644 --- a/client-mod/src/main/resources/fabric.mod.json +++ b/client-mod/src/main/resources/fabric.mod.json @@ -19,9 +19,9 @@ "environment": "client", "entrypoints": { - "client": ["net.momirealms.craftEngineFabricMod.client.CraftEngineFabricModClient"], - "main": ["net.momirealms.craftEngineFabricMod.CraftEngineFabricMod"], - "modmenu": ["net.momirealms.craftEngineFabricMod.client.config.ModMenuIntegration"] + "client": ["net.momirealms.craftengine.fabric.client.CraftEngineFabricModClient"], + "main": ["net.momirealms.craftengine.fabric.CraftEngineFabricMod"], + "modmenu": ["net.momirealms.craftengine.fabric.client.config.ModMenuIntegration"] }, "depends": { From 8e0adaa6e10043eb7a3ae5d6d1a6d7489d4795bb Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 22:01:09 +0800 Subject: [PATCH 28/31] improve sounds --- .../main/resources/additional-real-blocks.yml | 4 +- bukkit/loader/src/main/resources/mappings.yml | 4 + .../default/configuration/blocks.yml | 86 +++++++++++++++++- .../default/configuration/categories.yml | 1 + .../resources/default/configuration/i18n.yml | 2 + .../default/configuration/plants.yml | 4 +- .../textures/block/custom/netherite_anvil.png | Bin 0 -> 1060 bytes .../block/custom/netherite_anvil_top.png | Bin 0 -> 1079 bytes .../bukkit/api/CraftEngineBlocks.java | 4 +- .../bukkit/block/BlockEventListener.java | 8 +- .../block/behavior/FallingBlockBehavior.java | 18 ++++ .../item/behavior/BlockItemBehavior.java | 8 +- .../craftengine/bukkit/util/Reflections.java | 43 +++++++++ .../craftengine/bukkit/util/SoundUtils.java | 10 +- .../fabric/CraftEngineFabricMod.java | 2 +- .../config/additional-real-blocks.yml | 4 +- .../config/mappings.yml | 4 + .../craftengine/core/block/BlockSounds.java | 44 +++++---- .../core/block/properties/Property.java | 8 ++ .../core/pack/AbstractPackManager.java | 2 + .../craftengine/core/sound/SoundData.java | 23 +++++ .../craftengine/core/world/World.java | 5 + 22 files changed, 246 insertions(+), 38 deletions(-) create mode 100644 bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png create mode 100644 bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil_top.png create mode 100644 core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java diff --git a/bukkit/loader/src/main/resources/additional-real-blocks.yml b/bukkit/loader/src/main/resources/additional-real-blocks.yml index ec4cfa011..91993a87d 100644 --- a/bukkit/loader/src/main/resources/additional-real-blocks.yml +++ b/bukkit/loader/src/main/resources/additional-real-blocks.yml @@ -23,4 +23,6 @@ minecraft:spruce_sapling: 1 minecraft:jungle_sapling: 1 minecraft:dark_oak_sapling: 1 minecraft:acacia_sapling: 1 -minecraft:cherry_sapling: 1 \ No newline at end of file +minecraft:cherry_sapling: 1 + +minecraft:anvil: 2 \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/mappings.yml b/bukkit/loader/src/main/resources/mappings.yml index fc43ff532..b21e18b19 100644 --- a/bukkit/loader/src/main/resources/mappings.yml +++ b/bukkit/loader/src/main/resources/mappings.yml @@ -1,4 +1,8 @@ ######################################################################################################################################################################################################################## +# Anvil Block +minecraft:anvil[facing=north]: minecraft:anvil[facing=south] +minecraft:anvil[facing=east]: minecraft:anvil[facing=west] +######################################################################################################################################################################################################################## # Sapling Block minecraft:oak_sapling[stage=1]: minecraft:oak_sapling[stage=0] minecraft:birch_sapling[stage=1]: minecraft:birch_sapling[stage=0] diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml index 5475b6e3f..f1568cfb1 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml @@ -40,7 +40,77 @@ items: textures: "end": "minecraft:block/custom/chinese_lantern_top" "side": "minecraft:block/custom/chinese_lantern" - + default:netherite_anvil: + material: paper + custom-model-data: 3001 + data: + item-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/netherite_anvil" + generation: + parent: "minecraft:block/custom/netherite_anvil" + behavior: + type: block_item + block: + loot: + template: "default:loot_table/basic" + arguments: + item: default:netherite_anvil + behavior: + type: falling_block + hurt-amount: 4 + max-hurt: 80 + settings: + template: + - default:pickaxe_power/level_4 + overrides: + sounds: + break: minecraft:block.anvil.break + step: minecraft:block.anvil.step + place: minecraft:block.anvil.place + hit: minecraft:block.anvil.hit + fall: minecraft:block.anvil.fall + land: minecraft:block.anvil.land + item: default:netherite_anvil + map-color: 29 + hardness: 10.0 + resistance: 1200 + push-reaction: BLOCK + states: + properties: + facing_clockwise: + type: 4-direction + default: north + appearances: + axisX: + state: "minecraft:anvil[facing=east]" + model: + path: "minecraft:block/custom/netherite_anvil" + y: 90 + generation: + parent: "minecraft:block/anvil" + textures: + "top": "minecraft:block/custom/netherite_anvil_top" + "body": "minecraft:block/custom/netherite_anvil" + "particle": "minecraft:block/custom/netherite_anvil" + axisZ: + state: "minecraft:anvil[facing=north]" + model: + path: "minecraft:block/custom/netherite_anvil" + variants: + facing_clockwise=east: + appearance: axisX + id: 0 + facing_clockwise=west: + appearance: axisX + id: 1 + facing_clockwise=north: + appearance: axisZ + id: 2 + facing_clockwise=south: + appearance: axisZ + id: 3 recipes: default:chinese_lantern: type: shaped @@ -63,4 +133,16 @@ recipes: A: "default:reed" result: id: minecraft:paper - count: 3 \ No newline at end of file + count: 3 + default:netherite_anvil: + type: shaped + pattern: + - " B " + - "BAB" + - " B " + ingredients: + A: "minecraft:anvil" + B: "minecraft:netherite_ingot" + result: + id: default:netherite_anvil + count: 1 \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml index 4834bf38d..da8c4c458 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml @@ -56,5 +56,6 @@ categories: icon: default:chinese_lantern list: - default:chinese_lantern + - default:netherite_anvil - default:fairy_flower - default:reed \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml index 456f15b57..a4f86bb33 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml @@ -28,6 +28,7 @@ i18n: item.palm_planks: "Palm Planks" item.palm_sapling: "Palm Sapling" item.palm_leaves: "Palm Leaves" + item.netherite_anvil: "Netherite Anvil" category.default.name: "Default Assets" category.default.lore: "Contains the default configuration of CraftEngine" category.palm_tree: "Palm Tree" @@ -63,6 +64,7 @@ i18n: item.palm_planks: "棕榈木板" item.palm_sapling: "棕榈树苗" item.palm_leaves: "棕榈树叶" + item.netherite_anvil: "下界合金砧" category.default.name: "默认资产" category.default.lore: "包含了CraftEngine的默认配置" category.palm_tree: "棕榈树" diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml index 328001802..41ccd6499 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml @@ -1,7 +1,7 @@ items: default:fairy_flower: material: paper - custom-model-data: 3001 + custom-model-data: 4000 data: item-name: "" model: @@ -13,7 +13,7 @@ items: block: default:fairy_flower default:reed: material: paper - custom-model-data: 3002 + custom-model-data: 4001 data: item-name: "" model: diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png new file mode 100644 index 0000000000000000000000000000000000000000..a977ea20ff06b0fbb500ae3ee14419fdb1f99517 GIT binary patch literal 1060 zcmaJ=&rj1}7;caQAwg84Q8ZeML71+;#s+ORaIBj&&}EJpmK_YG{n#qBUui#F!3!}l z5o0{*K@#sq6a51)Atqe7$;HH<7fFmE0mFfic=79C!-KQQ*Y8K3=Xsy^{oZdelfK^4 z+}=zOM2kEmW$}E>A5BN_zbn`}il;LunMb2=5|vd45OEz&08%#9BFF+&pPN|&QGz&f z*~sNlUKtTJXws^Wp*_>aY=Vdmc($rd0YpxKqG83T?d27UH1rrX7FJlrPJogzH1B}X z`E*X3pV9=K8t5mZo`?lZfK<{mr!80XVpK&}#B2YUp~wmZO~t5vQ+XvrCZGdIf#!l5 z%kpHeK&ufo5)vYP>Q$0w`5uN1F>EBrablPk*)VzVQ8=KZPl{P7br25kVpItsTV$AW zxlETsG<1p#CkO(=@(j-hF(T;BSxEJQmfKNPkbtW>hK&qpk-nlj0cTN+!e;lgFzuSG zb9bvxat2799Hhr?8uwvjLL@E}V5Ve0P%_ekfZ^I6y_v z$w4?>Eo7zy5p+w?CiyVUab(w+Vd=2!c2^jRBFdJFR7(T06r->PZ5X=9N~sW=jPPt< zT;RAAJIF>NaY5n}A)&W7oJ>}^64Yi*V4*5kKjen$a{YcVZ5&wwj&TR*DF>QlC27&9 z?}e?acfi%_d*SMG8El5}ulBF2t{&n3@t3vU#hY690}HpjgL`}X<)!=hU7XB}kbsg3W}_Z#1m1Te{_Cl69XJsis!sfJ&$jkA}%&Hw7mO$VJ`W#Kj3}O<>Zac zr}E9@;;YHjCCpx&K6Va3rE-b1Mg1+#P#&*#?H653p0D^Wn-fK`O=SHPqs96 zXZZHR#aFvmu7y7Deta|D`DLrrc6a7h!^(%_dyS_FsH2NMN?UcAV`_!nrzc<_Q#*j+uiPSVc2m+$-Dd-LAhnM_@5 ztZ%O;2%=FLm(zGZ8GOg;@V_h6G=;Y|l*pnfm_sGa1w`C{bAVJVEf3N_GnN+KfgysZ z>ohZ2lvO809a^*&U})cRFqxAaB|+>g$UQiZqQFH62k|)saBK9A9?9 z)N(4LFBf&ephkwtAz#D-7C;*5Tl2Oj`Z4N2SH$PQ%~0e41Qlb{VNzLjl9ZqeNP*@; zI?M88zd&nIEgBZ016nW1vwR=Jh8Z>*;y5wFi)@4}FA4{AjhvX4ljU&OictlG9Fbv4 zr4n5V)6mT`oFE7c%QHM5!ibQ!WFyTF*(3MYG5h2>Ob zZLfS&_|6z#a~O_hgQ_Y(RsBEIvZ`ngrNN(k|0(QcmK?yOfd>~|9rrHR5rlF?$pspM zZU(~n%0*5VAc9^2IwT*VIgad_Hf;lzyzT>rs)~y3AjheaiC2DdRoD37R_ODh~TzGzhV|8}1QJsEZi+)z>Sq62jI2lL)D$)k7qPzG`yP99iX6}Q zpRVj&ZeAf9>ONdmT7GVP*&XQd_g**L8on)bc0XxaXS7#NJA8c4d3a`LVRZK8snzTB z$KAPCC*1GHKey4Nc5&q?sB8XpZY}!&Z5_G0y_OCA7`eZ9X)E=7^IOX-@uv0Y>0Im0 PJdQ{xiIn_oZ1%=)S>0M* literal 0 HcmV?d00001 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 index b92732599..a48dbd85c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -115,7 +115,7 @@ public final class CraftEngineBlocks { if (success) { Reflections.method$BlockStateBase$onPlace.invoke(blockState, worldServer, blockPos, oldBlockState, true); if (playSound) { - location.getWorld().playSound(location, block.sounds().placeSound().toString(), SoundCategory.BLOCKS, 1, 0.8f); + location.getWorld().playSound(location, block.sounds().placeSound().toString(), SoundCategory.BLOCKS, block.sounds().placeSound().volume(), block.sounds().placeSound().pitch()); } } } catch (ReflectiveOperationException e) { @@ -185,7 +185,7 @@ public final class CraftEngineBlocks { } } if (playSound) { - world.playBlockSound(vec3d, state.sounds().breakSound(), 1, 0.8f); + world.playBlockSound(vec3d, state.sounds().breakSound()); } if (sendParticles) { // TODO Particles 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 index b9c370a51..ec1436b9d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -121,7 +121,7 @@ public class BlockEventListener implements Listener { } // 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, 0.8f); + world.playBlockSound(vec3d, state.sounds().breakSound()); if (player.getGameMode() == GameMode.CREATIVE) { return; } @@ -226,7 +226,7 @@ public class BlockEventListener implements Listener { 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); + player.playSound(playerLocation, state.sounds().stepSound().id().toString(), SoundCategory.BLOCKS, state.sounds().stepSound().volume(), state.sounds().stepSound().pitch()); } else if (ConfigManager.enableSoundSystem()) { Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); if (manager.isBlockSoundRemoved(ownerBlock)) { @@ -268,7 +268,7 @@ public class BlockEventListener implements Listener { for (Item item : blockState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } - world.playBlockSound(vec3d, blockState.sounds().breakSound(),1f, 0.8f); + world.playBlockSound(vec3d, blockState.sounds().breakSound()); } } } @@ -300,7 +300,7 @@ public class BlockEventListener implements Listener { for (Item item : state.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } - world.playBlockSound(vec3d, state.sounds().breakSound(), 1f, 0.8f); + world.playBlockSound(vec3d, state.sounds().breakSound()); } } } 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 index fa0e9a2e6..bd316aa36 100644 --- 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 @@ -2,6 +2,7 @@ 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.LocationUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.CustomBlock; @@ -102,6 +103,23 @@ public class FallingBlockBehavior extends BlockBehavior { } } + @Override + public void onLand(Object thisBlock, Object[] args) throws Exception { + Object fallingBlock = args[4]; + Object entityData = Reflections.field$Entity$entityData.get(fallingBlock); + boolean isSilent = (boolean) Reflections.method$SynchedEntityData$get.invoke(entityData, Reflections.instance$Entity$DATA_SILENT); + if (!isSilent) { + Object blockState = args[2]; + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null || immutableBlockState.isEmpty()) return; + Object level = args[0]; + Object pos = args[1]; + net.momirealms.craftengine.core.world.World world = new BukkitWorld((World) Reflections.method$Level$getCraftWorld.invoke(level)); + world.playBlockSound(Vec3d.atCenterOf(LocationUtils.fromBlockPos(pos)), immutableBlockState.sounds().landSound()); + } + } + public static class Factory implements BlockBehaviorFactory { @Override public BlockBehavior create(CustomBlock block, Map arguments) { 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 index 1add69fe2..e83945789 100644 --- 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 @@ -24,7 +24,11 @@ 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.world.BlockPos; -import org.bukkit.*; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.Bukkit; +import org.bukkit.GameEvent; +import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.data.BlockData; @@ -120,7 +124,7 @@ public class BlockItemBehavior extends ItemBehavior { } player.swingHand(placeContext.getHand()); - world.playSound(new Location(world, pos.x(), pos.y(), pos.z()), blockStateToPlace.sounds().placeSound().toString(), SoundCategory.BLOCKS, 1f, 0.8f); + placeContext.getLevel().playBlockSound(new Vec3d(pos.x() + 0.5, pos.y() + 0.5, pos.z() + 0.5), blockStateToPlace.sounds().placeSound()); world.sendGameEvent(bukkitPlayer, GameEvent.BLOCK_PLACE, new Vector(pos.x(), pos.y(), pos.z())); return InteractionResult.SUCCESS; } 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 index 95eb2c69c..ac175461c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -707,6 +707,19 @@ public class Reflections { ) ); + public static final Class clazz$SynchedEntityData = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.SynchedEntityData"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcher") + ) + ); + + public static final Method method$SynchedEntityData$get = requireNonNull( + ReflectionUtils.getMethod( + clazz$SynchedEntityData, Object.class, clazz$EntityDataAccessor + ) + ); + public static final Class clazz$SynchedEntityData$DataValue = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleMCClass("network.syncher.SynchedEntityData$DataValue"), @@ -5428,4 +5441,34 @@ public class Reflections { clazz$LinearPalette, Object.class.arrayType(), 0 ) ); + + public static final Object instance$Entity$DATA_SILENT; + + static { + int i = 0; + Field targetField = null; + for (Field field : clazz$Entity.getDeclaredFields()) { + Type fieldType = field.getGenericType(); + if (field.getType() == clazz$EntityDataAccessor && fieldType instanceof ParameterizedType paramType) { + if (paramType.getActualTypeArguments()[0] == Boolean.class) { + i++; + if (i == 2) { + targetField = field; + break; + } + } + } + } + try { + instance$Entity$DATA_SILENT = ReflectionUtils.setAccessible(requireNonNull(targetField)).get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Field field$Entity$entityData = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Entity, clazz$SynchedEntityData, 0 + ) + ); } 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 index b5fca65a4..25d00d02e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java @@ -10,11 +10,11 @@ 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()) + getOrRegisterSoundEvent(sounds.breakSound().id()), + getOrRegisterSoundEvent(sounds.stepSound().id()), + getOrRegisterSoundEvent(sounds.placeSound().id()), + getOrRegisterSoundEvent(sounds.hitSound().id()), + getOrRegisterSoundEvent(sounds.fallSound().id()) ); } diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java index 9050e2434..d73898587 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java @@ -4,11 +4,11 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; +import net.momirealms.craftengine.fabric.client.config.ModConfig; import net.momirealms.craftengine.fabric.util.BlockUtils; import net.momirealms.craftengine.fabric.util.LoggerFilter; import net.momirealms.craftengine.fabric.util.RegisterBlocks; import net.momirealms.craftengine.fabric.util.YamlUtils; -import net.momirealms.craftengine.fabric.client.config.ModConfig; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml index ec4cfa011..91993a87d 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/additional-real-blocks.yml @@ -23,4 +23,6 @@ minecraft:spruce_sapling: 1 minecraft:jungle_sapling: 1 minecraft:dark_oak_sapling: 1 minecraft:acacia_sapling: 1 -minecraft:cherry_sapling: 1 \ No newline at end of file +minecraft:cherry_sapling: 1 + +minecraft:anvil: 2 \ No newline at end of file diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/mappings.yml b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/mappings.yml index fc43ff532..b21e18b19 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/mappings.yml +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/config/mappings.yml @@ -1,4 +1,8 @@ ######################################################################################################################################################################################################################## +# Anvil Block +minecraft:anvil[facing=north]: minecraft:anvil[facing=south] +minecraft:anvil[facing=east]: minecraft:anvil[facing=west] +######################################################################################################################################################################################################################## # Sapling Block minecraft:oak_sapling[stage=1]: minecraft:oak_sapling[stage=0] minecraft:birch_sapling[stage=1]: minecraft:birch_sapling[stage=0] 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 index bc6e95247..1dc49796f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.block; +import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.Key; import java.util.Map; @@ -12,51 +13,58 @@ public class BlockSounds { Hit 0.5 0.5 Break 1 0.8 */ - 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); + public static final SoundData EMPTY_SOUND = new SoundData(Key.of("minecraft:intentionally_empty"), 1, 1); + public static final BlockSounds EMPTY = new BlockSounds(EMPTY_SOUND, 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; + private final SoundData breakSound; + private final SoundData stepSound; + private final SoundData placeSound; + private final SoundData hitSound; + private final SoundData fallSound; + private final SoundData landSound; - public BlockSounds(Key breakSound, Key stepSound, Key placeSound, Key hitSound, Key fallSound) { + public BlockSounds(SoundData breakSound, SoundData stepSound, SoundData placeSound, SoundData hitSound, SoundData fallSound, SoundData landSound) { this.breakSound = breakSound; this.stepSound = stepSound; this.placeSound = placeSound; this.hitSound = hitSound; this.fallSound = fallSound; + this.landSound = landSound; } 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()) + SoundData.create(map.getOrDefault("break", "minecraft:intentionally_empty"), 1f, 0.8f), + SoundData.create(map.getOrDefault("step", "minecraft:intentionally_empty"), 0.15f, 1f), + SoundData.create(map.getOrDefault("place", "minecraft:intentionally_empty"), 0f, 0.8f), // todo 0? + SoundData.create(map.getOrDefault("hit", "minecraft:intentionally_empty"), 0.5f, 0.5f), + SoundData.create(map.getOrDefault("fall", "minecraft:intentionally_empty"), 0.5f, 0.75f), + SoundData.create(map.getOrDefault("land", "minecraft:intentionally_empty"), 0.3f, 1f) ); } - public Key breakSound() { + public SoundData breakSound() { return breakSound; } - public Key stepSound() { + public SoundData stepSound() { return stepSound; } - public Key placeSound() { + public SoundData placeSound() { return placeSound; } - public Key hitSound() { + public SoundData hitSound() { return hitSound; } - public Key fallSound() { + public SoundData landSound() { + return landSound; + } + + public SoundData fallSound() { return fallSound; } } 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 index 78391ee8c..83b45f7fb 100644 --- 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 @@ -35,6 +35,14 @@ public abstract class Property> { throw new IllegalArgumentException("Unsupported property type used in hard-coded `facing` property: " + property.valueClass()); } })); + HARD_CODED_PLACEMENTS.put("facing_clockwise", (property -> { + if (property.valueClass() == HorizontalDirection.class) { + Property directionProperty = (Property) property; + return (context, state) -> state.with(directionProperty, context.getHorizontalDirection().clockWise().toHorizontalDirection()); + } else { + throw new IllegalArgumentException("Unsupported property type used in hard-coded `facing_clockwise` property: " + property.valueClass()); + } + })); HARD_CODED_PLACEMENTS.put("waterlogged", (property -> { Property waterloggedProperty = (Property) property; return (context, state) -> state.with(waterloggedProperty, context.isWaterSource()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 081653629..b40ec0909 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -282,6 +282,8 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil_top.png"); // items plugin.saveResource("resources/default/configuration/items.yml"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java new file mode 100644 index 000000000..5cdd8d198 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundData.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.sound; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public record SoundData(Key id, float volume, float pitch) { + + public static SoundData create(Object obj, float volume, float pitch) { + if (obj instanceof String key) { + return new SoundData(Key.of(key), volume, pitch); + } else if (obj instanceof Map map) { + Map data = MiscUtils.castToMap(map, false); + Key id = Key.of((String) data.get("id")); + float volumeFloat = MiscUtils.getAsFloat(data.getOrDefault("volume", volume)); + float pitchFloat = MiscUtils.getAsFloat(data.getOrDefault("pitch", pitch)); + return new SoundData(id, volumeFloat, pitchFloat); + } else { + throw new IllegalArgumentException("Illegal object type for sound data: " + obj.getClass()); + } + } +} 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 index 3b1cc134e..36979368c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/World.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/World.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.world; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.Key; import java.nio.file.Path; @@ -31,4 +32,8 @@ public interface World { void dropExp(Vec3d location, int amount); void playBlockSound(Vec3d location, Key sound, float volume, float pitch); + + default void playBlockSound(Vec3d location, SoundData data) { + playBlockSound(location, data.id(), data.volume(), data.pitch()); + } } From 769f9fbb07f30aee0dc75a76be53815f4c11e967 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 22:01:57 +0800 Subject: [PATCH 29/31] Update gradle.properties --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 54d75bea8..3375f61ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.37 -config_version=15 +project_version=0.0.38 +config_version=16 lang_version=3 project_group=net.momirealms latest_minecraft_version=1.21.4 From 53c85298b231527ca551598b3be440bdaad07fe8 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 22:30:20 +0800 Subject: [PATCH 30/31] add options for filters --- bukkit/loader/src/main/resources/config.yml | 15 ++++++--- .../bukkit/font/BukkitImageManager.java | 25 ++++++++++---- .../plugin/network/PacketConsumers.java | 15 +++++++++ .../craftengine/core/font/ImageManager.java | 5 +++ .../core/plugin/config/ConfigManager.java | 33 +++++++++++++++++++ 5 files changed, 82 insertions(+), 11 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 0546ca672..e4aa5638c 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -13,12 +13,10 @@ resource-pack: # Should those images in minecraft:default font also work in minecraft:uniform override-uniform-font: true # Generate assets for CraftEngine fabric mod - # Note: CraftEngine fabric mod is used for Axiom mod, most users do not need to install it + # Note: fabric mod is used for clientside Axiom/WorldEdit mod generate-mod-assets: false # Resource pack protection protection: - # Warning: Do not attempt to unzip the resource pack with crash tools enabled. - # Warning: Do not attempt to unzip the resource pack with crash tools enabled. # Warning: Do not attempt to unzip the resource pack with crash tools enabled. # You can enable all the methods at the same time. crash-tools: @@ -55,7 +53,6 @@ resource-pack: bypass-models: [] bypass-sounds: [] bypass-equipments: [] - supported-version: min: "1.20" max: LATEST @@ -140,6 +137,16 @@ furniture: list: - "xxx:invalid_furniture" +image: + # Prevent players from using images set in minecraft:default font + # Players with `craftengine.filter.bypass.xxx` would ignore the limitation + illegal-characters-filter: + anvil: true + book: true + chat: true + command: true + sign: true + recipe: enable: true diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitImageManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitImageManager.java index b636ef95c..6dcd6e430 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitImageManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitImageManager.java @@ -5,8 +5,11 @@ import io.papermc.paper.event.player.AsyncChatDecorateEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.font.AbstractImageManager; +import net.momirealms.craftengine.core.font.ImageManager; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.util.CharacterUtils; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; @@ -45,27 +48,35 @@ public class BukkitImageManager extends AbstractImageManager implements Listener @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @SuppressWarnings("UnstableApiUsage") public void onChat(AsyncChatDecorateEvent event) { - if (event.player() == null) return; - if (!this.isDefaultFontInUse()) return; - this.processChatMessages(event); + if (!ConfigManager.filterChat()) return; + this.processChatEvent(event); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @SuppressWarnings("UnstableApiUsage") public void onChatCommand(AsyncChatCommandDecorateEvent event) { - if (event.player() == null) return; - if (!this.isDefaultFontInUse()) return; - this.processChatMessages(event); + if (!ConfigManager.filterChat()) return; + this.processChatEvent(event); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onCommand(PlayerCommandPreprocessEvent event) { + if (!ConfigManager.filterCommand()) return; if (!this.isDefaultFontInUse()) return; + if (event.getPlayer().hasPermission(ImageManager.BYPASS_COMMAND)) { + return; + } runIfContainsIllegalCharacter(event.getMessage(), event::setMessage); } @SuppressWarnings("UnstableApiUsage") - private void processChatMessages(AsyncChatDecorateEvent event) { + private void processChatEvent(AsyncChatDecorateEvent event) { + Player player = event.player(); + if (player == null) return; + if (!this.isDefaultFontInUse()) return; + if (player.hasPermission(ImageManager.BYPASS_CHAT)) { + return; + } try { Object originalMessage = Reflections.field$AsyncChatDecorateEvent$originalMessage.get(event); String jsonMessage = (String) Reflections.method$ComponentSerializer$serialize.invoke(serializer, originalMessage); 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 index 51dc3732e..8e315fc3a 100644 --- 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 @@ -730,10 +730,15 @@ public class PacketConsumers { // we handle it on packet level to prevent it from being captured by plugins public static final TriConsumer RENAME_ITEM = (user, event, packet) -> { try { + if (!ConfigManager.filterAnvil()) return; String message = (String) Reflections.field$ServerboundRenameItemPacket$name.get(packet); if (message != null && !message.isEmpty()) { ImageManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; + // check bypass + if (((BukkitServerPlayer) user).hasPermission(ImageManager.BYPASS_ANVIL)) { + return; + } runIfContainsIllegalCharacter(message, manager, (s) -> { try { Reflections.field$ServerboundRenameItemPacket$name.set(packet, s); @@ -750,9 +755,14 @@ public class PacketConsumers { // we handle it on packet level to prevent it from being captured by plugins public static final TriConsumer SIGN_UPDATE = (user, event, packet) -> { try { + if (!ConfigManager.filterSign()) return; String[] lines = (String[]) Reflections.field$ServerboundSignUpdatePacket$lines.get(packet); ImageManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; + // check bypass + if (((BukkitServerPlayer) user).hasPermission(ImageManager.BYPASS_SIGN)) { + return; + } for (int i = 0; i < lines.length; i++) { String line = lines[i]; if (line != null && !line.isEmpty()) { @@ -772,8 +782,13 @@ public class PacketConsumers { @SuppressWarnings("unchecked") public static final TriConsumer EDIT_BOOK = (user, event, packet) -> { try { + if (!ConfigManager.filterBook()) return; ImageManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; + // check bypass + if (((BukkitServerPlayer) user).hasPermission(ImageManager.BYPASS_BOOK)) { + return; + } boolean changed = false; diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java index 7c38e8643..eb2b5ab6d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java @@ -14,6 +14,11 @@ import java.util.function.BiFunction; public interface ImageManager extends Reloadable, ConfigSectionParser { String CONFIG_SECTION_NAME = "images"; Key DEFAULT_FONT = Key.of("minecraft:default"); + String BYPASS_BOOK = "craftengine.filter.bypass.book"; + String BYPASS_SIGN = "craftengine.filter.bypass.sign"; + String BYPASS_CHAT = "craftengine.filter.bypass.chat"; + String BYPASS_COMMAND = "craftengine.filter.bypass.command"; + String BYPASS_ANVIL = "craftengine.filter.bypass.anvil"; default String sectionId() { return CONFIG_SECTION_NAME; 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 index 64d50a78a..746769d83 100644 --- 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 @@ -105,6 +105,12 @@ public class ConfigManager implements Reloadable { protected boolean item$non_italic_tag; + protected boolean image$illegal_characters_filter$command; + protected boolean image$illegal_characters_filter$chat; + protected boolean image$illegal_characters_filter$anvil; + protected boolean image$illegal_characters_filter$sign; + protected boolean image$illegal_characters_filter$book; + public ConfigManager(CraftEngine plugin) { this.plugin = plugin; this.configVersion = PluginProperties.getValue("config"); @@ -249,6 +255,13 @@ public class ConfigManager implements Reloadable { // recipe recipe$enable = config.getBoolean("recipe.enable", true); + // image + image$illegal_characters_filter$anvil = config.getBoolean("image.illegal-characters-filter.anvil", true); + image$illegal_characters_filter$book = config.getBoolean("image.illegal-characters-filter.book", true); + image$illegal_characters_filter$chat = config.getBoolean("image.illegal-characters-filter.chat", true); + image$illegal_characters_filter$command = config.getBoolean("image.illegal-characters-filter.command", true); + image$illegal_characters_filter$sign = config.getBoolean("image.illegal-characters-filter.sign", true); + Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { Method setMaxChainMethod = ReflectionUtils.getStaticMethod(modClazz, void.class, new String[] {"setMaxChainUpdate"}, int.class); @@ -500,6 +513,26 @@ public class ConfigManager implements Reloadable { return instance.resource_pack$generate_mod_assets; } + public static boolean filterChat() { + return instance().image$illegal_characters_filter$chat; + } + + public static boolean filterAnvil() { + return instance().image$illegal_characters_filter$anvil; + } + + public static boolean filterCommand() { + return instance().image$illegal_characters_filter$command; + } + + public static boolean filterBook() { + return instance().image$illegal_characters_filter$book; + } + + public static boolean filterSign() { + return instance().image$illegal_characters_filter$sign; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) { From 2aad938393ff14b5106321b0f56c83e2d9eebf1d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 23:41:01 +0800 Subject: [PATCH 31/31] improve mod --- .../textures/block/custom/netherite_anvil.png | Bin 1060 -> 404 bytes .../plugin/network/BukkitNetworkManager.java | 1 + client-mod/build.gradle.kts | 1 + .../client/CraftEngineFabricModClient.java | 26 +++++++-------- .../fabric/CraftEngineFabricMod.java | 12 +++---- .../fabric/util/StringKeyConstructor.java | 31 ++++++++++++++++++ .../craftengine/fabric/util/YamlUtils.java | 24 +++++++------- .../craft-engine-fabric-mod/lang/en_us.json | 4 +-- .../craft-engine-fabric-mod/lang/zh_cn.json | 4 +-- 9 files changed, 66 insertions(+), 37 deletions(-) create mode 100644 client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png index a977ea20ff06b0fbb500ae3ee14419fdb1f99517..0838fe2cc0208f94720d0b88c35f023171f6e2d7 100644 GIT binary patch delta 388 zcmV-~0ek+W2$Tbm8Gix*005AYXf^-<00DDSM?wIu&K&6g00B-(L_t(Ija^d9Zo?oD z92`errx>_2iX!DBa_;|sL#5s-S*>%y7}+LDQunX~)2=Lx#Oyp4*xUIGKq~`)i5h@3 z5&!^i{Sqbsy|Y@G-dO-8p_!;{*PdSY*dW#evXLH;jU+A&^ncD4L=Y(lj|buhM70f= zsAVHbKPoI?GW#Qu#mb~?*8;~SOj?;TSzp5BiIv)(BEzNA%E(5dk)I#$l=S>P3;mB}`}L<$V?a?l)Rlxs{FNoCDyT7hC?g&c!%~#FTG(XOom4{BY@P*RGa&XOmaT zN5TBy$#A->*g#JsLGxKBXq*!L#`$Yk3EBgeuJRvrRiMc}k8Iwb1hvBY_!8^$cqL9& i|0tv$LgaaJDAh0ITG88|*>RWv0000A5BN_zbn`}il;LunMb2=5|vd45OEz&08%#9BFF+&pPN|&QGz&f z*~sNlUKtTJXws^Wp*_>aY=Vdmc($rd0YpxKqG83T?d27UH1rrX7FJlrPJogzH1B}X z`E*X3pV9=K8t5mZo`?lZfK<{mr!80XVpK&}#B2YUp~wmZO~t5vQ+XvrCZGdIf#!l5 z%kpHeK&ufo5)vYP>Q$0w`5uN1F>EBrablPk*)VzVQ8=KZPl{P7br25kVpItsTV$AW zxlETsG<1p#CkO(=@(j-hF(T;BSxEJQmfKNPkbtW>hK&qpk-nlj0cTN+!e;lgFzuSG zb9bvxat2799Hhr?8uwvjLL@E}V5Ve0P%_ekfZ^I6y_v z$w4?>Eo7zy5p+w?CiyVUab(w+Vd=2!c2^jRBFdJFR7(T06r->PZ5X=9N~sW=jPPt< zT;RAAJIF>NaY5n}A)&W7oJ>}^64Yi*V4*5kKjen$a{YcVZ5&wwj&TR*DF>QlC27&9 z?}e?acfi%_d*SMG8El5}ulBF2t{&n3@t3vU#hY690}HpjgL`}X<)!=hU7XB}kbsg3W}_Z#1m1Te{_Cl69XJsis!sfJ&$jkA}%&Hw7mO$VJ`W#Kj3}O<>Zac zr}E9@;;YHjCCpx&K6Va3rE-b1Mg1+#P#&*#?H653p0D^Wn-fK`O=SHPqs96 zXZZHR#aFvmu7y7Deta|D`DLrrc6a7h!^(%_dyS_Fs { - try { - byte[] data = payload.data(); - String decoded = new String(data, StandardCharsets.UTF_8); - if (decoded.startsWith("cp:")) { - int blockRegistrySize = Integer.parseInt(decoded.substring(3)); - if (Block.STATE_IDS.size() != blockRegistrySize) { - client.disconnect(new DisconnectedScreen( - client.currentScreen, - Text.translatable("disconnect.craftengine.title"), - Text.translatable("disconnect.craftengine.block_registry_mismatch")) - ); - } + byte[] data = payload.data(); + String decoded = new String(data, StandardCharsets.UTF_8); + if (decoded.startsWith("cp:")) { + int blockRegistrySize = Integer.parseInt(decoded.substring(3)); + if (Block.STATE_IDS.size() != blockRegistrySize) { + client.disconnect(new DisconnectedScreen( + client.currentScreen, + Text.translatable("disconnect.craftengine.title"), + Text.translatable("disconnect.craftengine.block_registry_mismatch", Block.STATE_IDS.size(), blockRegistrySize)) + ); } - } catch (Exception e) { - e.printStackTrace(); } }); }); diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java index d73898587..1b599bc5d 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java @@ -26,12 +26,10 @@ public class CraftEngineFabricMod implements ModInitializer { @Override public void onInitialize() { loadConfig(); - Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); LoggerFilter.filter(); try { - YamlUtils.ensureConfigFile("additional-real-blocks.yml"); - YamlUtils.ensureConfigFile("mappings.yml"); - YamlUtils.ensureConfigFile("config.yml"); + YamlUtils.saveDefaultResource("additional-real-blocks.yml"); + YamlUtils.saveDefaultResource("mappings.yml"); Map map = YamlUtils.loadMappingsAndAdditionalBlocks(); for (Map.Entry entry : map.entrySet()) { Identifier replacedBlockId = entry.getKey(); @@ -46,15 +44,15 @@ public class CraftEngineFabricMod implements ModInitializer { } catch (IOException e) { e.printStackTrace(); } + Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); } @SuppressWarnings("unchecked") private void loadConfig() { if (!Files.exists(CONFIG_PATH)) { - saveConfig(); + ModConfig.enableNetwork = true; return; } - try (InputStream inputStream = Files.newInputStream(CONFIG_PATH)) { Yaml yaml = new Yaml(); var config = yaml.loadAs(inputStream, java.util.Map.class); @@ -68,10 +66,8 @@ public class CraftEngineFabricMod implements ModInitializer { DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); Yaml yaml = new Yaml(options); - var data = new java.util.HashMap(); data.put("enable-network", ModConfig.enableNetwork); - try (Writer writer = Files.newBufferedWriter(CONFIG_PATH)) { yaml.dump(data, writer); } catch (IOException e) { diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java new file mode 100644 index 000000000..2b0496bdd --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.fabric.util; + +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/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java index 8286589b0..e10175ced 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java @@ -9,8 +9,10 @@ import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.Identifier; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -21,23 +23,25 @@ import java.util.LinkedHashMap; import java.util.Map; public class YamlUtils { - public static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; - private static final Yaml yaml = new Yaml(); + public static final Path CONFIG_DIR = Path.of("config/craft-engine-fabric-mod/"); private static final RegistryWrapper registryWrapper = BuiltinRegistries.createWrapperLookup().getOrThrow(RegistryKeys.BLOCK); public static T loadConfig(Path filePath) throws IOException { + if (!Files.exists(filePath)) { + throw new FileNotFoundException(filePath.toString()); + } try (InputStream inputStream = Files.newInputStream(filePath)) { + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions())); return yaml.load(inputStream); } } - public static void ensureConfigFile(String fileName) throws IOException { - Path configDir = Path.of(CONFIG_DIR); - if (!Files.exists(configDir)) { - Files.createDirectories(configDir); + public static void saveDefaultResource(String fileName) throws IOException { + if (!Files.exists(CONFIG_DIR)) { + Files.createDirectories(CONFIG_DIR); } - Path targetPath = configDir.resolve(fileName); + Path targetPath = CONFIG_DIR.resolve(fileName); if (Files.exists(targetPath)) return; String resourcePath = "assets/craft-engine-fabric-mod/config/" + fileName; try (InputStream inputStream = YamlUtils.class.getClassLoader().getResourceAsStream(resourcePath)) { @@ -48,10 +52,9 @@ public class YamlUtils { } } - public static Map loadMappingsAndAdditionalBlocks() throws IOException { - Path mappingPath = Path.of(CONFIG_DIR + "mappings.yml"); - Path additionalYamlPath = Path.of(CONFIG_DIR + "additional-real-blocks.yml"); + Path mappingPath = CONFIG_DIR.resolve("mappings.yml"); + Path additionalYamlPath = CONFIG_DIR.resolve("additional-real-blocks.yml"); Map blockStateMappings = loadConfig(mappingPath); validateBlockStateMappings(blockStateMappings); Map blockTypeCounter = new LinkedHashMap<>(); @@ -63,7 +66,6 @@ public class YamlUtils { return buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); } - private static void validateBlockStateMappings(Map blockStateMappings) { Map temp = new HashMap<>(blockStateMappings); for (Map.Entry entry : temp.entrySet()) { diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json index 4828e8338..56313e2df 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json @@ -2,7 +2,7 @@ "title.craftengine.config": "CraftEngine Settings", "category.craftengine.general": "General", "option.craftengine.enable_network": "Enable custom blocks in server", - "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect", - "disconnect.craftengine.block_registry_mismatch": "Block registry size mismatch!", + "tooltip.craftengine.enable_network": "Changes requires re-entering the server to take effect", + "disconnect.craftengine.block_registry_mismatch": "Block registry size mismatch. Current: %s. Expected: %s. \n 1. Make sure that the configs are the same as the server's. \n 2. Do not use any mod that might register new block. \n 3. Do not install ViaVersion.", "disconnect.craftengine.title": "CraftEngine Connection Error" } \ No newline at end of file diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json index ef1c36b89..4dd4bbc4e 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json @@ -2,7 +2,7 @@ "title.craftengine.config": "CraftEngine设置", "category.craftengine.general": "通用", "option.craftengine.enable_network": "启用服务器内自定义方块", - "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效", - "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配!", + "tooltip.craftengine.enable_network": "需要重新进入服务器以应用更改", + "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配. 当前: %s. 预期: %s \n 1. 确保客户端mod配置与服务端配置一致. \n 2. 不要安装任何会注册新方块的mod. \n 3. 不要使用ViaVersion.", "disconnect.craftengine.title": "CraftEngine连接错误" } \ No newline at end of file